From aad2ddf69a7dc73171192fdc3819d28171b46b45 Mon Sep 17 00:00:00 2001 From: Eric Mandel Date: Fri, 21 Feb 2020 11:27:41 -0500 Subject: [PATCH] statusbar plugin: first commit --- Makefile.in | 3 +- js9-allinone.css | 28 ++ js9-allinone.js | 720 +++++++++++++++++++++++-------------- js9.js | 53 ++- js9.min.js | 544 ++++++++++++++-------------- js9plugins.js | 176 +++++++++ js9support.css | 28 ++ js9support.txt | 4 +- plugins/core/statusbar.css | 28 ++ plugins/core/statusbar.js | 176 +++++++++ 10 files changed, 1212 insertions(+), 548 deletions(-) create mode 100644 plugins/core/statusbar.css create mode 100644 plugins/core/statusbar.js diff --git a/Makefile.in b/Makefile.in index c295d5f9..07f76b23 100644 --- a/Makefile.in +++ b/Makefile.in @@ -161,7 +161,7 @@ PLCSSFILES = plugins/core/blend.css plugins/core/blink.css \ plugins/core/imarith.css plugins/core/keyboard.css \ plugins/core/layers.css plugins/core/mef.css \ plugins/core/mousetouch.css plugins/core/panzoom.css \ - plugins/core/scalelimits.css \ + plugins/core/scalelimits.css plugins/core/statusbar.css \ plugins/core/separate.css plugins/core/toolbar.css JSFILES = js/winmod.js js/jquery.min.js js/jquery-ui.min.js js/jquery.contextMenu.min.js js/jquery.flot.min.js js/jquery.flot.errorbars.min.js js/jquery.flot.navigate.min.js js/jquery.flot.resize.min.js js/jquery.flot.selection.min.js js/flot-zoom.min.js js/sprintf.min.js js/dhtmlwindow.min.js js/dhtmlwindow_blurb.js js/fabric.min.js js/pako_inflate.min.js js/FileSaver.min.js js/canvas-toBlob.js js/tabcontent.js js/arrive.min.js js/jquery.doubletap.min.js js/jquery.flot.axislabels.js js/spin.js js/ElementQueries.js js/ResizeSensor.js js/gaussblur.js js/imagefilters.js js/jquery.ui.touch-punch.js js/js9inline.js js/spectrum.min.js js/tinycolor.min.js @@ -192,6 +192,7 @@ PLUGINFILES = plugins/archive/archive.js \ plugins/core/prefs.js \ plugins/core/scalelimits.js \ plugins/core/separate.js \ + plugins/core/statusbar.js \ plugins/core/sync.js \ plugins/core/toolbar.js \ plugins/imexam/imexam.js \ diff --git a/js9-allinone.css b/js9-allinone.css index 60d7b384..f2966b37 100644 --- a/js9-allinone.css +++ b/js9-allinone.css @@ -1641,6 +1641,34 @@ div.JS9MouseTouchHeader, div.JS9MouseTouchFooter { .JS9ScalePlot { border: 1px black solid; } +.JS9StatusbarContainer { + background-color: #D5D5D5; + padding-left: 10px; + height: 100%; + font: normal 12px Arial; +} + +.JS9StatusbarItemContainer { + display:inline-block; + vertical-align:middle; + text-align:center; + white-space:nowrap; + background-color: #D0D0D0; + color: black; + margin-top: 5px; + padding-top: 0px; + padding-bottom: 0px; + padding-right: 2px; + padding-left: 2px; +} + +.JS9StatusbarItemNoHighlight { + border: 1px solid #D0D0D0; +} + +.JS9StatusbarItemHighlight { + border: 1px solid #B5B5B5; +} div.JS9SeparateContainer { padding: 2px; } diff --git a/js9-allinone.js b/js9-allinone.js index b5aa927a..01521c38 100644 --- a/js9-allinone.js +++ b/js9-allinone.js @@ -4447,221 +4447,223 @@ maxMemory:2E9,corsURL:"params/loadcors.html",proxyURL:"params/loadproxy.html",lo color:"green"},imexamLineHeight:1,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:"pan to mouse position","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", x:"flip image around x axis",y:"flip image around y axis",9:"rotate image by 90 degrees","/":"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, -metaClickPan:!0,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:"$data.ra $data.dec"},topColormaps:"grey heat cool turbo 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",menuPosition:"right-5 bottom-5",menuClickEvent:"mouseup",menuSelected:"check",userMenus:!1,userMenuDivider:"   ",imagesFileSubmenu:5,toolBar:"annulus box circle ellipse line polygon text linear log zoom+ zoom- zoom1".split(" "), -syncOps:"colormap contrastbias flip pan regions rot90 scale wcs zoom".split(" "),syncReciprocate:!0,syncWCS:!0,hiddenPluginDivs:[],separate:{layout:"auto",leftMargin:10,topMargin:10},imageTemplates:".fits,.fts,.png,.jpg,.jpeg,.fz,.ftz",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",localTemplates:".fits,.fts", -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,flip:"none",rot90:0,zscalecontrast:.25,zscalesamples:600,zscaleline:120,wcssys:"native",lcs:"physical",valpos:!0,sigma:"none",opacity:1,alpha:255,nancolor:"#000000",nocolor:{red:0,green:0,blue:0,alpha:0}, -zoom:1,zooms:6,topZooms:2,wcsalign:!0,rotationMode:"relative",crosshair:!1,disable:[],ltvbug:!1,listonchange:!1,whichonchange:"selected"};a.regionOpts={};a.catalogOpts={};a.crosshairOpts={};a.gridOpts={};a.emscriptenOpts={};a.blendOpts={active:!0,mode:"screen",opacity:1};a.maskOpts={active:!1,mode:"overlay",opacity:1,value:0,syncops:["flip","pan","rot90","zoom"],invert:!1};a.analOpts={epattern:/^(ERROR:[^\n]*)\n/,dpathURL:"params/datapath.html",fpathURL:"params/filepath.html"};a.lightOpts={nclick:0, -dhtml:{top:".dhtmlwindow",drag:".drag-contentarea",dragBar:"drag-handle",format:"width=%spx,height=%spx,center=1,resize=%s,scrolling=0",textWin:"width=830px,height=400px,center=1,resize=1,scrolling=1",plotWin:"width=830px,height=420px,center=1,resize=1,scrolling=1",dpathWin:"width=830px,height=175px,center=1,resize=1,scrolling=1",lcloseWin:"width=512px,height=190px,center=1,resize=1,scrolling=1",paramWin:"width=830px,height=235px,center=1,resize=1,scrolling=1",regWin0:"width=600px,height=72px,center=1,resize=1,scrolling=1", -regWin:"width=600px,height=235px,center=1,resize=1,scrolling=1",imageWin:"width=512px,height=598px,center=1,resize=1,scrolling=1",lineWin:"width=400px,height=60px,center=1,resize=1,scrolling=1"},lcloseURL:"params/lightclose.html"};a.textColorOpts={regions:"#00FF00",info:"#00FF00",inimage:"#000000"};a.helpOpts={user:{heading:"JS9Help",type:"help",url:"user.html",title:"User Manual"},install:{heading:"JS9Help",type:"help",url:"install.html",title:"Installing JS9"},webpage:{heading:"JS9Help",type:"help", -url:"webpage.html",title:"Adding JS9 to a Web Page"},yourdata:{heading:"JS9Help",type:"help",url:"yourdata.html",title:"Adding Data to a Web Page"},localtasks:{heading:"JS9Help",type:"help",url:"localtasks.html",title:"Adding Local Analysis Tasks and Plugins"},helper:{heading:"JS9Help",type:"help",url:"helper.html",title:"Adding Server-side Analysis Tasks"},serverside:{heading:"JS9Help",type:"help",url:"serverside.html",title:"Server-side Analysis with JS9"},publicapi:{heading:"JS9Help",type:"help", -url:"publicapi.html",title:"The JS9 Public API"},extmsg:{heading:"JS9Help",type:"help",url:"extmsg.html",title:"External Messaging"},desktop:{heading:"JS9Help",type:"help",url:"desktop.html",title:"JS9 on the Desktop"},python:{heading:"JS9Help",type:"help",url:"python.html",title:"JS9 with Python and Jupyter"},archives:{heading:"JS9Help",type:"help",url:"archives.html",title:"Accessing Data Archives"},preferences:{heading:"JS9Help",type:"help",url:"preferences.html",title:"Setting Site Preferences"}, -regions:{heading:"JS9Help",type:"help",url:"regions.html",title:"Regions Format"},changelog:{heading:"JS9Help",type:"help",url:"changelog.html",title:"ChangeLog"},repfile:{heading:"JS9Help",type:"help",url:"repfile.html",title:"Dealing with Large Files"},memory:{heading:"JS9Help",type:"help",url:"memory.html",title:"Dealing with Memory Limitations"},issues:{heading:"JS9Help",type:"help",url:"knownissues.html",title:"Known Issues"}};a.images=[];a.displays=[];a.colormaps=[];a.commands=[];a.plugins= -[];a.preloads=[];a.auxFiles=[];a.supermenus=[];a.publics={};a.helper={};a.fits={};a.userOpts={};a.preloadwaiting={};a.scales="linear log histeq power sqrt squared asinh sinh".split(" ");a.wcssyss="FK4 FK5 ICRS galactic ecliptic native image physical".split(" ");a.wcsunitss=["degrees","sexagesimal","pixels"];a.bugs={};a.bugs.hide_menu=!1;"Firefox"===a.BROWSER[0]&&0<=a.BROWSER[2].search(/Linux/)&&(a.bugs.firefox_linux=!0);if("Chrome"===a.BROWSER[0]||"Safari"===a.BROWSER[0])a.bugs.webkit_resize=!0;"Chrome"!== -a.BROWSER[0]&&(a.globalOpts.imageTemplates+=",.gz");/iPad|iPhone|iPod/.test(navigator.platform)&&/11_2_(?:[2-9])/.test(navigator.userAgent)&&(a.globalOpts.useWasm=!1);a.BROWSER[3]&&(a.globalOpts.maxMemory=Math.min(a.globalOpts.maxMemory,35E7),a.globalOpts.table.xdim=2048,a.globalOpts.table.ydim=2048,a.globalOpts.image.xdim=2048,a.globalOpts.image.ydim=2048,a.imageOpts.crosshair=!1,a.globalOpts.reproj={xdim:2048,ydim:2048});window.hasOwnProperty("Jupyter")&&(a.globalOpts.useWasm=!1);if(window.isElectron){"Chrome"=== -a.BROWSER[0]&&66<=parseFloat(a.BROWSER[1])&&(a.globalOpts.allowFileWasm=!0);if(!window.electronVersion||5>parseInt(window.electronVersion,10))a.globalOpts.internalColorPicker=!1;a.hasNode="object"===typeof process&&"function"===typeof require;a.hasNode&&(a.localMount=require("os").hostname()||"localAccess");window.multiElectron&&(a.globalOpts.localStorage=!1);window&&"function"===typeof window.eval&&(window.eval=function(){throw Error("For security reasons, Desktop JS9 does not support window.eval()"); -})}a.Image=function(c,b,d){var e=this,f=null,g=0,h=0,k=function(b){b=b||{};a.isNull(b.scaleclipping)?"zscale"===e.params.scaleclipping?e.zscale(!0):"zmax"===e.params.scaleclipping&&e.zscale("zmax"):"zscale"===b.scaleclipping?e.zscale(!0):"zmax"===b.scaleclipping&&e.zscale("zmax");a.notNull(b.scalemin)&&(e.params.scalemin=b.scalemin);a.notNull(b.scalemax)&&(e.params.scalemax=b.scalemax)},l=function(b){var c=a.globalOpts.imopts,d=a.globalOpts.imcmap,g=a.globalOpts.alerts;var h=/(annulus|box|circle|ellipse|line|polygon|point|text) *\(/; -e.display.clearMessage();a.images.push(e);e.notifyHelper();e.showShapeLayer("regions",!0,{local:!0});f&&((a.notNull(f.x)&&a.notNull(f.y)||a.notNull(f.px)&&a.notNull(f.py)||a.notNull(f.ra)&&a.notNull(f.dec)||a.notNull(f.wcs))&&e.setPan(f),f.regions&&(f.regions.match(h)?e.addShapes("regions",f.regions):a.LoadRegions(f.regions,{display:e.display})));a.globalOpts.alerts=!1;if(e.raw&&e.raw.header&&e.raw.header[d]){try{var k=JSON.parse(e.raw.header[d])}catch(x){k=null}if(k)try{a.AddColormap(k)}catch(x){}}if(e.raw&& -e.raw.header&&e.raw.header[d+"1"]){var l=1;for(h="";100>l;l++){var m=d+String(l);if(e.raw.header[m])h+=e.raw.header[m];else break}if(h){try{k=JSON.parse(h)}catch(x){k=null}if(k)try{a.AddColormap(k)}catch(x){}}}if(e.raw&&e.raw.header&&e.raw.header[c]){try{k=JSON.parse(e.raw.header[c])}catch(x){k=null}if(k)try{e.setParam("all",k)}catch(x){}}if(e.raw&&e.raw.header&&e.raw.header[c+"1"]){l=1;for(h="";100>l;l++)if(m=c+String(l),e.raw.header[m])h+=e.raw.header[m];else break;if(h){try{k=JSON.parse(h)}catch(x){k= -null}if(k)try{e.setParam("all",k)}catch(x){}}}a.globalOpts.alerts=g;e.xeqPlugins("image","onimageload");e.updateshapes&&e.updateShapes("regions","all","update");e.setStatus("load","complete");a.waiting(!1);if(b)try{a.xeqByName(b,window,e)}catch(x){a.error("in image onload callback",x,!1)}h=e.proxyURL||e.file;b=h.replace(/\[.*\]/,"");if(a.preloadwaiting[h]||a.preloadwaiting[b])if(delete a.preloadwaiting[h],delete a.preloadwaiting[b],!Object.keys(a.preloadwaiting).length&&a.notNull(a.globalOpts.onpreload))try{a.xeqByName(a.globalOpts.onpreload, -window,e)}catch(x){a.error("in onpreload callback",x,!1)}f&&f.allext&&e.hdus&&0=f.length&&a.cleanupFITSFile(g,!0));g.altwcs&&this.freeWCS(g)}e.removeProxyFile();e.rgb=null;e.offscreen=null;e.raw=null;e.colorData=null;e.colorCells=null;e.psColors=null;e.psInverse=null;a.images.splice(b,1);break}if(d){for(b=d-=2;0<=b;b--)if(e= -a.images[b],this.display===e.display){e.displayImage("all");e.refreshLayers();d=a.images.length;break}for(b=a.images.length-1;b>d;b--)if(e=a.images[b],this.display===e.display){e.displayImage("all");e.refreshLayers();break}}};a.Image.prototype.mkOffScreenCanvas=function(){if(!this.png||!this.png.image)return this;this.offscreen={};this.offscreen.canvas=document.createElement("canvas");this.offscreen.canvas.setAttribute("width",this.png.image.width);this.offscreen.canvas.setAttribute("height",this.png.image.height); -this.offscreen.context=this.offscreen.canvas.getContext("2d");a.ANTIALIAS||(this.offscreen.context.imageSmoothingEnabled=!1,this.offscreen.context.webkitImageSmoothingEnabled=!1,this.offscreen.context.msImageSmoothingEnabled=!1);this.offscreen.context.drawImage(this.png.image,0,0);try{this.offscreen.img=this.offscreen.context.getImageData(0,0,this.png.image.width,this.png.image.height)}catch(c){a.CHROMEFILEWARNING&&"Chrome"===a.BROWSER[0]&&""===document.domain?alert("When using the file:// URI, Chrome must be run with the --allow-file-access-from-files switch to permit JS9 to access data."): -alert("could not read off-screen image data [same-origin policy violation?]")}return this};a.Image.prototype.initLCS=function(c){var b=[[0,0,0],[0,0,0],[0,0,0]];c=c||this.raw.header;var d=c.CRPIX1||1,e=c.CRPIX2||1;if(c.LCSROTA2&&c.CROTA2){var f=-c.CROTA2*Math.PI/180;var g=Math.sin(f);var h=Math.cos(f);f=[[0,0,0],[0,0,0],[0,0,0]];f[0][0]=h;f[0][1]=-g;f[0][2]=0;f[1][0]=g;f[1][1]=h;f[1][2]=0;(g=a.invertMatrix3(f))||(f=null)}b[0][0]=a.defNull(c.LTM1_1,1);b[1][0]=c.LTM2_1||0;b[0][1]=c.LTM1_2||0;b[1][1]= -a.defNull(c.LTM2_2,1);b[2][0]=c.LTV1||0;b[2][1]=c.LTV2||0;if("image"===this.imtab&&this.params.ltvbug){if(a.notNull(c.LTV1))for(h=0;2>h;h++){var k=Math.abs(b[0][h]);0k&&(b[2][0]+=.5*k)}if(a.notNull(c.LTV2))for(h=0;2>h;h++)k=Math.abs(b[1][h]),0k&&(b[2][1]+=.5*k)}this.lcs.physical={forward:$.extend(!0,[],b),reverse:a.invertMatrix3(b)};this.lcs.physical.reverse?f&&(this.lcs.physical.frot=$.extend(!0,[],f),this.lcs.physical.rrot=$.extend(!0,[],g),this.lcs.physical.cx=d-b[2][0]-1,this.lcs.physical.cy= -e-b[2][1]-1):delete this.lcs.physical;b[0][0]=a.defNull(c.DTM1_1,1);b[1][0]=c.DTM2_1||0;b[0][1]=c.DTM1_2||0;b[1][1]=a.defNull(c.DTM2_2,1);b[2][0]=c.DTV1||0;b[2][1]=c.DTV2||0;this.lcs.detector={forward:$.extend(!0,[],b),reverse:a.invertMatrix3(b)};this.lcs.detector.reverse?f&&(this.lcs.detector.frot=$.extend(!0,[],f),this.lcs.detector.rrot=$.extend(!0,[],g),this.lcs.detector.cx=d-b[2][0]-1,this.lcs.detector.cy=e-b[2][1]-1):delete this.lcs.detector;b[0][0]=a.defNull(c.ATM1_1,1);b[1][0]=c.ATM2_1||0; -b[0][1]=c.ATM1_2||0;b[1][1]=a.defNull(c.ATM2_2,1);b[2][0]=c.ATV1||0;b[2][1]=c.ATV2||0;this.lcs.amplifier={forward:$.extend(!0,[],b),reverse:a.invertMatrix3(b)};this.lcs.amplifier.reverse?f&&(this.lcs.amplifier.frot=$.extend(!0,[],f),this.lcs.amplifier.rrot=$.extend(!0,[],g),this.lcs.amplifier.cx=d-b[2][0]-1,this.lcs.amplifier.cy=e-b[2][1]-1):delete this.lcs.amplifier;this.params&&!this.lcs[this.params.lcs]&&(this.params.lcs="image");this.params&&!this.params.wcssys0&&(this.setWCSSys("physical"),this.params.wcssys0= -this.params.lcs);this.lcs.physical&&!this.lcs.ophysical&&(this.lcs.ophysical=$.extend(!0,{},this.lcs.physical));return this};a.Image.prototype.mkRawDataFromIMG=function(c){var b,d;if(c){var e=c.height;var f=c.width;var g=c.data;this.raws.push({from:"img"});this.raw=this.raws[this.raws.length-1];this.raw.id=a.RAWID0;this.raw.data=new Float32Array(e*f);for(d=c=0;dc||m)this.mkRawDataFromIMG(this.offscreen.img);else{c=f.join("");2l.naxis&&a.error("can't image a FITS file with less than 2 dimensions"); -if(this.raw){var m=this.raw;var n=this.raw.width;var q=this.raw.height;var p=this.raw.bitpix;var u=this.params.wcssys;var r=this.params.wcsunits;this.freeWCS()}this.raws=this.raws||[];if(g=this.raws.length){b.rawid=b.rawid||a.RAWIDX;for(e=f=0;ef&&(f=1/Math.abs(f)),a.notNull(e.NAXIS1)&&(e.NAXIS1/=f),a.notNull(e.NAXIS2)&&(e.NAXIS2/=f),a.notNull(e.CRPIX1)&&(e.CRPIX1=(e.CRPIX1+1-h-.5)/f+.5),a.notNull(e.CRPIX2)&&(e.CRPIX2=(e.CRPIX2+1-k-.5)/f+.5),a.notNull(e.CDELT1)&&(e.CDELT1*=f),a.notNull(e.CDELT2)&&(e.CDELT2*=f),a.notNull(e.CD1_1)&&(e.CD1_1*=f),a.notNull(e.CD1_2)&&(e.CD1_2*=f),a.notNull(e.CD2_1)&&(e.CD2_1*=f),a.notNull(e.CD2_2)&&(e.CD2_2*=f),e.LTM1_1=a.defNull(e.LTM1_1,1),e.LTM1_1/=f,e.LTM2_1=e.LTM2_1||0,e.LTM2_1/= -f,e.LTM1_2=e.LTM1_2||0,e.LTM1_2/=f,e.LTM2_2=a.defNull(e.LTM2_2,1),e.LTM2_2/=f,e.LTV1=e.LTV1||0,e.LTV1=(e.LTV1-h)/f+.5,e.LTV2=e.LTV2||0,e.LTV2=(e.LTV2-k)/f+.5;b.lcsUseRota2&&(e.LCSROTA2=!0);b.file&&b.file!==this.file?(this.file=b.file,this.id=null):b.filename&&b.filename!==this.file?(this.file=b.filename,this.id=null):l.filename&&l.filename!==this.file&&(this.file=l.filename,this.id=null);this.file0=this.file=this.file||a.ANON+a.uniqueID();b.id&&(this.id0=b.id,this.id=a.getImageID(b.id,this.display.id, -this));this.id||!this.file||this.file.match(/\[.*[^a-zA-Z0-9_].*\]/)||(b.extname||b.extnum?(b.extname?(this.file=this.file.replace(/\[.*\]/,""),this.file+="["+b.extname+"]"):b.extnum&&0]/);m=c=!1;e=0;for(b=!1;e=this.raw.header.NAXIS&&(!this.hdus||1===this.hdus.length)?c=!0:(c=!1,b=!0);break;case "nocube":2>=this.raw.header.NAXIS?c=!0:(c=!1,b=!0);break;case "noext":this.hdus&&1!==this.hdus.length?(c=!1, -b=!0):c=!0;break;case "size":t[e+1]?a.vsize(l.fits.vfile)>1E6*t[e+1]?c=!0:(c=!1,b=!0):(c=!1,b=!0)}c?(2d.x0&&(a.globalOpts.panWithinDisplay?d.x1-=d.x0:d.ix=d.x0*d.zoom,d.x0=0);0>d.y0&&(a.globalOpts.panWithinDisplay?d.y1-=d.y0:d.iy=d.y0*d.zoom,d.y0=0);d.x1>this.raw.width&&(a.globalOpts.panWithinDisplay?d.x0-=d.x1-this.raw.width: -d.ix=(d.x1-this.raw.width)*d.zoom,d.x1=this.raw.width);d.y1>this.raw.height&&(a.globalOpts.panWithinDisplay?d.y0-=d.y1-this.raw.height:d.iy=(d.y1-this.raw.height)*d.zoom,d.y1=this.raw.height);0d.ix&&d.x1d.iy&&d.y1=d.width||0>=d.height)b=sprintf("invalid image section: %s,%s [%s,%s, %s,%s, %s]",d.width,d.height,d.x0,d.y0,d.x1,d.y1,d.zoom),a.error(b);this.offscreenRGB=null;this.params.zoom=d.zoom;return this}; -a.Image.prototype.mkColorData=function(){var c,b=a.SCALESIZE,d=this.params.scalemin,e=this.params.scalemax,f=this.raw.width*this.raw.height,g=(b-1)/(e-d);if("static"===this.cmapObj.type)return this;if(!this.colorData||this.colorData.length=e?b-1:Math.floor((h-d)*g+.5)}return this};a.Image.prototype.calcContrastBias=function(c){var b=this.params.bias,d=a.COLORSIZE,e=this.params.contrast;if(1E-4>b- -.5&&1E-4>e-1)return c;this.params.invert&&(b=1-b);c=Math.floor(((c/d-b)*e+.5)*d);return 0>c?0:c>=d?d-1:c};a.Image.prototype.mkColorCells=function(){var c,b=a.COLORSIZE;if("static"===this.cmapObj.type)return this;this.colorCells||(this.colorCells=[]);for(c=0;cb;b+=2,c++){var m="0123456789ABCDEF".indexOf(k.charAt(b));var n="0123456789ABCDEF".indexOf(k.charAt(b+1));l[c]=16*m+n}h[NaN]=l}this.psInverse||(this.psInverse=[],this.psInverse[NaN]=0);k=this.params.scalemax-this.params.scalemin;b=this.params.scalemin;switch(this.params.scale){case "linear":for(h= -0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c]; -for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h= -b&&l[h]<=p&&(n=Math.floor((l[h]-b)/k*g+.5),n=n&&ld);n++);c=n/g;this.psInverse[h]=c*k+b}break;default:a.error("unknown scale '"+this.params.scale+"'")}return this};a.Image.prototype.mkRGBImage=function(){var c,b, -d,e,f=!1,g=null,h=null,k=null,l=!1,m=!1,n=!1,q=!1,p=[];if(!this.rgb)return this;!a.globalOpts.rgb.active||this!==a.globalOpts.rgb.rim&&this!==a.globalOpts.rgb.gim&&this!==a.globalOpts.rgb.bim||(l=!0,a.globalOpts.rgb.rim&&(g=a.globalOpts.rgb.rim),a.globalOpts.rgb.gim&&(h=a.globalOpts.rgb.gim),a.globalOpts.rgb.bim&&(k=a.globalOpts.rgb.bim));var u=this.display.context;var r=this.rgb;var t=r.sect;if(this.MakeRGBImage&&"function"===typeof this.MakeRGBImage&&this.MakeRGBImage()||this.MakePrimaryImage&& -"function"===typeof this.MakePrimaryImage&&this.MakePrimaryImage())return this;if(this.rgbFile){var v=t.width/t.zoom;var y=t.height/t.zoom;var w=t.x0;var x=this.offscreen.canvas.height-1-(t.y0+y);x=this.offscreen.context.getImageData(w,x,v,y);if(1===t.zoom)r.img=x;else for(r.img=u.createImageData(t.width,t.height),r=r.img,d=c=0;c=t.y0;c-=N,d++)for(A=c*this.raw.width,z=d*P,u=Math.floor(t.x0),b=0;uthis.mask.value?L:K:n&&(G=255*M.raw.data[A+u]);if(l){if(x=g?g.colorData[A+u]:0,v=h?h.colorData[A+u]:0,y=k?k.colorData[A+u]:0,a.isNull(x)||a.isNull(v)||a.isNull(y))return a.globalOpts.rgb.active=!1,a.error("RGB images are incompatible. Turning off RGB mode.","",!1),this.mkRGBImage(),this}else this.staticObj||(w=this.colorData[A+u]);var Q=G;f&&this.raw.data[A+ -u]<=R&&(Q=J);B=b*P;for(e=0;eh&&(h=a.pts[r].x),a.pts[r].xm&&(m=a.pts[r].y),a.pts[r].yc.bin&&(c.bin=1/Math.floor(1/c.bin+.5));c.filter=n(c.filter,p.filter,"");this.raw.filter=c.filter||"";!1!==c.waiting&&a.waiting(!0,this.display);this.setStatus("displaySection","processing");window.setTimeout(function(){switch(f){case "parentFile":e=d.proxyFile;m=[];m.push({name:"xcen",value:c.xcen});delete c.xcen;m.push({name:"ycen",value:c.ycen});delete c.ycen;m.push({name:"xdim",value:c.xdim});m.push({name:"ydim",value:c.ydim});void 0!==c.xdim&&(c.xdim=0);void 0!==c.ydim&&(c.ydim=0);c.binMode&& -(c.bin=""+c.bin+c.binMode,delete c.binMode);m.push({name:"bin",value:c.bin});delete c.bin;m.push({name:"filter",value:c.filter||""});m.push({name:"slice",value:c.slice||""});delete c.slice;g={id:d.expandMacro("$id"),image:d.file,fits:d.parentFile,rtype:"text"};g.cmd="js9Xeq imsection "+d.parentFile;c.extension&&(g.cmd=g.cmd.replace(/\[.*\]/,""),g.cmd+="["+c.extension+"]",delete c.extension);g.cmd+=d.expandMacro(" $xdim@$xcen,$ydim@$ycen,$bin $filter $slice",m);a.helper.send("imsection",g,function(b){b= -"object"===typeof b?b:0<=b.search(a.analOpts.epattern)?{stderr:b}:{stdout:b};if(b.stderr)a.error(b.stderr);else if(b.errcode)a.error("in displaySection: "+b.errcode);else{var f=b.stdout.split(/\n/);b=a.cleanPath(f[0]);"/"!==b.charAt(0)&&(b=a.InstallDir(b));c.proxyFile=b;e&&e!==c.proxyFile&&d.removeProxyFile(e);if(f[1]){try{var g=JSON.parse(f[1])}catch(w){a.log("couldn't parse imsection as JSON: %s",b),g=null}g&&(c.extname=g.extname,c.extnum=g.extnum,c.hdus=g.hdus,c.binstr=g.binstr,c.parent=g)}f[2]&& -(g=a.cleanPath(f[2]),c.parentFile=g);a.fetchURL(b,b,c,function(b){a.cleanupFITSFile(d.raw,!0);!1!==c.waiting&&a.waiting(!0,d.display);a.fits.handleFITSFile(b,c,q)})}});break;case "virtualFile":a.cleanupFITSFile(d.raw,!1);a.getFITSImage(u.fits,u,c,function(a){q(a,c)});break;default:a.error("image section cannot be extracted from this data file")}},a.SPINOUT)};a.Image.prototype.displayExtension=function(c,b,d){var e=this,f,g,h=function(c){var f=$.extend(!0,{},b);f.separate=!0;if(c===e.hdus.length){if(d)try{a.xeqByName(d, -window,e)}catch(p){a.error("in displayExtension callback",p,!1)}}else{var g=e.hdus[c];"image"===g.type&&2<=g.naxis?e.displayExtension(g.hdu,f,function(){h(c+1)}):h(c+1)}};b=b||{};if("string"===typeof b)try{b=JSON.parse(b)}catch(m){a.error("can't parse extension opts: "+b,m)}b.waiting=!1;this.hdus||a.error("no FITS HDUs found for displayExtension()");a.isNull(c)&&a.error("missing extname/extnum for displayExtension()");if("all"===c)h(0);else{if("string"===typeof c){b.extension=c;var k=c.toLowerCase(); -for(g=f=0;fa;)a+=360;for(;360<=a;)a-=360;270===a&&(a=-90);return a},k=function(a,b){var c,d,e=a.data,f=b.data;b.width=a.height;b.height=a.width;for(d=0;dMath.abs(c.CD1_1)&&(c.CD1_1=0);1E-15>Math.abs(c.CD1_2)&&(c.CD1_2=0);1E-15>Math.abs(c.CD2_1)&&(c.CD2_1=0);1E-15>Math.abs(c.CD2_2)&&(c.CD2_2=0)}else a.notNull(f.CRPIX1)&&(e.raw.wcsinfo?(0>e.raw.wcsinfo.cdelt1&& -0>e.raw.wcsinfo.cdelt2||0Math.abs(c.LTM1_1)&&(c.LTM1_1=0);1E-15>Math.abs(c.LTM1_2)&&(c.LTM1_2=0);1E-15>Math.abs(c.LTM2_1)&&(c.LTM2_1=0);1E-15>Math.abs(c.LTM2_2)&&(c.LTM2_2=0)},q=function(b,c,d){var f=b.header,g=c.header;switch(d){case 0:c.header=b.header;break;case 90:case -270:g.NAXIS1=f.NAXIS2;g.NAXIS2=f.NAXIS1;a.notNull(f.CRPIX1)&&a.notNull(f.CRPIX2)&&(g.CRPIX1=g.NAXIS1-f.CRPIX2+1,g.CRPIX2=f.CRPIX1,m(b,c,d));g.LTV1=g.NAXIS1-(f.LTV2||0)+1;g.LTV2=f.LTV1|| -0;n(b,c,d);break;case 270:case -90:g.NAXIS1=f.NAXIS2;g.NAXIS2=f.NAXIS1;a.notNull(f.CRPIX1)&&a.notNull(f.CRPIX2)&&(g.CRPIX1=f.CRPIX2,g.CRPIX2=g.NAXIS2-f.CRPIX1+1,m(b,c,d));g.LTV1=f.LTV2||0;g.LTV2=f.NAXIS1-(f.LTV1||0)+1;n(b,c,d);break;default:a.error("unknown rot90 type: "+e.params.rot90)}};if(!b)return this;this&&this.raw&&this.raw.header||a.error("invalid image for rot90");this.raw.header.CTYPE1&&this.raw.header.CTYPE1.match(/HPX/)&&a.error("support for rotating HEALPix is not yet available");f=f|| -{};if("string"===typeof f)try{f=JSON.parse(f)}catch(p){a.error("can't parse rot90 opts: "+f,p)}switch(b){case 1:b=90;break;case -1:b=-90;break;case 90:break;case -90:break;default:a.error("invalid rot90 value: "+b+" (use: +/1, +/90)")}d=a.getRawCopy(g);switch(b){case 90:k(g,d);q(g,d,90);this.params.rot90=h(90);break;case -90:l(g,d),q(g,d,-90),this.params.rot90=h(-90)}this.raw=d;this.initWCS();this.initLCS();this.setPan();this.displayImage("all",f);this.refreshLayers();a.globalOpts.extendedPlugins&& -this.xeqPlugins("image","onsetrot90");return this};a.Image.prototype.reFlipRot90=function(){var a=this.params.flip;var b=this.params.rot90;if("none"!==a){this.params.flip="none";var d=a.split("");for(a=0;athis.raw.bitpix?.5:1,void 0!==this.raw.header.TABMIN1&&(e=e-h+this.raw.header.TABMIN1),void 0!==this.raw.header.TABMIN2&&(f=f-h+this.raw.header.TABMIN2)));return{x:e,y:f,sys:c}};a.Image.prototype.logicalToImagePos=function(a,b){var c={x:a.x,y:a.y};var e=this.raw.header.CRPIX1||1;var f=this.raw.header.CRPIX2|| -1;b=b||this.params.lcs||"image";switch(b){case "ophysical":if(this.lcs.ophysical){var g=this.lcs.ophysical.forward;var h=this.lcs.ophysical.frot}else this.lcs.physical&&(g=this.lcs.physical.forward,h=this.lcs.physical.frot);break;case "physical":this.lcs.physical&&(g=this.lcs.physical.forward,h=this.lcs.physical.frot);break;case "detector":this.lcs.detector&&(g=this.lcs.detector.forward,h=this.lcs.detector.frot);break;case "amplifier":this.lcs.amplifier&&(g=this.lcs.amplifier.forward,h=this.lcs.amplifier.frot)}g&& -("table"===this.imtab&&(b=0>this.raw.bitpix?.5:1,void 0!==this.raw.header.TABMIN1&&(a.x=a.x-this.raw.header.TABMIN1+b),void 0!==this.raw.header.TABMIN2&&(a.y=a.y-this.raw.header.TABMIN2+b)),c.x=a.x*g[0][0]+a.y*g[1][0]+g[2][0],c.y=a.x*g[0][1]+a.y*g[1][1]+g[2][1],h&&(a=e+(c.x-e)*h[0][0]+(c.y-f)*h[1][0]+h[2][0],h=f+(c.x-e)*h[0][1]+(c.y-f)*h[1][1]+h[2][1],c.x=a,c.y=h));return c};a.Image.prototype.displayToImagePos=function(a){var b=this.rgb.sect;return{x:(a.x-this.ix+.5)/b.zoom+b.x0+.5,y:(this.rgb.img.height- -(a.y-this.iy+.5))/b.zoom+b.y0+.5}};a.Image.prototype.imageToDisplayPos=function(a){var b=this.rgb.sect;return{x:(a.x-.5-b.x0)*b.zoom+this.ix-.5,y:(b.y0-(a.y-.5))*b.zoom+this.rgb.img.height+this.iy-.5}};a.Image.prototype.logicalToDisplayPos=function(a,b,d){return this.imageToDisplayPos(this.logicalToImagePos(a,b,d))};a.Image.prototype.displayToLogicalPos=function(a){return this.imageToLogicalPos(this.displayToImagePos(a))};a.Image.prototype.getWCSSys=function(){if(this.params.wcssys)return this.params.wcssys}; -a.Image.prototype.setWCSSys=function(c){if(!(0<=$.inArray("wcs",this.params.disable)))return"image"===c?(this.params.wcssys="image",this.params.wcsunits="pixels",a.wcsunits.image="pixels"):"physical"===c?(this.params.wcssys="physical",this.params.wcsunits="pixels",a.globalOpts.wcsUnits.physical="pixels"):this.raw.wcs&&0=this.raw.altwcs[b].wcs&&a.error("invalid WCS for version: %s",c),this.raw.wcs=this.raw.altwcs[b].wcs,this.raw.wcsinfo=this.raw.altwcs[b].wcsinfo,c=this.raw.wcsinfo&&this.raw.wcsinfo.radecsys?this.raw.wcsinfo.radecsys:"native"!==this.params.wcssys?this.params.wcssys.trim():this.params.lcs,this.setWCSSys(c),this.params.wcssys0||(this.params.wcssys0=c),this.setWCSUnits(this.params.wcsunits), -this}a.error("could not find WCS version: "+c)};a.Image.prototype.getWCSUnits=function(){return this.params.wcsunits?this.params.wcsunits:"pixels"};a.Image.prototype.setWCSUnits=function(c){if(!(0<=$.inArray("wcs",this.params.disable))){if("pixels"===c)"image"!==this.params.wcssys&&(this.params.wcssys="physical"),this.params.wcsunits="pixels",a.globalOpts.wcsUnits[this.params.wcssys]="pixels";else if(this.raw.wcs&&0c.search(/ERROR:/i))a.log(c); -else{k(c,a.analOpts.epattern);return}else if(n.errcode)if(c="ERROR: running "+f.name+" ["+n.errcode+"]",n.stdout)a.log(c);else{k(c,a.analOpts.epattern);return}switch(f.rtype){case "text":case void 0:e.displayAnalysis("text",n.stdout,{divid:a.globalOpts.analysisDiv});break;case "plot":e.displayAnalysis("plot",n.stdout,{divid:a.globalOpts.analysisDiv});break;case "alert":n.stdout&&alert(n.stdout);break;case "fits":case "png":(l=n.stdout.split(/\s+/))&&l[0]&&(c=a.cleanPath(l[0]),"/"!==c.charAt(0)&&(c= -a.InstallDir(c)),n={proxyFile:c},l[1]&&(l=a.cleanPath(l[1]),n.parentFile=l),n.fits2fits=!1,n.fixpath=!1,a.Load(c,n,{display:e.display}));break;case "regions":if((l=n.stdout.split(/\s+/))&&l[0]){if(1");if(f)f.html(b);else{l=l||h.textWin;var n=a.lightWin(d,"inline",b,m,l)}break;case "plot":if(b&&"string"===typeof b)try{var q=JSON.parse(b)}catch(r){a.error("can't plot return data: "+ -b,r)}else"object"===typeof b&&(q=b);if(!q)return;q.curscale={x:"linear",y:"linear"};b="
";f?f.html(b):(l=l||h.plotWin,n=a.lightWin(d,"inline",b,m,l));var p=$("#"+d+" #"+d+"Plot");f&&(p.css("width",f.css("width")),p.css("height",f.css("height")),p.css("margin",0));if(q.data){switch(a.globalOpts.plotLibrary){case "plotly":h=$.extend(!0,{},a.Plot.opts,q.opts);q.label&&(h.title=q.label);b={x:[],y:[],type:"scatter"};3<= -q.data[0].length&&(b.error_y={type:"data",array:[],visible:!0},q.points&&q.points.yerr&&q.points.yerr.color&&(b.error_y.color=q.points.yerr.color));for(l=0;l");l.on("click",k);b=$("
"); -b.append(l);p.append(b)}break;case "params":case "regions":case "textline":f?a.allinone?f.html(b):$.ajax({url:b,cache:!1,dataType:"text",success:function(a){f.html(a)}}):(l="params"===c?l||h.paramWin:"regions"===c?"small"===a.globalOpts.regionConfigSize?l||h.regWin0:l||h.regWin:l||h.dpathWin,n=a.allinone?"inline":"ajax",n=a.lightWin(d,n,b,m,l))}return n};a.Image.prototype.saveFITS=function(c){if(window.hasOwnProperty("saveAs")){c=c?c.replace(/\.fz$/i,"").replace(/(png|jpg|jpeg)$/i,"fits"):"js9.fits"; -var b=this.toArray({notab:!0,twoaxes:!0});b=new Blob([b],{type:"application/octet-binary"});saveAs(b,c)}else a.error("no saveAs() available to save FITS file");return c};a.Image.prototype.saveIMG=function(c,b,d){var e;if(window.hasOwnProperty("saveAs")){d=d||{};if("number"===typeof d){var f=d;d=null}else if("string"===typeof d){if(a.isNumber(d))f=parseFloat(d),d=null;else try{d=JSON.parse(d)}catch(m){d=null}d&&(f=d.quality)}c=c||"js9.png";b=b||"image/png";var g=this.display.width;var h=this.display.height; -var k=document.createElement("canvas");k.setAttribute("width",g);k.setAttribute("height",h);var l=k.getContext("2d");"image"===d.source?l.putImageData(this.rgb.img,0,0):l.drawImage(this.display.canvas,0,0);if(!1!==d.layers)for(e in this.layers)this.layers.hasOwnProperty(e)&&"main"===this.layers[e].dlayer.dtype&&this.layers[e].show&&(d=this.layers[e].dlayer.canvasjq[0],l.drawImage(d,0,0,g,h));a.notNull(f)&&(0>f||1a&&(a=Math.abs(a),c="-");for(a=""+a;a.length=f||k>=f?(n="'",c*=60,k*=60):(n='"',c*=3600,k*=3600);h=this.rgb.sect;g=this.binning.bin;f=((h.x1-h.x0)*c).toFixed(0);k=((h.y1-h.y0)*k).toFixed(0);d.wcsfov=""+f+n+" \u00d7 "+k+n;f=(c*g/h.zoom).toFixed(3);d.wcspix=""+f+n+"/pix";d.wcsfovpix=d.wcsfov+" ("+d.wcspix+")";c=a.pix2wcs(this.raw.wcs,(h.x1+h.x0)/2,(h.y1+h.y0)/2).trim().split(/\s+/);d.racen=c[0];d.deccen=c[1];d.wcscen=c[0]+"\t "+c[1]}d.vstrsmall=e+"    "+l;d.vstr=m;d.vstrmedium= -m;d.vstrlarge=m+"    "+this.file;b&&this.display.displayMessage("info",d,a.globalOpts.valposTarget)}return d};a.Image.prototype.toggleValpos=function(){this.params.valpos=!this.params.valpos;this.params.valpos||this.display.clearMessage()};a.Image.prototype.getColormap=function(){if(this.cmapObj)return{colormap:this.cmapObj.name,contrast:this.params.contrast,bias:this.params.bias}};a.Image.prototype.setColormap=function(c){for(var b=[],d=0;d=c&&(c*=255),d.alpha=c);break;case 3:d.min=parseFloat(a[b][1]),Number.isNaN(d.min)&&(d.min=-Infinity),d.max=parseFloat(a[b][2]),Number.isNaN(d.max)&&(d.max=Infinity)}break}}};if(!(0<=$.inArray("colormap",this.params.disable)&&this.cmapObj)){switch(b.length){case 1:switch(d){case "rgb":a.globalOpts.rgb.active=!a.globalOpts.rgb.active;break;case "invert":this.params.invert=!this.params.invert;break;case "reset":this.params.invert= -a.imageOpts.invert;this.params.contrast=a.imageOpts.contrast;this.params.bias=a.imageOpts.bias;break;default:if(this.cmapObj&&"static"===this.cmapObj.type)if($.isArray(d))l(d);else if("string"===typeof d&&"["===d.charAt(0))try{var m=JSON.parse(d);l(m)}catch(n){a.error("can't parse JSON in setColormap: "+d,n)}else h(d);else"string"===typeof d&&h(d)}break;case 2:a.isNumber(d)&&a.isNumber(g)?k(d,g):this.cmapObj&&"static"===this.cmapObj.type&&(h(d),l(g));break;case 3:h(d),k(g,f)}this.displayImage("colors"); -this.xeqstash&&this.xeqstash.filterRGBImage&&delete this.xeqstash.filterRGBImage;a.globalOpts.extendedPlugins&&this.xeqPlugins("image","onsetcolormap");return this}};a.Image.prototype.getScale=function(){if(this.params.scale)return{scale:this.params.scale,scalemin:this.params.scalemin,scalemax:this.params.scalemax,scaleclipping:this.params.scaleclipping}};a.Image.prototype.setScale=function(c){for(var b=[],d=0;da&&this.params.disable.push(b[c]);return this.params.disable}if("enable"===a){$.isArray(b)||(b=[b]);for(c=0;cf.search(/(^| )-c/)&&(f+=" -c "+(this.raw.hdu.slice||1));if(g.reduce&&!this.parentFile&&(l=this.fileDimensions(),l=Math.floor(Math.max(l.xdim,l.ydim)/g.dim+.5),1b.radius2)&&a.error("radial profile source region must be an annulus"),b=[(b.radius1+b.radius2)/2,b.surfBrightness,b.surfError],h.data.push(b);return this.displayAnalysis("plot",h,{divid:a.globalOpts.analysisDiv})};a.Image.prototype.plot3d=function(c,b,d){var e,f,g=[];this.raw.header&&3===this.raw.header.NAXIS||a.error("plot3d requires a data cube with 3 dimensions");d=$.extend(!0,{},d,a.globalOpts.plot3d);d.cube=d.cube||"*:*:all";var h=d.cube.split(":");for(e=0;e=h.length&&a.cleanupFITSFile(g,!0)}this.raw=this.raws[0];if(g.current0&&g.current0.id)for(h=0;hg||d.alwaysCopy){h=$.extend(!0,{},f);h.current0=f;if(d.bitpix){switch(d.bitpix){case 8:h.data=new Uint8Array(f.height*f.width);break;case 16:h.data=new Int16Array(f.height*f.width);break;case -16:h.data=new Uint16Array(f.height*f.width);break;case 32:h.data=new Int32Array(f.height*f.width);break;case -32:h.data=new Float32Array(f.height*f.width);break; -case -64:h.data=new Float64Array(f.height*f.width)}var l=h.width*h.height;for(b=0;bthis.raw.bitpix&&0>e.argval.raw.bitpix?Math.min(this.raw.bitpix,e.argval.raw.bitpix):0>this.raw.bitpix&&0f||f>=a.height)){var g=0;var h=g+b.xoff;e=a.width;0>h&&(g-=h,e+=h,h=0);h+e>a.width&&(e-=h+e-a.width);if(0>=e)return!1;g=(c*a.width+g)*d;g=new Uint8Array(a.data.buffer,g,e*d); -h=(f*a.width+h)*d;e=new Uint8Array(b.data.buffer,h,e*d);e.set(g)}}return!0});return this};a.Image.prototype.rotateData=function(c){for(var b=[],d=0;df&&(f=-f);break;default:g=parseInt(g,10)}a.notNull(k.CD1_1)?(f=-(g*Math.PI/180),e=Math.sin(f),f=Math.cos(f),l.CD1_1=k.CD1_1*f+k.CD1_2*e,l.CD1_2=k.CD1_1* --e+k.CD1_2*f,l.CD2_1=k.CD2_1*f+k.CD2_2*e,l.CD2_2=k.CD2_1*-e+k.CD2_2*f):(l.CROTA2=g,l.CDELT1=e,l.CDELT2=f);h.lcsUseRota2=!0;d.wcsinfo&&(l.ptype=d.wcsinfo.ptype);this.xeqStashSave("rotateData",b,h.rawid);return this.reprojectData(l,h)};a.Image.prototype.reproject=function(c,b){var d,e,f,g=!1;var h={};var k=/SIMPLE|BITPIX|NAXIS|NAXIS[1-4]|AMDX|AMDY|CD[1-2]_[1-2]|CDELT[1-4]|CNPIX[1-4]|CO1_[1-9][0-9]|CO2_[1-9][0-9]|CROTA[1-4]|CRPIX[1-4]|CRVAL[1-4]|CTYPE[1-4]|CUNIT[1-4]|DATE|DATE_OBS|DC-FLAG|DEC|DETSEC|DETSIZE|EPOCH|EQUINOX|EQUINOX[a-z]|IMAGEH|IMAGEW|LATPOLE|LONGPOLE|MJD-OBS|PC00[1-4]00[1-4]|PC[1-4]_[1-4]|PIXSCALE|PIXSCAL[1-2]|PLTDECH|PLTDECM|PLTDECS|PLTDECSN|PLTRAH|PLTRAM|PLTRAS|PPO|PROJP[1-9]|PROJR0|PV[1-3]_[1-3]|PV[1-4]_[1-4]|RA|RADECSYS|SECPIX|SECPIX|SECPIX[1-2]|UT|UTMID|VELOCITY|VSOURCE|WCSAXES|WCSDEP|WCSDIM|WCSNAME|XPIXSIZE|YPIXSIZE|ZSOURCE|LTM|LTV/; +metaClickPan:!0,statusBar:"zoom: $zoom; scale: $scale/$scaleclipping($scalemin,$scalemax); color: $colormap($contrast,$bias); wcs: $wcssys($wcsunits)",toolbarTooltips:!1,centerDivs:["JS9Menubar"],resizeDivs:["JS9Menubar","JS9Colorbar","JS9Toolbar","JS9Statusbar"],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:"$data.ra $data.dec"},topColormaps:"grey heat cool turbo 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",menuPosition:"right-5 bottom-5", +menuClickEvent:"mouseup",menuSelected:"check",userMenus:!1,userMenuDivider:"   ",imagesFileSubmenu:5,toolBar:"annulus box circle ellipse line polygon text linear log zoom+ zoom- zoom1".split(" "),syncOps:"colormap contrastbias flip pan regions rot90 scale wcs zoom".split(" "),syncReciprocate:!0,syncWCS:!0,hiddenPluginDivs:[],separate:{layout:"auto",leftMargin:10,topMargin:10},imageTemplates:".fits,.fts,.png,.jpg,.jpeg,.fz,.ftz",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",localTemplates:".fits,.fts",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,flip:"none",rot90:0,zscalecontrast:.25,zscalesamples:600,zscaleline:120,wcssys:"native",lcs:"physical",valpos:!0,sigma:"none",opacity:1,alpha:255,nancolor:"#000000",nocolor:{red:0,green:0,blue:0,alpha:0},zoom:1,zooms:6,topZooms:2,wcsalign:!0,rotationMode:"relative",crosshair:!1,disable:[],ltvbug:!1,listonchange:!1,whichonchange:"selected"};a.regionOpts={};a.catalogOpts={};a.crosshairOpts={};a.gridOpts={};a.emscriptenOpts={};a.blendOpts={active:!0,mode:"screen",opacity:1};a.maskOpts= +{active:!1,mode:"overlay",opacity:1,value:0,syncops:["flip","pan","rot90","zoom"],invert:!1};a.analOpts={epattern:/^(ERROR:[^\n]*)\n/,dpathURL:"params/datapath.html",fpathURL:"params/filepath.html"};a.lightOpts={nclick:0,dhtml:{top:".dhtmlwindow",drag:".drag-contentarea",dragBar:"drag-handle",format:"width=%spx,height=%spx,center=1,resize=%s,scrolling=0",textWin:"width=830px,height=400px,center=1,resize=1,scrolling=1",plotWin:"width=830px,height=420px,center=1,resize=1,scrolling=1",dpathWin:"width=830px,height=175px,center=1,resize=1,scrolling=1", +lcloseWin:"width=512px,height=190px,center=1,resize=1,scrolling=1",paramWin:"width=830px,height=235px,center=1,resize=1,scrolling=1",regWin0:"width=600px,height=72px,center=1,resize=1,scrolling=1",regWin:"width=600px,height=235px,center=1,resize=1,scrolling=1",imageWin:"width=512px,height=598px,center=1,resize=1,scrolling=1",lineWin:"width=400px,height=60px,center=1,resize=1,scrolling=1"},lcloseURL:"params/lightclose.html"};a.textColorOpts={regions:"#00FF00",info:"#00FF00",inimage:"#000000"};a.helpOpts= +{user:{heading:"JS9Help",type:"help",url:"user.html",title:"User Manual"},install:{heading:"JS9Help",type:"help",url:"install.html",title:"Installing JS9"},webpage:{heading:"JS9Help",type:"help",url:"webpage.html",title:"Adding JS9 to a Web Page"},yourdata:{heading:"JS9Help",type:"help",url:"yourdata.html",title:"Adding Data to a Web Page"},localtasks:{heading:"JS9Help",type:"help",url:"localtasks.html",title:"Adding Local Analysis Tasks and Plugins"},helper:{heading:"JS9Help",type:"help",url:"helper.html", +title:"Adding Server-side Analysis Tasks"},serverside:{heading:"JS9Help",type:"help",url:"serverside.html",title:"Server-side Analysis with JS9"},publicapi:{heading:"JS9Help",type:"help",url:"publicapi.html",title:"The JS9 Public API"},extmsg:{heading:"JS9Help",type:"help",url:"extmsg.html",title:"External Messaging"},desktop:{heading:"JS9Help",type:"help",url:"desktop.html",title:"JS9 on the Desktop"},python:{heading:"JS9Help",type:"help",url:"python.html",title:"JS9 with Python and Jupyter"},archives:{heading:"JS9Help", +type:"help",url:"archives.html",title:"Accessing Data Archives"},preferences:{heading:"JS9Help",type:"help",url:"preferences.html",title:"Setting Site Preferences"},regions:{heading:"JS9Help",type:"help",url:"regions.html",title:"Regions Format"},changelog:{heading:"JS9Help",type:"help",url:"changelog.html",title:"ChangeLog"},repfile:{heading:"JS9Help",type:"help",url:"repfile.html",title:"Dealing with Large Files"},memory:{heading:"JS9Help",type:"help",url:"memory.html",title:"Dealing with Memory Limitations"}, +issues:{heading:"JS9Help",type:"help",url:"knownissues.html",title:"Known Issues"}};a.images=[];a.displays=[];a.colormaps=[];a.commands=[];a.plugins=[];a.preloads=[];a.auxFiles=[];a.supermenus=[];a.publics={};a.helper={};a.fits={};a.userOpts={};a.preloadwaiting={};a.scales="linear log histeq power sqrt squared asinh sinh".split(" ");a.wcssyss="FK4 FK5 ICRS galactic ecliptic native image physical".split(" ");a.wcsunitss=["degrees","sexagesimal","pixels"];a.bugs={};a.bugs.hide_menu=!1;"Firefox"===a.BROWSER[0]&& +0<=a.BROWSER[2].search(/Linux/)&&(a.bugs.firefox_linux=!0);if("Chrome"===a.BROWSER[0]||"Safari"===a.BROWSER[0])a.bugs.webkit_resize=!0;"Chrome"!==a.BROWSER[0]&&(a.globalOpts.imageTemplates+=",.gz");/iPad|iPhone|iPod/.test(navigator.platform)&&/11_2_(?:[2-9])/.test(navigator.userAgent)&&(a.globalOpts.useWasm=!1);a.BROWSER[3]&&(a.globalOpts.maxMemory=Math.min(a.globalOpts.maxMemory,35E7),a.globalOpts.table.xdim=2048,a.globalOpts.table.ydim=2048,a.globalOpts.image.xdim=2048,a.globalOpts.image.ydim=2048, +a.imageOpts.crosshair=!1,a.globalOpts.reproj={xdim:2048,ydim:2048});window.hasOwnProperty("Jupyter")&&(a.globalOpts.useWasm=!1);if(window.isElectron){"Chrome"===a.BROWSER[0]&&66<=parseFloat(a.BROWSER[1])&&(a.globalOpts.allowFileWasm=!0);if(!window.electronVersion||5>parseInt(window.electronVersion,10))a.globalOpts.internalColorPicker=!1;a.hasNode="object"===typeof process&&"function"===typeof require;a.hasNode&&(a.localMount=require("os").hostname()||"localAccess");window.multiElectron&&(a.globalOpts.localStorage= +!1);window&&"function"===typeof window.eval&&(window.eval=function(){throw Error("For security reasons, Desktop JS9 does not support window.eval()");})}a.Image=function(c,b,d){var e=this,f=null,g=0,h=0,k=function(b){b=b||{};a.isNull(b.scaleclipping)?"zscale"===e.params.scaleclipping?e.zscale(!0):"zmax"===e.params.scaleclipping&&e.zscale("zmax"):"zscale"===b.scaleclipping?e.zscale(!0):"zmax"===b.scaleclipping&&e.zscale("zmax");a.notNull(b.scalemin)&&(e.params.scalemin=b.scalemin);a.notNull(b.scalemax)&& +(e.params.scalemax=b.scalemax)},l=function(b){var c=a.globalOpts.imopts,d=a.globalOpts.imcmap,g=a.globalOpts.alerts;var h=/(annulus|box|circle|ellipse|line|polygon|point|text) *\(/;e.display.clearMessage();a.images.push(e);e.notifyHelper();e.showShapeLayer("regions",!0,{local:!0});f&&((a.notNull(f.x)&&a.notNull(f.y)||a.notNull(f.px)&&a.notNull(f.py)||a.notNull(f.ra)&&a.notNull(f.dec)||a.notNull(f.wcs))&&e.setPan(f),f.regions&&(f.regions.match(h)?e.addShapes("regions",f.regions):a.LoadRegions(f.regions, +{display:e.display})));a.globalOpts.alerts=!1;if(e.raw&&e.raw.header&&e.raw.header[d]){try{var k=JSON.parse(e.raw.header[d])}catch(x){k=null}if(k)try{a.AddColormap(k)}catch(x){}}if(e.raw&&e.raw.header&&e.raw.header[d+"1"]){var l=1;for(h="";100>l;l++){var m=d+String(l);if(e.raw.header[m])h+=e.raw.header[m];else break}if(h){try{k=JSON.parse(h)}catch(x){k=null}if(k)try{a.AddColormap(k)}catch(x){}}}if(e.raw&&e.raw.header&&e.raw.header[c]){try{k=JSON.parse(e.raw.header[c])}catch(x){k=null}if(k)try{e.setParam("all", +k)}catch(x){}}if(e.raw&&e.raw.header&&e.raw.header[c+"1"]){l=1;for(h="";100>l;l++)if(m=c+String(l),e.raw.header[m])h+=e.raw.header[m];else break;if(h){try{k=JSON.parse(h)}catch(x){k=null}if(k)try{e.setParam("all",k)}catch(x){}}}a.globalOpts.alerts=g;e.xeqPlugins("image","onimageload");e.updateshapes&&e.updateShapes("regions","all","update");e.setStatus("load","complete");a.waiting(!1);if(b)try{a.xeqByName(b,window,e)}catch(x){a.error("in image onload callback",x,!1)}h=e.proxyURL||e.file;b=h.replace(/\[.*\]/, +"");if(a.preloadwaiting[h]||a.preloadwaiting[b])if(delete a.preloadwaiting[h],delete a.preloadwaiting[b],!Object.keys(a.preloadwaiting).length&&a.notNull(a.globalOpts.onpreload))try{a.xeqByName(a.globalOpts.onpreload,window,e)}catch(x){a.error("in onpreload callback",x,!1)}f&&f.allext&&e.hdus&&0=f.length&&a.cleanupFITSFile(g,!0));g.altwcs&&this.freeWCS(g)}e.removeProxyFile(); +e.rgb=null;e.offscreen=null;e.raw=null;e.colorData=null;e.colorCells=null;e.psColors=null;e.psInverse=null;a.images.splice(b,1);break}if(d){for(b=d-=2;0<=b;b--)if(e=a.images[b],this.display===e.display){e.displayImage("all");e.refreshLayers();d=a.images.length;break}for(b=a.images.length-1;b>d;b--)if(e=a.images[b],this.display===e.display){e.displayImage("all");e.refreshLayers();break}}};a.Image.prototype.mkOffScreenCanvas=function(){if(!this.png||!this.png.image)return this;this.offscreen={};this.offscreen.canvas= +document.createElement("canvas");this.offscreen.canvas.setAttribute("width",this.png.image.width);this.offscreen.canvas.setAttribute("height",this.png.image.height);this.offscreen.context=this.offscreen.canvas.getContext("2d");a.ANTIALIAS||(this.offscreen.context.imageSmoothingEnabled=!1,this.offscreen.context.webkitImageSmoothingEnabled=!1,this.offscreen.context.msImageSmoothingEnabled=!1);this.offscreen.context.drawImage(this.png.image,0,0);try{this.offscreen.img=this.offscreen.context.getImageData(0, +0,this.png.image.width,this.png.image.height)}catch(c){a.CHROMEFILEWARNING&&"Chrome"===a.BROWSER[0]&&""===document.domain?alert("When using the file:// URI, Chrome must be run with the --allow-file-access-from-files switch to permit JS9 to access data."):alert("could not read off-screen image data [same-origin policy violation?]")}return this};a.Image.prototype.initLCS=function(c){var b=[[0,0,0],[0,0,0],[0,0,0]];c=c||this.raw.header;var d=c.CRPIX1||1,e=c.CRPIX2||1;if(c.LCSROTA2&&c.CROTA2){var f=-c.CROTA2* +Math.PI/180;var g=Math.sin(f);var h=Math.cos(f);f=[[0,0,0],[0,0,0],[0,0,0]];f[0][0]=h;f[0][1]=-g;f[0][2]=0;f[1][0]=g;f[1][1]=h;f[1][2]=0;(g=a.invertMatrix3(f))||(f=null)}b[0][0]=a.defNull(c.LTM1_1,1);b[1][0]=c.LTM2_1||0;b[0][1]=c.LTM1_2||0;b[1][1]=a.defNull(c.LTM2_2,1);b[2][0]=c.LTV1||0;b[2][1]=c.LTV2||0;if("image"===this.imtab&&this.params.ltvbug){if(a.notNull(c.LTV1))for(h=0;2>h;h++){var k=Math.abs(b[0][h]);0k&&(b[2][0]+=.5*k)}if(a.notNull(c.LTV2))for(h=0;2>h;h++)k=Math.abs(b[1][h]),0k&&(b[2][1]+=.5*k)}this.lcs.physical={forward:$.extend(!0,[],b),reverse:a.invertMatrix3(b)};this.lcs.physical.reverse?f&&(this.lcs.physical.frot=$.extend(!0,[],f),this.lcs.physical.rrot=$.extend(!0,[],g),this.lcs.physical.cx=d-b[2][0]-1,this.lcs.physical.cy=e-b[2][1]-1):delete this.lcs.physical;b[0][0]=a.defNull(c.DTM1_1,1);b[1][0]=c.DTM2_1||0;b[0][1]=c.DTM1_2||0;b[1][1]=a.defNull(c.DTM2_2,1);b[2][0]=c.DTV1||0;b[2][1]=c.DTV2||0;this.lcs.detector={forward:$.extend(!0,[],b),reverse:a.invertMatrix3(b)}; +this.lcs.detector.reverse?f&&(this.lcs.detector.frot=$.extend(!0,[],f),this.lcs.detector.rrot=$.extend(!0,[],g),this.lcs.detector.cx=d-b[2][0]-1,this.lcs.detector.cy=e-b[2][1]-1):delete this.lcs.detector;b[0][0]=a.defNull(c.ATM1_1,1);b[1][0]=c.ATM2_1||0;b[0][1]=c.ATM1_2||0;b[1][1]=a.defNull(c.ATM2_2,1);b[2][0]=c.ATV1||0;b[2][1]=c.ATV2||0;this.lcs.amplifier={forward:$.extend(!0,[],b),reverse:a.invertMatrix3(b)};this.lcs.amplifier.reverse?f&&(this.lcs.amplifier.frot=$.extend(!0,[],f),this.lcs.amplifier.rrot= +$.extend(!0,[],g),this.lcs.amplifier.cx=d-b[2][0]-1,this.lcs.amplifier.cy=e-b[2][1]-1):delete this.lcs.amplifier;this.params&&!this.lcs[this.params.lcs]&&(this.params.lcs="image");this.params&&!this.params.wcssys0&&(this.setWCSSys("physical"),this.params.wcssys0=this.params.lcs);this.lcs.physical&&!this.lcs.ophysical&&(this.lcs.ophysical=$.extend(!0,{},this.lcs.physical));return this};a.Image.prototype.mkRawDataFromIMG=function(c){var b,d;if(c){var e=c.height;var f=c.width;var g=c.data;this.raws.push({from:"img"}); +this.raw=this.raws[this.raws.length-1];this.raw.id=a.RAWID0;this.raw.data=new Float32Array(e*f);for(d=c=0;dc||m)this.mkRawDataFromIMG(this.offscreen.img);else{c=f.join("");2l.naxis&&a.error("can't image a FITS file with less than 2 dimensions");if(this.raw){var m=this.raw;var n=this.raw.width;var q=this.raw.height;var p=this.raw.bitpix;var u=this.params.wcssys;var r=this.params.wcsunits;this.freeWCS()}this.raws=this.raws||[];if(g=this.raws.length){b.rawid=b.rawid||a.RAWIDX;for(e=f=0;ef&&(f=1/Math.abs(f)),a.notNull(e.NAXIS1)&&(e.NAXIS1/=f),a.notNull(e.NAXIS2)&&(e.NAXIS2/=f),a.notNull(e.CRPIX1)&&(e.CRPIX1=(e.CRPIX1+1-h-.5)/f+.5),a.notNull(e.CRPIX2)&&(e.CRPIX2=(e.CRPIX2+1-k-.5)/f+.5),a.notNull(e.CDELT1)&&(e.CDELT1*=f),a.notNull(e.CDELT2)&&(e.CDELT2*=f),a.notNull(e.CD1_1)&& +(e.CD1_1*=f),a.notNull(e.CD1_2)&&(e.CD1_2*=f),a.notNull(e.CD2_1)&&(e.CD2_1*=f),a.notNull(e.CD2_2)&&(e.CD2_2*=f),e.LTM1_1=a.defNull(e.LTM1_1,1),e.LTM1_1/=f,e.LTM2_1=e.LTM2_1||0,e.LTM2_1/=f,e.LTM1_2=e.LTM1_2||0,e.LTM1_2/=f,e.LTM2_2=a.defNull(e.LTM2_2,1),e.LTM2_2/=f,e.LTV1=e.LTV1||0,e.LTV1=(e.LTV1-h)/f+.5,e.LTV2=e.LTV2||0,e.LTV2=(e.LTV2-k)/f+.5;b.lcsUseRota2&&(e.LCSROTA2=!0);b.file&&b.file!==this.file?(this.file=b.file,this.id=null):b.filename&&b.filename!==this.file?(this.file=b.filename,this.id=null): +l.filename&&l.filename!==this.file&&(this.file=l.filename,this.id=null);this.file0=this.file=this.file||a.ANON+a.uniqueID();b.id&&(this.id0=b.id,this.id=a.getImageID(b.id,this.display.id,this));this.id||!this.file||this.file.match(/\[.*[^a-zA-Z0-9_].*\]/)||(b.extname||b.extnum?(b.extname?(this.file=this.file.replace(/\[.*\]/,""),this.file+="["+b.extname+"]"):b.extnum&&0]/);m=c=!1;e=0;for(b=!1;e=this.raw.header.NAXIS&&(!this.hdus||1===this.hdus.length)?c=!0:(c=!1,b=!0);break;case "nocube":2>=this.raw.header.NAXIS?c=!0:(c=!1,b=!0);break;case "noext":this.hdus&&1!==this.hdus.length?(c=!1,b=!0):c=!0;break;case "size":t[e+1]?a.vsize(l.fits.vfile)>1E6*t[e+1]?c=!0:(c=!1,b=!0):(c=!1,b=!0)}c?(2d.x0&&(a.globalOpts.panWithinDisplay? +d.x1-=d.x0:d.ix=d.x0*d.zoom,d.x0=0);0>d.y0&&(a.globalOpts.panWithinDisplay?d.y1-=d.y0:d.iy=d.y0*d.zoom,d.y0=0);d.x1>this.raw.width&&(a.globalOpts.panWithinDisplay?d.x0-=d.x1-this.raw.width:d.ix=(d.x1-this.raw.width)*d.zoom,d.x1=this.raw.width);d.y1>this.raw.height&&(a.globalOpts.panWithinDisplay?d.y0-=d.y1-this.raw.height:d.iy=(d.y1-this.raw.height)*d.zoom,d.y1=this.raw.height);0d.ix&&d.x1d.iy&&d.y1=d.width|| +0>=d.height)b=sprintf("invalid image section: %s,%s [%s,%s, %s,%s, %s]",d.width,d.height,d.x0,d.y0,d.x1,d.y1,d.zoom),a.error(b);this.offscreenRGB=null;this.params.zoom=d.zoom;return this};a.Image.prototype.mkColorData=function(){var c,b=a.SCALESIZE,d=this.params.scalemin,e=this.params.scalemax,f=this.raw.width*this.raw.height,g=(b-1)/(e-d);if("static"===this.cmapObj.type)return this;if(!this.colorData||this.colorData.length=e?b-1:Math.floor((h-d)*g+.5)}return this};a.Image.prototype.calcContrastBias=function(c){var b=this.params.bias,d=a.COLORSIZE,e=this.params.contrast;if(1E-4>b-.5&&1E-4>e-1)return c;this.params.invert&&(b=1-b);c=Math.floor(((c/d-b)*e+.5)*d);return 0>c?0:c>=d?d-1:c};a.Image.prototype.mkColorCells=function(){var c,b=a.COLORSIZE;if("static"===this.cmapObj.type)return this;this.colorCells||(this.colorCells=[]);for(c=0;cb;b+=2,c++){var m="0123456789ABCDEF".indexOf(k.charAt(b));var n="0123456789ABCDEF".indexOf(k.charAt(b+1));l[c]=16*m+n}h[NaN]= +l}this.psInverse||(this.psInverse=[],this.psInverse[NaN]=0);k=this.params.scalemax-this.params.scalemin;b=this.params.scalemin;switch(this.params.scale){case "linear":for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h= +0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=b&&l[h]<=p&&(n=Math.floor((l[h]-b)/k*g+.5),n=n&&l +d);n++);c=n/g;this.psInverse[h]=c*k+b}break;default:a.error("unknown scale '"+this.params.scale+"'")}return this};a.Image.prototype.mkRGBImage=function(){var c,b,d,e,f=!1,g=null,h=null,k=null,l=!1,m=!1,n=!1,q=!1,p=[];if(!this.rgb)return this;!a.globalOpts.rgb.active||this!==a.globalOpts.rgb.rim&&this!==a.globalOpts.rgb.gim&&this!==a.globalOpts.rgb.bim||(l=!0,a.globalOpts.rgb.rim&&(g=a.globalOpts.rgb.rim),a.globalOpts.rgb.gim&&(h=a.globalOpts.rgb.gim),a.globalOpts.rgb.bim&&(k=a.globalOpts.rgb.bim)); +var u=this.display.context;var r=this.rgb;var t=r.sect;if(this.MakeRGBImage&&"function"===typeof this.MakeRGBImage&&this.MakeRGBImage()||this.MakePrimaryImage&&"function"===typeof this.MakePrimaryImage&&this.MakePrimaryImage())return this;if(this.rgbFile){var v=t.width/t.zoom;var y=t.height/t.zoom;var w=t.x0;var x=this.offscreen.canvas.height-1-(t.y0+y);x=this.offscreen.context.getImageData(w,x,v,y);if(1===t.zoom)r.img=x;else for(r.img=u.createImageData(t.width,t.height),r=r.img,d=c=0;c=t.y0;c-=N,d++)for(A=c*this.raw.width,z=d*P,u=Math.floor(t.x0),b=0;uthis.mask.value?L:K:n&&(G=255*M.raw.data[A+u]);if(l){if(x=g?g.colorData[A+u]:0,v=h?h.colorData[A+u]:0,y=k?k.colorData[A+u]:0,a.isNull(x)||a.isNull(v)||a.isNull(y))return a.globalOpts.rgb.active=!1,a.error("RGB images are incompatible. Turning off RGB mode.", +"",!1),this.mkRGBImage(),this}else this.staticObj||(w=this.colorData[A+u]);var Q=G;f&&this.raw.data[A+u]<=R&&(Q=J);B=b*P;for(e=0;eh&&(h=a.pts[r].x),a.pts[r].xm&&(m=a.pts[r].y),a.pts[r].yc.bin&&(c.bin=1/Math.floor(1/c.bin+.5));c.filter=n(c.filter,p.filter,"");this.raw.filter=c.filter||"";!1!==c.waiting&&a.waiting(!0,this.display);this.setStatus("displaySection","processing");window.setTimeout(function(){switch(f){case "parentFile":e= +d.proxyFile;m=[];m.push({name:"xcen",value:c.xcen});delete c.xcen;m.push({name:"ycen",value:c.ycen});delete c.ycen;m.push({name:"xdim",value:c.xdim});m.push({name:"ydim",value:c.ydim});void 0!==c.xdim&&(c.xdim=0);void 0!==c.ydim&&(c.ydim=0);c.binMode&&(c.bin=""+c.bin+c.binMode,delete c.binMode);m.push({name:"bin",value:c.bin});delete c.bin;m.push({name:"filter",value:c.filter||""});m.push({name:"slice",value:c.slice||""});delete c.slice;g={id:d.expandMacro("$id"),image:d.file,fits:d.parentFile,rtype:"text"}; +g.cmd="js9Xeq imsection "+d.parentFile;c.extension&&(g.cmd=g.cmd.replace(/\[.*\]/,""),g.cmd+="["+c.extension+"]",delete c.extension);g.cmd+=d.expandMacro(" $xdim@$xcen,$ydim@$ycen,$bin $filter $slice",m);a.helper.send("imsection",g,function(b){b="object"===typeof b?b:0<=b.search(a.analOpts.epattern)?{stderr:b}:{stdout:b};if(b.stderr)a.error(b.stderr);else if(b.errcode)a.error("in displaySection: "+b.errcode);else{var f=b.stdout.split(/\n/);b=a.cleanPath(f[0]);"/"!==b.charAt(0)&&(b=a.InstallDir(b)); +c.proxyFile=b;e&&e!==c.proxyFile&&d.removeProxyFile(e);if(f[1]){try{var g=JSON.parse(f[1])}catch(w){a.log("couldn't parse imsection as JSON: %s",b),g=null}g&&(c.extname=g.extname,c.extnum=g.extnum,c.hdus=g.hdus,c.binstr=g.binstr,c.parent=g)}f[2]&&(g=a.cleanPath(f[2]),c.parentFile=g);a.fetchURL(b,b,c,function(b){a.cleanupFITSFile(d.raw,!0);!1!==c.waiting&&a.waiting(!0,d.display);a.fits.handleFITSFile(b,c,q)})}});break;case "virtualFile":a.cleanupFITSFile(d.raw,!1);a.getFITSImage(u.fits,u,c,function(a){q(a, +c)});break;default:a.error("image section cannot be extracted from this data file")}},a.SPINOUT)};a.Image.prototype.displayExtension=function(c,b,d){var e=this,f,g,h=function(c){var f=$.extend(!0,{},b);f.separate=!0;if(c===e.hdus.length){if(d)try{a.xeqByName(d,window,e)}catch(p){a.error("in displayExtension callback",p,!1)}}else{var g=e.hdus[c];"image"===g.type&&2<=g.naxis?e.displayExtension(g.hdu,f,function(){h(c+1)}):h(c+1)}};b=b||{};if("string"===typeof b)try{b=JSON.parse(b)}catch(m){a.error("can't parse extension opts: "+ +b,m)}b.waiting=!1;this.hdus||a.error("no FITS HDUs found for displayExtension()");a.isNull(c)&&a.error("missing extname/extnum for displayExtension()");if("all"===c)h(0);else{if("string"===typeof c){b.extension=c;var k=c.toLowerCase();for(g=f=0;fa;)a+=360;for(;360<=a;)a-=360;270===a&&(a=-90);return a},k=function(a,b){var c,d,e=a.data,f=b.data;b.width=a.height;b.height=a.width; +for(d=0;dMath.abs(c.CD1_1)&&(c.CD1_1=0);1E-15>Math.abs(c.CD1_2)&&(c.CD1_2=0);1E-15>Math.abs(c.CD2_1)&&(c.CD2_1=0);1E-15>Math.abs(c.CD2_2)&&(c.CD2_2=0)}else a.notNull(f.CRPIX1)&&(e.raw.wcsinfo?(0>e.raw.wcsinfo.cdelt1&&0>e.raw.wcsinfo.cdelt2||0Math.abs(c.LTM1_1)&&(c.LTM1_1=0);1E-15>Math.abs(c.LTM1_2)&&(c.LTM1_2=0);1E-15>Math.abs(c.LTM2_1)&&(c.LTM2_1=0);1E-15>Math.abs(c.LTM2_2)&&(c.LTM2_2=0)},q=function(b, +c,d){var f=b.header,g=c.header;switch(d){case 0:c.header=b.header;break;case 90:case -270:g.NAXIS1=f.NAXIS2;g.NAXIS2=f.NAXIS1;a.notNull(f.CRPIX1)&&a.notNull(f.CRPIX2)&&(g.CRPIX1=g.NAXIS1-f.CRPIX2+1,g.CRPIX2=f.CRPIX1,m(b,c,d));g.LTV1=g.NAXIS1-(f.LTV2||0)+1;g.LTV2=f.LTV1||0;n(b,c,d);break;case 270:case -90:g.NAXIS1=f.NAXIS2;g.NAXIS2=f.NAXIS1;a.notNull(f.CRPIX1)&&a.notNull(f.CRPIX2)&&(g.CRPIX1=f.CRPIX2,g.CRPIX2=g.NAXIS2-f.CRPIX1+1,m(b,c,d));g.LTV1=f.LTV2||0;g.LTV2=f.NAXIS1-(f.LTV1||0)+1;n(b,c,d);break; +default:a.error("unknown rot90 type: "+e.params.rot90)}};if(!b)return this;this&&this.raw&&this.raw.header||a.error("invalid image for rot90");this.raw.header.CTYPE1&&this.raw.header.CTYPE1.match(/HPX/)&&a.error("support for rotating HEALPix is not yet available");f=f||{};if("string"===typeof f)try{f=JSON.parse(f)}catch(p){a.error("can't parse rot90 opts: "+f,p)}switch(b){case 1:b=90;break;case -1:b=-90;break;case 90:break;case -90:break;default:a.error("invalid rot90 value: "+b+" (use: +/1, +/90)")}d= +a.getRawCopy(g);switch(b){case 90:k(g,d);q(g,d,90);this.params.rot90=h(90);break;case -90:l(g,d),q(g,d,-90),this.params.rot90=h(-90)}this.raw=d;this.initWCS();this.initLCS();this.setPan();this.displayImage("all",f);this.refreshLayers();a.globalOpts.extendedPlugins&&this.xeqPlugins("image","onsetrot90");return this};a.Image.prototype.reFlipRot90=function(){var a=this.params.flip;var b=this.params.rot90;if("none"!==a){this.params.flip="none";var d=a.split("");for(a=0;athis.raw.bitpix?.5:1,void 0!==this.raw.header.TABMIN1&&(e=e-h+this.raw.header.TABMIN1),void 0!==this.raw.header.TABMIN2&&(f=f-h+this.raw.header.TABMIN2)));return{x:e,y:f,sys:c}};a.Image.prototype.logicalToImagePos=function(a,b){var c={x:a.x,y:a.y};var e=this.raw.header.CRPIX1||1;var f=this.raw.header.CRPIX2||1;b=b||this.params.lcs||"image";switch(b){case "ophysical":if(this.lcs.ophysical){var g=this.lcs.ophysical.forward;var h=this.lcs.ophysical.frot}else this.lcs.physical&&(g=this.lcs.physical.forward, +h=this.lcs.physical.frot);break;case "physical":this.lcs.physical&&(g=this.lcs.physical.forward,h=this.lcs.physical.frot);break;case "detector":this.lcs.detector&&(g=this.lcs.detector.forward,h=this.lcs.detector.frot);break;case "amplifier":this.lcs.amplifier&&(g=this.lcs.amplifier.forward,h=this.lcs.amplifier.frot)}g&&("table"===this.imtab&&(b=0>this.raw.bitpix?.5:1,void 0!==this.raw.header.TABMIN1&&(a.x=a.x-this.raw.header.TABMIN1+b),void 0!==this.raw.header.TABMIN2&&(a.y=a.y-this.raw.header.TABMIN2+ +b)),c.x=a.x*g[0][0]+a.y*g[1][0]+g[2][0],c.y=a.x*g[0][1]+a.y*g[1][1]+g[2][1],h&&(a=e+(c.x-e)*h[0][0]+(c.y-f)*h[1][0]+h[2][0],h=f+(c.x-e)*h[0][1]+(c.y-f)*h[1][1]+h[2][1],c.x=a,c.y=h));return c};a.Image.prototype.displayToImagePos=function(a){var b=this.rgb.sect;return{x:(a.x-this.ix+.5)/b.zoom+b.x0+.5,y:(this.rgb.img.height-(a.y-this.iy+.5))/b.zoom+b.y0+.5}};a.Image.prototype.imageToDisplayPos=function(a){var b=this.rgb.sect;return{x:(a.x-.5-b.x0)*b.zoom+this.ix-.5,y:(b.y0-(a.y-.5))*b.zoom+this.rgb.img.height+ +this.iy-.5}};a.Image.prototype.logicalToDisplayPos=function(a,b,d){return this.imageToDisplayPos(this.logicalToImagePos(a,b,d))};a.Image.prototype.displayToLogicalPos=function(a){return this.imageToLogicalPos(this.displayToImagePos(a))};a.Image.prototype.getWCSSys=function(){if(this.params.wcssys)return this.params.wcssys};a.Image.prototype.setWCSSys=function(c){if(!(0<=$.inArray("wcs",this.params.disable)))return"image"===c?(this.params.wcssys="image",this.params.wcsunits="pixels",a.wcsunits.image= +"pixels"):"physical"===c?(this.params.wcssys="physical",this.params.wcsunits="pixels",a.globalOpts.wcsUnits.physical="pixels"):this.raw.wcs&&0=this.raw.altwcs[b].wcs&&a.error("invalid WCS for version: %s",c),this.raw.wcs=this.raw.altwcs[b].wcs,this.raw.wcsinfo=this.raw.altwcs[b].wcsinfo,c=this.raw.wcsinfo&& +this.raw.wcsinfo.radecsys?this.raw.wcsinfo.radecsys:"native"!==this.params.wcssys?this.params.wcssys.trim():this.params.lcs,this.setWCSSys(c),this.params.wcssys0||(this.params.wcssys0=c),this.setWCSUnits(this.params.wcsunits),this}a.error("could not find WCS version: "+c)};a.Image.prototype.getWCSUnits=function(){return this.params.wcsunits?this.params.wcsunits:"pixels"};a.Image.prototype.setWCSUnits=function(c){if(!(0<=$.inArray("wcs",this.params.disable))){if("pixels"===c)"image"!==this.params.wcssys&& +(this.params.wcssys="physical"),this.params.wcsunits="pixels",a.globalOpts.wcsUnits[this.params.wcssys]="pixels";else if(this.raw.wcs&&0c.search(/ERROR:/i))a.log(c);else{k(c,a.analOpts.epattern);return}else if(n.errcode)if(c="ERROR: running "+f.name+" ["+n.errcode+"]",n.stdout)a.log(c);else{k(c,a.analOpts.epattern);return}switch(f.rtype){case "text":case void 0:e.displayAnalysis("text",n.stdout,{divid:a.globalOpts.analysisDiv});break;case "plot":e.displayAnalysis("plot",n.stdout,{divid:a.globalOpts.analysisDiv});break; +case "alert":n.stdout&&alert(n.stdout);break;case "fits":case "png":(l=n.stdout.split(/\s+/))&&l[0]&&(c=a.cleanPath(l[0]),"/"!==c.charAt(0)&&(c=a.InstallDir(c)),n={proxyFile:c},l[1]&&(l=a.cleanPath(l[1]),n.parentFile=l),n.fits2fits=!1,n.fixpath=!1,a.Load(c,n,{display:e.display}));break;case "regions":if((l=n.stdout.split(/\s+/))&&l[0]){if(1
");if(f)f.html(b);else{l=l||h.textWin;var n=a.lightWin(d, +"inline",b,m,l)}break;case "plot":if(b&&"string"===typeof b)try{var q=JSON.parse(b)}catch(r){a.error("can't plot return data: "+b,r)}else"object"===typeof b&&(q=b);if(!q)return;q.curscale={x:"linear",y:"linear"};b="
";f?f.html(b):(l=l||h.plotWin,n=a.lightWin(d,"inline",b,m,l));var p=$("#"+d+" #"+d+"Plot");f&&(p.css("width",f.css("width")),p.css("height",f.css("height")),p.css("margin",0));if(q.data){switch(a.globalOpts.plotLibrary){case "plotly":h= +$.extend(!0,{},a.Plot.opts,q.opts);q.label&&(h.title=q.label);b={x:[],y:[],type:"scatter"};3<=q.data[0].length&&(b.error_y={type:"data",array:[],visible:!0},q.points&&q.points.yerr&&q.points.yerr.color&&(b.error_y.color=q.points.yerr.color));for(l=0;l");l.on("click",k);b=$("
");b.append(l);p.append(b)}break;case "params":case "regions":case "textline":f?a.allinone?f.html(b):$.ajax({url:b,cache:!1,dataType:"text",success:function(a){f.html(a)}}):(l="params"===c?l||h.paramWin:"regions"===c?"small"===a.globalOpts.regionConfigSize?l||h.regWin0:l||h.regWin:l||h.dpathWin,n=a.allinone?"inline":"ajax",n=a.lightWin(d,n,b,m,l))}return n};a.Image.prototype.saveFITS= +function(c){if(window.hasOwnProperty("saveAs")){c=c?c.replace(/\.fz$/i,"").replace(/(png|jpg|jpeg)$/i,"fits"):"js9.fits";var b=this.toArray({notab:!0,twoaxes:!0});b=new Blob([b],{type:"application/octet-binary"});saveAs(b,c)}else a.error("no saveAs() available to save FITS file");return c};a.Image.prototype.saveIMG=function(c,b,d){var e;if(window.hasOwnProperty("saveAs")){d=d||{};if("number"===typeof d){var f=d;d=null}else if("string"===typeof d){if(a.isNumber(d))f=parseFloat(d),d=null;else try{d= +JSON.parse(d)}catch(m){d=null}d&&(f=d.quality)}c=c||"js9.png";b=b||"image/png";var g=this.display.width;var h=this.display.height;var k=document.createElement("canvas");k.setAttribute("width",g);k.setAttribute("height",h);var l=k.getContext("2d");"image"===d.source?l.putImageData(this.rgb.img,0,0):l.drawImage(this.display.canvas,0,0);if(!1!==d.layers)for(e in this.layers)this.layers.hasOwnProperty(e)&&"main"===this.layers[e].dlayer.dtype&&this.layers[e].show&&(d=this.layers[e].dlayer.canvasjq[0], +l.drawImage(d,0,0,g,h));a.notNull(f)&&(0>f||1a&&(a=Math.abs(a),c="-");for(a=""+a;a.length=f||k>=f?(n="'",c*=60,k*=60):(n='"',c*=3600,k*=3600);h=this.rgb.sect;g=this.binning.bin;f=((h.x1-h.x0)*c).toFixed(0);k=((h.y1-h.y0)*k).toFixed(0);d.wcsfov=""+f+n+" \u00d7 "+k+n;f=(c*g/h.zoom).toFixed(3);d.wcspix=""+f+n+"/pix";d.wcsfovpix=d.wcsfov+" ("+d.wcspix+")";c=a.pix2wcs(this.raw.wcs,(h.x1+h.x0)/ +2,(h.y1+h.y0)/2).trim().split(/\s+/);d.racen=c[0];d.deccen=c[1];d.wcscen=c[0]+"\t "+c[1]}d.vstrsmall=e+"    "+l;d.vstr=m;d.vstrmedium=m;d.vstrlarge=m+"    "+this.file;b&&this.display.displayMessage("info",d,a.globalOpts.valposTarget)}return d};a.Image.prototype.toggleValpos=function(){this.params.valpos=!this.params.valpos;this.params.valpos||this.display.clearMessage()};a.Image.prototype.getColormap=function(){if(this.cmapObj)return{colormap:this.cmapObj.name, +contrast:this.params.contrast,bias:this.params.bias}};a.Image.prototype.setColormap=function(c){for(var b=[],d=0;d=c&&(c*=255),d.alpha=c);break;case 3:d.min=parseFloat(a[b][1]),Number.isNaN(d.min)&&(d.min=-Infinity),d.max=parseFloat(a[b][2]),Number.isNaN(d.max)&&(d.max=Infinity)}break}}};if(!(0<=$.inArray("colormap",this.params.disable)&&this.cmapObj)){switch(b.length){case 1:switch(d){case "rgb":a.globalOpts.rgb.active= +!a.globalOpts.rgb.active;break;case "invert":this.params.invert=!this.params.invert;break;case "reset":this.params.invert=a.imageOpts.invert;this.params.contrast=a.imageOpts.contrast;this.params.bias=a.imageOpts.bias;break;default:if(this.cmapObj&&"static"===this.cmapObj.type)if($.isArray(d))l(d);else if("string"===typeof d&&"["===d.charAt(0))try{var m=JSON.parse(d);l(m)}catch(n){a.error("can't parse JSON in setColormap: "+d,n)}else h(d);else"string"===typeof d&&h(d)}break;case 2:a.isNumber(d)&&a.isNumber(g)? +k(d,g):this.cmapObj&&"static"===this.cmapObj.type&&(h(d),l(g));break;case 3:h(d),k(g,f)}this.displayImage("colors");this.xeqstash&&this.xeqstash.filterRGBImage&&delete this.xeqstash.filterRGBImage;a.globalOpts.extendedPlugins&&this.xeqPlugins("image","onsetcolormap");return this}};a.Image.prototype.getScale=function(){if(this.params.scale)return{scale:this.params.scale,scalemin:this.params.scalemin,scalemax:this.params.scalemax,scaleclipping:this.params.scaleclipping}};a.Image.prototype.setScale= +function(c){for(var b=[],d=0;da&&this.params.disable.push(b[c]);return this.params.disable}if("enable"===a){$.isArray(b)||(b=[b]);for(c=0;cf.search(/(^| )-c/)&&(f+=" -c "+(this.raw.hdu.slice||1));if(g.reduce&&!this.parentFile&&(l=this.fileDimensions(),l=Math.floor(Math.max(l.xdim,l.ydim)/g.dim+.5),1b.radius2)&&a.error("radial profile source region must be an annulus"),b=[(b.radius1+b.radius2)/2,b.surfBrightness,b.surfError],h.data.push(b);return this.displayAnalysis("plot",h,{divid:a.globalOpts.analysisDiv})};a.Image.prototype.plot3d=function(c,b,d){var e,f,g=[];this.raw.header&&3===this.raw.header.NAXIS||a.error("plot3d requires a data cube with 3 dimensions"); +d=$.extend(!0,{},d,a.globalOpts.plot3d);d.cube=d.cube||"*:*:all";var h=d.cube.split(":");for(e=0;e=h.length&&a.cleanupFITSFile(g,!0)}this.raw=this.raws[0];if(g.current0&&g.current0.id)for(h=0;hg||d.alwaysCopy){h=$.extend(!0,{},f);h.current0=f;if(d.bitpix){switch(d.bitpix){case 8:h.data=new Uint8Array(f.height*f.width);break;case 16:h.data=new Int16Array(f.height* +f.width);break;case -16:h.data=new Uint16Array(f.height*f.width);break;case 32:h.data=new Int32Array(f.height*f.width);break;case -32:h.data=new Float32Array(f.height*f.width);break;case -64:h.data=new Float64Array(f.height*f.width)}var l=h.width*h.height;for(b=0;bthis.raw.bitpix&&0>e.argval.raw.bitpix?Math.min(this.raw.bitpix,e.argval.raw.bitpix):0>this.raw.bitpix&&0f||f>=a.height)){var g=0;var h=g+b.xoff;e=a.width;0>h&&(g-=h,e+=h,h=0);h+e>a.width&&(e-=h+e-a.width);if(0>=e)return!1;g=(c*a.width+g)*d;g=new Uint8Array(a.data.buffer,g,e*d);h=(f*a.width+h)*d;e=new Uint8Array(b.data.buffer,h,e*d);e.set(g)}}return!0});return this};a.Image.prototype.rotateData=function(c){for(var b=[],d=0;df&&(f=-f);break;default:g=parseInt(g,10)}a.notNull(k.CD1_1)?(f=-(g*Math.PI/180),e=Math.sin(f),f=Math.cos(f),l.CD1_1=k.CD1_1*f+k.CD1_2*e,l.CD1_2=k.CD1_1*-e+k.CD1_2*f,l.CD2_1=k.CD2_1*f+k.CD2_2*e,l.CD2_2=k.CD2_1*-e+k.CD2_2*f):(l.CROTA2=g,l.CDELT1=e,l.CDELT2=f);h.lcsUseRota2=!0;d.wcsinfo&&(l.ptype=d.wcsinfo.ptype);this.xeqStashSave("rotateData",b,h.rawid);return this.reprojectData(l,h)};a.Image.prototype.reproject=function(c, +b){var d,e,f,g=!1;var h={};var k=/SIMPLE|BITPIX|NAXIS|NAXIS[1-4]|AMDX|AMDY|CD[1-2]_[1-2]|CDELT[1-4]|CNPIX[1-4]|CO1_[1-9][0-9]|CO2_[1-9][0-9]|CROTA[1-4]|CRPIX[1-4]|CRVAL[1-4]|CTYPE[1-4]|CUNIT[1-4]|DATE|DATE_OBS|DC-FLAG|DEC|DETSEC|DETSIZE|EPOCH|EQUINOX|EQUINOX[a-z]|IMAGEH|IMAGEW|LATPOLE|LONGPOLE|MJD-OBS|PC00[1-4]00[1-4]|PC[1-4]_[1-4]|PIXSCALE|PIXSCAL[1-2]|PLTDECH|PLTDECM|PLTDECS|PLTDECSN|PLTRAH|PLTRAM|PLTRAS|PPO|PROJP[1-9]|PROJR0|PV[1-3]_[1-3]|PV[1-4]_[1-4]|RA|RADECSYS|SECPIX|SECPIX|SECPIX[1-2]|UT|UTMID|VELOCITY|VSOURCE|WCSAXES|WCSDEP|WCSDIM|WCSNAME|XPIXSIZE|YPIXSIZE|ZSOURCE|LTM|LTV/; var l=/TAN|SIN|ZEA|STG|ARC/,m=function(b,c){if(!c)return b;b=$.extend(!0,{},b);a.isNull(b.CRVAL1)&&!a.isNull(c.crval1)&&(b.CRVAL1=c.crval1);a.isNull(b.CRVAL2)&&!a.isNull(c.crval2)&&(b.CRVAL2=c.crval2);a.isNull(b.CRPIX1)&&!a.isNull(c.crpix1)&&(b.CRPIX1=c.crpix1);a.isNull(b.CRPIX2)&&!a.isNull(c.crpix2)&&(b.CRPIX2=c.crpix2);a.isNull(b.CDELT1)&&!a.isNull(c.cdelt1)&&(b.CDELT1=c.cdelt1);a.isNull(b.CDELT2)&&!a.isNull(c.cdelt2)&&(b.CDELT2=c.cdelt2);a.isNull(b.CROTA2)&&!a.isNull(c.crot)&&(b.CROTA2=c.crot); return b};if(a.reproject&&c&&this!==c){this.raws&&this.raws[0]||a.error("no raw data for reprojection");var n=this.raws[0];n.header&&n.wcsinfo||a.error("no WCS info available for reprojection");b=b||{};var q=$.extend(!0,{},n.header);for(p in q)q.hasOwnProperty(p)&&k.test(p)&&delete q[p];if("object"===typeof c){c.raw&&c.raw.header?d=c.raw.header:c.BITPIX&&c.NAXIS1&&c.NAXIS2?d=c:a.error("invalid wcs object input to reproject()");for(p in d)d.hasOwnProperty(p)&&k.test(p)&&(h[p]=d[p]);var p=$.extend(!0, {},h,q);if(!p.NAXIS||!p.NAXIS1||!p.NAXIS2)return;h=a.raw2FITS(p,{addcr:!0});q="wcs_"+a.uniqueID()+".txt";a.vfile(q,h);h=a.globalOpts.reproj.xdim||a.globalOpts.image.xdim;k=a.globalOpts.reproj.ydim||a.globalOpts.image.ydim;var u=h*k*32;(p.NAXIS1*p.NAXIS2*Math.abs(p.BITPIX)>u||n.header.NAXIS1*n.header.NAXIS2*Math.abs(n.header.BITPIX)>u)&&a.error("the max reproject size is "+h+" * "+k+" * 4 bytes/pixel. You can use the Bin/Filter/Section plugin to extract a section, then save it as FITS and reproject the smaller image.")}else q= @@ -4713,62 +4715,62 @@ a.strace(n))}}else if("inactive"===f.status){if(f.winHandle&&(f.winHandle.show() a.Display.prototype.resize=function(c,b,d){var e,f,g=function(a){a.left+=k;a.top+=l;a.setCoords()};a.globalOpts.resize||a.error("display resize not enabled");if(!c&&!b)return{width:this.width,height:this.height};if("full"===c){if(d=b,window.innerWidth&&(c=window.innerWidth),window.innerHeight)for(b=window.innerHeight,e=0;ec||10>b)&&a.error("invalid dimension(s) passed to display resize");if(c===this.width&&b===this.height)return this;d=d||{};e=c;c=b;var k=(e-this.width)/2;var l=(c-this.height)/2;this.width=e;this.height=c;this.divjq.css("width",e);this.divjq.css("height",c);this.canvasjq.attr("width",e);this.canvasjq.attr("height",c);a.bugs.webkit_resize&&!this.resizing&& (this.owidth=Math.min(this.owidth,e),this.oheight=Math.min(this.oheight,c));0<=$.inArray("JS9Menubar",a.globalOpts.resizeDivs)&&(a.isNull(d.resizeMenubar)||d.resizeMenubar)&&(b=this.pluginInstances.JS9Menubar)&&$("#"+this.id+"Menubar").css("width",e);0<=$.inArray("JS9Toolbar",a.globalOpts.resizeDivs)&&(a.isNull(d.resizeToolbar)||d.resizeToolbar)&&(b=this.pluginInstances.JS9Toolbar)&&(b.divjq.attr("data-width",String(e)+"px"),a.Toolbar.init.call(b));0<=$.inArray("JS9Colorbar",a.globalOpts.resizeDivs)&& -(a.isNull(d.resizeColorbar)||d.resizeColorbar)&&(b=this.pluginInstances.JS9Colorbar)&&(b.divjq.attr("data-width",String(e)+"px"),a.Colorbar.init.call(b));for(f in this.layers)this.layers.hasOwnProperty(f)&&(b=this.layers[f],"main"===b.dtype&&(b.divjq.css("width",e),b.divjq.css("height",c),b.canvasjq.attr("width",e),b.canvasjq.attr("height",c),b.canvas.setWidth(e),b.canvas.setHeight(c),b.canvas.calcOffset()));for(e=0;e=this.divjq.width()&&c.y+a.RESIZEDIST>=this.divjq.height()?!0:!1};a.Display.prototype.center=function(){var c=this.divjq,b;var d=c.offset().top;var e=c.height(),f=$(window).height();var g=c.offset().left;c=c.width();var h=$(window).width();for(b=0;b
",b,u.width()));t.isactive&&(c+=sprintf("
",b,u.width()));c+=sprintf("
",b,u.width()-D,u.height()-D);v.isactive&&(c+=sprintf("
", -b,u.width()))}"auto"===l&&A+y*(h+.5)>window.innerWidth&&(g++,h=0);var d=sprintf("width=%s,height=%s,top=%s,left=%s,resize=1,scolling=1",y,w,x+(w+n+q)*g,A+(y+m+p)*h);"auto"===l||"horizontal"===l?h++:"vertical"===l&&g++}return{id:b,html:c,winopts:d}},G=function(g){var h;var l=f++;g.length>l?(l="number"===typeof g[l]?a.images[g[l]]:g[l])&&l.display===b?(l.displayImage("all"),void 0===d?(d=l.display.id,C(d,c),G(g)):(e="string"===typeof c.idbase?h=c.idbase+k++:d.replace(B,"")+"_sep"+a.uniqueID(),z[e]= -l,$("#dhtmlwindowholder").arrive("#"+e,{onceOnly:!0},function(a){h=$(a).attr("id");window.setTimeout(function(){z[h].moveToDisplay(h);G(g)},0)}),l=E(d,e),h&&(l.id=h),a.LoadWindow(null,{id:l.id},"light",l.html,l.winopts))):G(g):a.globalOpts.extendedPlugins&&b.image&&b.image.xeqPlugins("image","onseparatedisplay")};c=c||{};if("string"===typeof c)try{c=JSON.parse(c)}catch(J){a.error("can't parse separate opts: "+c,J)}G(c.images||a.images)};a.Display.prototype.nextImage=function(c){var b,d;c=c||1;if(this.image){var e= -this.image.pos;for(b=0;b=a.images.length&&(d=0),0>d&&(d=a.images.length-1),a.images[d].display!==this);d+=c);b!==d&&(c=a.images[d],c.displayImage("all"),c.refreshLayers(),c.display.clearMessage(),e&&(e=c.displayToImagePos(e),c.valpos=null,c.valpos=c.updateValpos(e,!0)));return this}};a.Display.prototype.loadSession=function(c,b){var d=this,e,f,g={},h=function(c){var e,h=function(){var b=t.canvas.getObjects();b&&"undefined"!==typeof b.length&& -(c.layers[t.layerName].nshape=b.length+1);a.Fabric.updateChildren(t,null,"objects");c.refreshLayers()};var k=g[c.file]||{};k.blend&&(c.blend=$.extend(!0,{},k.blend));k.tmp&&(c.tmp=$.extend(!0,{},k.tmp));k.wcsim&&(c.wcsim=a.lookupImage(k.wcsim));if(k.layers&&k.layers.length)for(e=0;ec.search(/\[struct stat="OK"/)&&(a.waiting(!1),l(),(d=c.match(/msg="(.*)"/))&&d[1]? -a.error(d[1]+" (from "+b+")"):a.error(c||"unknown "+b+" failure"))},n=function(b,c){c=c||{};var e=$.extend(!0,{},c);!1!==c.waiting&&a.waiting(!0,d);e.display=d.id;b=new a.Image(b,e);k.setStatus("createMosaic","complete");b.setStatus("createMosaic","complete");a.waiting(!1)},q=function(c){for(var d=[],e=0;e %s",k,v,w),k=a.reproject(k,w,z,y),m("mProjectPP",k));a.vfile(x,B);k=a.imgtbl(x,".",A,"");m("mImgtbl",k);a.vsize(A)||a.error("no FITS files were added to output table for mosaic");q("create mosaic: %s", -f);k=a.madd(A,z,f,"");m("mAdd",k);l();x=$.extend(!0,{},a.fits.options,b);x.image={xdim:0,ydim:0};x.file=f;a.fits.handleFITSFile(f,x,n)},a.SPINOUT);return this};a.Display.prototype.moveImageInStack=function(c,b){var d,e,f,g;for(e=d=0;d").addClass("JS9Container").css("z-index",0).appendTo(d);g.canvasjq=$("").addClass("JS9Layer").attr("id",h).attr("width",d.css("width")).attr("height",d.css("height")).appendTo(g.divjq);a.bugs.webkit_resize&&"main"===g.dtype&&g.canvasjq.attr("width",this.width).attr("height",this.height);g.canvas=new fabric.Canvas(g.canvasjq[0]);g.canvas.renderOnAddRemove=!1;g.canvas.preserveObjectStacking=!0;g.opts.movable?(g.opts.lockMovementX=!1,g.opts.lockMovementY=!1,g.opts.selectable= -!0,g.opts.evented=!0):!1===g.opts.movable&&(g.opts.lockMovementX=!0,g.opts.lockMovementY=!0,g.opts.selectable=!1,g.opts.evented=!1);void 0===g.opts.changeable&&void 0!==g.opts.fixinplace&&(g.opts.changeable=!g.opts.fixinplace);g.opts.changeable?(g.opts.hasControls=!0,g.opts.hasRotatingPoint=!0,g.opts.hasBorders=!0,g.opts.lockMovementX=!1,g.opts.lockMovementY=!1,g.opts.lockRotation=!1,g.opts.lockScalingX=!1,g.opts.lockScalingY=!1,g.opts.lockUniScaling=!1,g.opts.selectable=!0,g.opts.evented=!0,g.opts.usekeyboard= -!0):!1===g.opts.changeable&&(g.opts.hasControls=!1,g.opts.hasRotatingPoint=!1,g.opts.hasBorders=!1,g.opts.lockMovementX=!0,g.opts.lockMovementY=!0,g.opts.lockRotation=!0,g.opts.lockScalingX=!0,g.opts.lockScalingY=!0,g.opts.lockUniScaling=!0,g.opts.selectable=!1,g.opts.evented=!1,g.opts.usekeyboard=!1);g.opts.selectable&&(g.opts.canvas.selection=!0);if(g.opts.onmousedown||g.opts.onmouseup||g.opts.onmousemove||g.opts.tooltip||g.opts.onmouseover||g.opts.onmouseout){g.opts.evented=!0;if(g.opts.onmousedown)g.canvas.on("mouse:down", -function(b){if(g.display.image&&b.target)"main"===g.dtype&&(g.display.image.clickInRegion=!0,g.display.image.clickInLayer=c),g.opts.onmousedown.call(g.canvas,g.display.image,b.target.pub,b.e,b.target);else if(g.canvas._selection=g.canvas.selection)g.canvas.selection=a.specialKey(b.e)});else g.canvas.on("mouse:down",function(b){if(g.canvas._selection=g.canvas.selection)g.canvas.selection=a.specialKey(b.e)});if(g.opts.onmouseup)g.canvas.on("mouse:up",function(a){g.display.image&&a.target&&g.opts.onmouseup.call(g.canvas, -g.display.image,a.target.pub,a.e,a.target);g.canvas.selection=g.canvas._selection||g.canvas.selection});else g.canvas.on("mouse:up",function(){g.canvas.selection=g.canvas._selection||g.canvas.selection});if(g.opts.onmousemove)g.canvas.on("mouse:move",function(a){g.display.image&&a.target&&g.opts.onmousemove.call(g.canvas,g.display.image,a.target.pub,a.e,a.target)});if(g.opts.onmouseover)g.canvas.on("mouse:over",function(a){g.display.image&&a.target&&g.opts.onmouseover.call(g.canvas,g.display.image, -a.target.pub,a.e,a.target)});if(g.opts.onmouseout)g.canvas.on("mouse:out",function(a){g.display.image&&a.target&&g.opts.onmouseout.call(g.canvas,g.display.image,a.target.pub,a.e,a.target)});g.opts.tooltip&&(g.canvas.on("mouse:over",function(b){g.display.image&&b.target&&a.tooltip(b.target.left+b.target.width+2,b.target.top+b.target.height+2,g.opts.tooltip,g.display.image,b.target.pub,b.e,b.target)}),g.canvas.on("mouse:out",function(b){g.display.image&&b.target&&a.tooltip(b.target.left,b.target.top, -null,g.display.image,b.target.pub,b.e,b.target)}))}else g.canvas.on("mouse:down",function(b){if(g.canvas._selection=g.canvas.selection)g.canvas.selection=a.specialKey(b.e)}),g.canvas.on("mouse:up",function(){g.canvas.selection=g.canvas._selection||g.canvas.selection});"function"===typeof g.opts.ongroupcreate&&(g.opts.canvas.selection=!0,g.opts.selectable=!0,g.canvas.on("selection:created",function(a){var b=[],c=[];g.display.image&&a.target&&"group"===a.target.type&&(a.target.forEachObject(function(a){a.pub&& -(c.push(a),b.push(a.pub))}),g.opts.ongroupcreate.call(g.canvas,g.display.image,b,a.e,c))}));g.canvas.on("object:modified",function(b){var c=[];if(b.target){var d=b.target;a.Fabric.updateChildren(g,d,"deltas");if(g.opts.sortOverlapping&&(d.setCoords(),g.canvas.forEachObject(function(a){a!==d&&d.intersectsWithObject(a)&&(1===fabric.major_version?(e=a.getWidth(),f=a.getHeight()):(e=a.getScaledWidth(),f=a.getScaledHeight()),c.push({obj:a,siz:e*f}))}),c.length)){if(1===fabric.major_version){var e=d.getWidth(); -var f=d.getHeight()}else e=d.getScaledWidth(),f=d.getScaledHeight();c.push({obj:d,siz:e*f});c.sort(function(a,b){return a.sizb.siz?1:0});var h=c.length;for(b=0;b$.inArray(k,e)&&d.addWithUpdate(k)}if(h.params.children)for(k=0;k$.inArray(p,e)&&d.addWithUpdate(p)}switch(h.type){case "polyline":case "polygon":a.Fabric.removePolygonAnchors(g,h)}h&&g.display.image&&g.display.image.updateShapes(c,h,"select")}}g.canvas.renderAll()}else f(g,d)}),g.canvas.on("before:selection:cleared",function(a){var b=g.canvas.getActiveObject();if("activeSelection"===b.type){var c= -g.canvas.getActiveObjects(a);for(a=0;a=this.divjq.width()&&c.y+a.RESIZEDIST>=this.divjq.height()?!0:!1};a.Display.prototype.center=function(){var c=this.divjq,b;var d=c.offset().top;var e=c.height(),f=$(window).height();var g=c.offset().left;c=c.width();var h=$(window).width(); +for(b=0;b",b,u.width()));t.isactive&&(c+=sprintf("
",b,u.width()));c+=sprintf("
", +b,u.width()-D,u.height()-D);v.isactive&&(c+=sprintf("
",b,u.width()))}"auto"===l&&A+y*(h+.5)>window.innerWidth&&(g++,h=0);var d=sprintf("width=%s,height=%s,top=%s,left=%s,resize=1,scolling=1",y,w,x+(w+n+q)*g,A+(y+m+p)*h);"auto"===l||"horizontal"===l?h++:"vertical"===l&&g++}return{id:b,html:c,winopts:d}},G=function(g){var h;var l=f++;g.length>l?(l="number"===typeof g[l]?a.images[g[l]]:g[l])&&l.display=== +b?(l.displayImage("all"),void 0===d?(d=l.display.id,C(d,c),G(g)):(e="string"===typeof c.idbase?h=c.idbase+k++:d.replace(B,"")+"_sep"+a.uniqueID(),z[e]=l,$("#dhtmlwindowholder").arrive("#"+e,{onceOnly:!0},function(a){h=$(a).attr("id");window.setTimeout(function(){z[h].moveToDisplay(h);G(g)},0)}),l=E(d,e),h&&(l.id=h),a.LoadWindow(null,{id:l.id},"light",l.html,l.winopts))):G(g):a.globalOpts.extendedPlugins&&b.image&&b.image.xeqPlugins("image","onseparatedisplay")};c=c||{};if("string"===typeof c)try{c= +JSON.parse(c)}catch(J){a.error("can't parse separate opts: "+c,J)}G(c.images||a.images)};a.Display.prototype.nextImage=function(c){var b,d;c=c||1;if(this.image){var e=this.image.pos;for(b=0;b=a.images.length&&(d=0),0>d&&(d=a.images.length-1),a.images[d].display!==this);d+=c);b!==d&&(c=a.images[d],c.displayImage("all"),c.refreshLayers(),c.display.clearMessage(),e&&(e=c.displayToImagePos(e),c.valpos=null,c.valpos=c.updateValpos(e,!0))); +return this}};a.Display.prototype.loadSession=function(c,b){var d=this,e,f,g={},h=function(c){var e,h=function(){var b=t.canvas.getObjects();b&&"undefined"!==typeof b.length&&(c.layers[t.layerName].nshape=b.length+1);a.Fabric.updateChildren(t,null,"objects");c.refreshLayers()};var k=g[c.file]||{};k.blend&&(c.blend=$.extend(!0,{},k.blend));k.tmp&&(c.tmp=$.extend(!0,{},k.tmp));k.wcsim&&(c.wcsim=a.lookupImage(k.wcsim));if(k.layers&&k.layers.length)for(e=0;ec.search(/\[struct stat="OK"/)&&(a.waiting(!1),l(),(d=c.match(/msg="(.*)"/))&&d[1]?a.error(d[1]+" (from "+b+")"):a.error(c||"unknown "+b+" failure"))},n=function(b,c){c=c||{};var e=$.extend(!0,{},c);!1!==c.waiting&&a.waiting(!0,d);e.display=d.id;b=new a.Image(b,e);k.setStatus("createMosaic","complete");b.setStatus("createMosaic","complete");a.waiting(!1)},q=function(c){for(var d=[],e=0;e %s",k,v,w),k=a.reproject(k,w,z,y),m("mProjectPP",k));a.vfile(x,B);k=a.imgtbl(x,".",A,"");m("mImgtbl",k);a.vsize(A)||a.error("no FITS files were added to output table for mosaic"); +q("create mosaic: %s",f);k=a.madd(A,z,f,"");m("mAdd",k);l();x=$.extend(!0,{},a.fits.options,b);x.image={xdim:0,ydim:0};x.file=f;a.fits.handleFITSFile(f,x,n)},a.SPINOUT);return this};a.Display.prototype.moveImageInStack=function(c,b){var d,e,f,g;for(e=d=0;d").addClass("JS9Container").css("z-index",0).appendTo(d);g.canvasjq=$("").addClass("JS9Layer").attr("id",h).attr("width",d.css("width")).attr("height",d.css("height")).appendTo(g.divjq);a.bugs.webkit_resize&&"main"===g.dtype&&g.canvasjq.attr("width",this.width).attr("height",this.height);g.canvas=new fabric.Canvas(g.canvasjq[0]);g.canvas.renderOnAddRemove=!1;g.canvas.preserveObjectStacking=!0;g.opts.movable?(g.opts.lockMovementX= +!1,g.opts.lockMovementY=!1,g.opts.selectable=!0,g.opts.evented=!0):!1===g.opts.movable&&(g.opts.lockMovementX=!0,g.opts.lockMovementY=!0,g.opts.selectable=!1,g.opts.evented=!1);void 0===g.opts.changeable&&void 0!==g.opts.fixinplace&&(g.opts.changeable=!g.opts.fixinplace);g.opts.changeable?(g.opts.hasControls=!0,g.opts.hasRotatingPoint=!0,g.opts.hasBorders=!0,g.opts.lockMovementX=!1,g.opts.lockMovementY=!1,g.opts.lockRotation=!1,g.opts.lockScalingX=!1,g.opts.lockScalingY=!1,g.opts.lockUniScaling=!1, +g.opts.selectable=!0,g.opts.evented=!0,g.opts.usekeyboard=!0):!1===g.opts.changeable&&(g.opts.hasControls=!1,g.opts.hasRotatingPoint=!1,g.opts.hasBorders=!1,g.opts.lockMovementX=!0,g.opts.lockMovementY=!0,g.opts.lockRotation=!0,g.opts.lockScalingX=!0,g.opts.lockScalingY=!0,g.opts.lockUniScaling=!0,g.opts.selectable=!1,g.opts.evented=!1,g.opts.usekeyboard=!1);g.opts.selectable&&(g.opts.canvas.selection=!0);if(g.opts.onmousedown||g.opts.onmouseup||g.opts.onmousemove||g.opts.tooltip||g.opts.onmouseover|| +g.opts.onmouseout){g.opts.evented=!0;if(g.opts.onmousedown)g.canvas.on("mouse:down",function(b){if(g.display.image&&b.target)"main"===g.dtype&&(g.display.image.clickInRegion=!0,g.display.image.clickInLayer=c),g.opts.onmousedown.call(g.canvas,g.display.image,b.target.pub,b.e,b.target);else if(g.canvas._selection=g.canvas.selection)g.canvas.selection=a.specialKey(b.e)});else g.canvas.on("mouse:down",function(b){if(g.canvas._selection=g.canvas.selection)g.canvas.selection=a.specialKey(b.e)});if(g.opts.onmouseup)g.canvas.on("mouse:up", +function(a){g.display.image&&a.target&&g.opts.onmouseup.call(g.canvas,g.display.image,a.target.pub,a.e,a.target);g.canvas.selection=g.canvas._selection||g.canvas.selection});else g.canvas.on("mouse:up",function(){g.canvas.selection=g.canvas._selection||g.canvas.selection});if(g.opts.onmousemove)g.canvas.on("mouse:move",function(a){g.display.image&&a.target&&g.opts.onmousemove.call(g.canvas,g.display.image,a.target.pub,a.e,a.target)});if(g.opts.onmouseover)g.canvas.on("mouse:over",function(a){g.display.image&& +a.target&&g.opts.onmouseover.call(g.canvas,g.display.image,a.target.pub,a.e,a.target)});if(g.opts.onmouseout)g.canvas.on("mouse:out",function(a){g.display.image&&a.target&&g.opts.onmouseout.call(g.canvas,g.display.image,a.target.pub,a.e,a.target)});g.opts.tooltip&&(g.canvas.on("mouse:over",function(b){g.display.image&&b.target&&a.tooltip(b.target.left+b.target.width+2,b.target.top+b.target.height+2,g.opts.tooltip,g.display.image,b.target.pub,b.e,b.target)}),g.canvas.on("mouse:out",function(b){g.display.image&& +b.target&&a.tooltip(b.target.left,b.target.top,null,g.display.image,b.target.pub,b.e,b.target)}))}else g.canvas.on("mouse:down",function(b){if(g.canvas._selection=g.canvas.selection)g.canvas.selection=a.specialKey(b.e)}),g.canvas.on("mouse:up",function(){g.canvas.selection=g.canvas._selection||g.canvas.selection});"function"===typeof g.opts.ongroupcreate&&(g.opts.canvas.selection=!0,g.opts.selectable=!0,g.canvas.on("selection:created",function(a){var b=[],c=[];g.display.image&&a.target&&"group"=== +a.target.type&&(a.target.forEachObject(function(a){a.pub&&(c.push(a),b.push(a.pub))}),g.opts.ongroupcreate.call(g.canvas,g.display.image,b,a.e,c))}));g.canvas.on("object:modified",function(b){var c=[];if(b.target){var d=b.target;a.Fabric.updateChildren(g,d,"deltas");if(g.opts.sortOverlapping&&(d.setCoords(),g.canvas.forEachObject(function(a){a!==d&&d.intersectsWithObject(a)&&(1===fabric.major_version?(e=a.getWidth(),f=a.getHeight()):(e=a.getScaledWidth(),f=a.getScaledHeight()),c.push({obj:a,siz:e* +f}))}),c.length)){if(1===fabric.major_version){var e=d.getWidth();var f=d.getHeight()}else e=d.getScaledWidth(),f=d.getScaledHeight();c.push({obj:d,siz:e*f});c.sort(function(a,b){return a.sizb.siz?1:0});var h=c.length;for(b=0;b$.inArray(k,e)&&d.addWithUpdate(k)}if(h.params.children)for(k=0;k$.inArray(p,e)&&d.addWithUpdate(p)}switch(h.type){case "polyline":case "polygon":a.Fabric.removePolygonAnchors(g,h)}h&&g.display.image&&g.display.image.updateShapes(c,h,"select")}}g.canvas.renderAll()}else f(g,d)}),g.canvas.on("before:selection:cleared",function(a){var b= +g.canvas.getActiveObject();if("activeSelection"===b.type){var c=g.canvas.getActiveObjects(a);for(a=0;af)&&(f=b.zindex,c=e));a=c}return a};a.Fabric._parseShapeOptions=function(c, @@ -17248,6 +17250,182 @@ JS9.RegisterPlugin(JS9.Separate.CLASS, JS9.Separate.NAME, JS9.Separate.init, winResize: true, winDims: [JS9.Separate.WIDTH, JS9.Separate.HEIGHT]}); +/* + * status plugin (February 20, 2020) + */ + +/*global $, sprintf, JS9 */ + +"use strict"; + +// create our namespace, and specify some meta-information and params +JS9.Statusbar = {}; +JS9.Statusbar.CLASS = "JS9"; // class of plugins (1st part of div class) +JS9.Statusbar.NAME = "Statusbar"; // name of this plugin (2nd part of div class) +JS9.Statusbar.WIDTH = 512; // width of light window +JS9.Statusbar.HEIGHT = 24; // height of light window +JS9.Statusbar.BASE = JS9.Statusbar.CLASS + JS9.Statusbar.NAME; + +// when an item is clicked, we want to highlight it +JS9.Statusbar.setup = function(target){ + // unhighlight + $(target).removeClass("JS9StatusbarItemNoHighlight"); + $(target).addClass("JS9StatusbarItemHighlight"); +}; + +// try to display a control plugin for a given menu +JS9.Statusbar.xeq = function(target){ + let s, arr; + // unhighlight + $(target).removeClass("JS9StatusbarItemHighlight"); + $(target).addClass("JS9StatusbarItemNoHighlight"); + // look at the html for this element + s = $(target).html(); + if( s ){ + // is there a hint about what sort of menu status it contains? + arr = s.match(/file|edit|view|zoom|scale|color|regions|wcs|analysis/i); + } + // bring up a control plugin, if possible + if( arr && arr[0] ){ + switch(arr[0]){ + case "file": + break; + case "edit": + break; + case "view": + break; + case "zoom": + break; + case "scale": + JS9.DisplayPlugin("JS9Scale"); + break; + case "color": + break; + case "regions": + break; + case "wcs": + break; + case "analysis": + break; + } + } +} + +// redraw status on display +JS9.Statusbar.display = function(im){ + let i, status; + let s = ""; + if( im && JS9.globalOpts.statusBar ){ + if( $.isArray(JS9.globalOpts.statusBar) ){ + // array of parameter names + for(i=0; i%s: $%s", status, status); + } + } else { + // formatted string + // escape brackets and parens before macro expansion, then unescape + s = JS9.globalOpts.statusBar + .replace(/\(/g, " __OP__ ") + .replace(/\)/g, " __CP__ ") + .replace(/\[/g, " __OB__ ") + .replace(/\]/g, " __CB__ "); + s = im.expandMacro(s) + .replace(/ __OP__ /g, "(") + .replace(/ __CP__ /g, ")") + .replace(/ __OB__ /g, "[") + .replace(/ __CB__ /g, "]"); + // wrap in element containers + s = `${s}` + .replace(/: */g, ": ") + .replace(/; */g, " "); + } + this.statusContainer.html(s); + } else { + this.statusContainer.html(""); + } +}; + +// constructor: add HTML elements to the plugin +// eslint-disable-next-line no-unused-vars +JS9.Statusbar.init = function(width, height){ + // on entry, these elements have already been defined: + // this.div: the DOM element representing the div for this plugin + // this.divjq: the jquery object representing the div for this plugin + // this.id: the id of the div (or the plugin name as a default) + // this.display: the display object associated with this plugin + // this.dispMode: display mode (for internal use) + // + // set width and height of plugin itself + this.width = this.divjq.attr("data-width"); + if( !this.width ){ + this.width = width || JS9.Statusbar.WIDTH; + } + this.divjq.css("width", this.width); + this.width = parseInt(this.divjq.css("width"), 10); + this.height = this.divjq.attr("data-height"); + if( !this.height ){ + this.height = height || JS9.Statusbar.HEIGHT; + } + this.divjq.css("height", this.height); + this.height = parseInt(this.divjq.css("height"), 10); + // clean plugin container + this.divjq.html(""); + // status container + this.statusContainer = $("
") + .addClass(`${JS9.Statusbar.BASE}Container`) + .attr("id", `${this.id}Container`) + .attr("width", this.width) + .attr("height", this.height) + .appendTo(this.divjq); + // display current status, if necessary + if( this.display.image ){ + JS9.Statusbar.display.call(this, this.display.image); + } +}; + +// callback when image is (re-)displayed +JS9.Statusbar.imagedisplay = function(im){ + if( im ){ + JS9.Statusbar.display.call(this, im); + } +}; + +// callback when image is cleared or closed +// eslint-disable-next-line no-unused-vars +JS9.Statusbar.imageclear = function(im){ + JS9.Statusbar.display.call(this, null); +}; + +// dynamic change +JS9.Statusbar.dynamic = function(im){ + let status; + if( im ){ + status = im.display.pluginInstances.JS9Statusbar; + if( status && status.isDynamic ){ + JS9.Statusbar.imagedisplay.call(this, im); + } + } +}; + +// add this plugin into JS9 +JS9.RegisterPlugin(JS9.Statusbar.CLASS, JS9.Statusbar.NAME, JS9.Statusbar.init, + {menuItem: "Status", + dynamicSelect: true, + ondynamicselect: JS9.Statusbar.dynamic, + onimagedisplay: JS9.Statusbar.imagedisplay, + onimageclear: JS9.Statusbar.imageclear, + onimageclose: JS9.Statusbar.imageclear, + onsetcolormap: JS9.Statusbar.imagedisplay, + onsetcontrastbias: JS9.Statusbar.imagedisplay, + onsetpan: JS9.Statusbar.imagedisplay, + onsetscale: JS9.Statusbar.imagedisplay, + onsetwcssys: JS9.Statusbar.imagedisplay, + onsetwcsunits: JS9.Statusbar.imagedisplay, + onsetzoom: JS9.Statusbar.imagedisplay, + help: "help/status.html", + winTitle: "Status", + winDims: [JS9.Statusbar.WIDTH, JS9.Statusbar.HEIGHT]}); /* * image sync plugin (September 2, 2018) * whenever an operation is performed on this image, sync the target images diff --git a/js9.js b/js9.js index 86cff500..90fac1fc 100644 --- a/js9.js +++ b/js9.js @@ -228,9 +228,11 @@ JS9.globalOpts = { }, // keyboard actions mousetouchZoom: false, // use mouse wheel, pinch to zoom? metaClickPan: true, // metaKey + click pans to mouse position? + // statusBar: ["zoom", "scale", "colormap", "wcssys"], // status display + statusBar: "zoom: $zoom; scale: $scale/$scaleclipping($scalemin,$scalemax); color: $colormap($contrast,$bias); wcs: $wcssys($wcsunits)", // status display toolbarTooltips: false, // display tooltips on toolbar? centerDivs: ["JS9Menubar"], // divs which take part in JS9.Display.center() - resizeDivs: ["JS9Menubar", "JS9Colorbar", "JS9Toolbar"], // divs which take part in JS9.Display.resize() + resizeDivs: ["JS9Menubar", "JS9Colorbar", "JS9Toolbar", "JS9Statusbar"], // divs which take part in JS9.Display.resize() pinchWait: 8, // number of events to wait before testing pinch pinchThresh: 6, // threshold for pinch test xeqPlugins: true, // execute plugin callbacks? @@ -259,13 +261,13 @@ JS9.globalOpts = { menuBar: ["file", "edit", "view", "zoom", "scale", "color", "region", "wcs", "analysis", "help"], menubarStyle: "classic", // mac or classic menuPosition: "right-5 bottom-5", // where menus pop up - menuClickEvent: "mouseup", // "click" or "mouse" + menuClickEvent: "mouseup", // "click" or "mouseup" menuSelected: "check", // selected option icon userMenus: false, // add user menus? userMenuDivider: "   ", // divide before user menu imagesFileSubmenu: 5, // how many images trigger a submenu? toolBar: ["annulus", "box", "circle", "ellipse", "line", "polygon", "text", "linear", "log", "zoom+", "zoom-", "zoom1"], - syncOps: ["colormap","contrastbias","flip","pan","regions","rot90","scale","wcs","zoom"], // which ops are sync'ed? + syncOps: ["colormap","contrastbias","flip","pan","regions","rot90","scale","wcs","zoom"], // which ops are sync'ed? syncReciprocate: true, // default value for reciprocal sync'ing syncWCS: true, // default value for using WCS to sync hiddenPluginDivs: [], // which static plugin divs start hidden @@ -5630,6 +5632,43 @@ JS9.Image.prototype.expandMacro = function(s, opts){ } } } + // look for params in the image object + if( r === undefined && this.params[t] !== undefined ){ + // shorten some of the results + switch(t){ + case "wcsunits": + switch(this.params[t]){ + case "sexagesimal": + r = "hms"; + break; + case "degrees": + r = "deg"; + break; + default: + r = this.params[t]; + break; + } + break; + case "scaleclipping": + switch(this.params[t]){ + case "dataminmax": + r = "data"; + break; + default: + r = this.params[t]; + break; + } + break; + default: + if( typeof this.params[t] === "number" && + this.params[t] !== Math.floor(this.params[t]) ){ + r = this.params[t].toFixed(2); + } else { + r = this.params[t]; + } + break; + } + } // if all else fails, return original macro unexpanded if( r === undefined ){ r = m; @@ -10037,6 +10076,14 @@ JS9.Display.prototype.resize = function(width, height, opts){ JS9.Colorbar.init.call(pinst); } } + // change the statusbar width, unless explicitly told not to + if( $.inArray("JS9Statusbar", JS9.globalOpts.resizeDivs) >= 0 && + (JS9.isNull(opts.resizeStatusbar) || opts.resizeStatusbar) ){ + pinst = this.pluginInstances.JS9Statusbar; + if( pinst ){ + $(`#${this.id}Statusbar`).css("width", nwidth); + } + } // change size of shape canvases for( key in this.layers ){ if( this.layers.hasOwnProperty(key) ){ diff --git a/js9.min.js b/js9.min.js index 94d411f1..9d3fa167 100644 --- a/js9.min.js +++ b/js9.min.js @@ -22,221 +22,223 @@ maxMemory:2E9,corsURL:"params/loadcors.html",proxyURL:"params/loadproxy.html",lo color:"green"},imexamLineHeight:1,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:"pan to mouse position","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", x:"flip image around x axis",y:"flip image around y axis",9:"rotate image by 90 degrees","/":"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, -metaClickPan:!0,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:"$data.ra $data.dec"},topColormaps:"grey heat cool turbo 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",menuPosition:"right-5 bottom-5",menuClickEvent:"mouseup",menuSelected:"check",userMenus:!1,userMenuDivider:"   ",imagesFileSubmenu:5,toolBar:"annulus box circle ellipse line polygon text linear log zoom+ zoom- zoom1".split(" "), -syncOps:"colormap contrastbias flip pan regions rot90 scale wcs zoom".split(" "),syncReciprocate:!0,syncWCS:!0,hiddenPluginDivs:[],separate:{layout:"auto",leftMargin:10,topMargin:10},imageTemplates:".fits,.fts,.png,.jpg,.jpeg,.fz,.ftz",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",localTemplates:".fits,.fts", -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,flip:"none",rot90:0,zscalecontrast:.25,zscalesamples:600,zscaleline:120,wcssys:"native",lcs:"physical",valpos:!0,sigma:"none",opacity:1,alpha:255,nancolor:"#000000",nocolor:{red:0,green:0,blue:0,alpha:0}, -zoom:1,zooms:6,topZooms:2,wcsalign:!0,rotationMode:"relative",crosshair:!1,disable:[],ltvbug:!1,listonchange:!1,whichonchange:"selected"};a.regionOpts={};a.catalogOpts={};a.crosshairOpts={};a.gridOpts={};a.emscriptenOpts={};a.blendOpts={active:!0,mode:"screen",opacity:1};a.maskOpts={active:!1,mode:"overlay",opacity:1,value:0,syncops:["flip","pan","rot90","zoom"],invert:!1};a.analOpts={epattern:/^(ERROR:[^\n]*)\n/,dpathURL:"params/datapath.html",fpathURL:"params/filepath.html"};a.lightOpts={nclick:0, -dhtml:{top:".dhtmlwindow",drag:".drag-contentarea",dragBar:"drag-handle",format:"width=%spx,height=%spx,center=1,resize=%s,scrolling=0",textWin:"width=830px,height=400px,center=1,resize=1,scrolling=1",plotWin:"width=830px,height=420px,center=1,resize=1,scrolling=1",dpathWin:"width=830px,height=175px,center=1,resize=1,scrolling=1",lcloseWin:"width=512px,height=190px,center=1,resize=1,scrolling=1",paramWin:"width=830px,height=235px,center=1,resize=1,scrolling=1",regWin0:"width=600px,height=72px,center=1,resize=1,scrolling=1", -regWin:"width=600px,height=235px,center=1,resize=1,scrolling=1",imageWin:"width=512px,height=598px,center=1,resize=1,scrolling=1",lineWin:"width=400px,height=60px,center=1,resize=1,scrolling=1"},lcloseURL:"params/lightclose.html"};a.textColorOpts={regions:"#00FF00",info:"#00FF00",inimage:"#000000"};a.helpOpts={user:{heading:"JS9Help",type:"help",url:"user.html",title:"User Manual"},install:{heading:"JS9Help",type:"help",url:"install.html",title:"Installing JS9"},webpage:{heading:"JS9Help",type:"help", -url:"webpage.html",title:"Adding JS9 to a Web Page"},yourdata:{heading:"JS9Help",type:"help",url:"yourdata.html",title:"Adding Data to a Web Page"},localtasks:{heading:"JS9Help",type:"help",url:"localtasks.html",title:"Adding Local Analysis Tasks and Plugins"},helper:{heading:"JS9Help",type:"help",url:"helper.html",title:"Adding Server-side Analysis Tasks"},serverside:{heading:"JS9Help",type:"help",url:"serverside.html",title:"Server-side Analysis with JS9"},publicapi:{heading:"JS9Help",type:"help", -url:"publicapi.html",title:"The JS9 Public API"},extmsg:{heading:"JS9Help",type:"help",url:"extmsg.html",title:"External Messaging"},desktop:{heading:"JS9Help",type:"help",url:"desktop.html",title:"JS9 on the Desktop"},python:{heading:"JS9Help",type:"help",url:"python.html",title:"JS9 with Python and Jupyter"},archives:{heading:"JS9Help",type:"help",url:"archives.html",title:"Accessing Data Archives"},preferences:{heading:"JS9Help",type:"help",url:"preferences.html",title:"Setting Site Preferences"}, -regions:{heading:"JS9Help",type:"help",url:"regions.html",title:"Regions Format"},changelog:{heading:"JS9Help",type:"help",url:"changelog.html",title:"ChangeLog"},repfile:{heading:"JS9Help",type:"help",url:"repfile.html",title:"Dealing with Large Files"},memory:{heading:"JS9Help",type:"help",url:"memory.html",title:"Dealing with Memory Limitations"},issues:{heading:"JS9Help",type:"help",url:"knownissues.html",title:"Known Issues"}};a.images=[];a.displays=[];a.colormaps=[];a.commands=[];a.plugins= -[];a.preloads=[];a.auxFiles=[];a.supermenus=[];a.publics={};a.helper={};a.fits={};a.userOpts={};a.preloadwaiting={};a.scales="linear log histeq power sqrt squared asinh sinh".split(" ");a.wcssyss="FK4 FK5 ICRS galactic ecliptic native image physical".split(" ");a.wcsunitss=["degrees","sexagesimal","pixels"];a.bugs={};a.bugs.hide_menu=!1;"Firefox"===a.BROWSER[0]&&0<=a.BROWSER[2].search(/Linux/)&&(a.bugs.firefox_linux=!0);if("Chrome"===a.BROWSER[0]||"Safari"===a.BROWSER[0])a.bugs.webkit_resize=!0;"Chrome"!== -a.BROWSER[0]&&(a.globalOpts.imageTemplates+=",.gz");/iPad|iPhone|iPod/.test(navigator.platform)&&/11_2_(?:[2-9])/.test(navigator.userAgent)&&(a.globalOpts.useWasm=!1);a.BROWSER[3]&&(a.globalOpts.maxMemory=Math.min(a.globalOpts.maxMemory,35E7),a.globalOpts.table.xdim=2048,a.globalOpts.table.ydim=2048,a.globalOpts.image.xdim=2048,a.globalOpts.image.ydim=2048,a.imageOpts.crosshair=!1,a.globalOpts.reproj={xdim:2048,ydim:2048});window.hasOwnProperty("Jupyter")&&(a.globalOpts.useWasm=!1);if(window.isElectron){"Chrome"=== -a.BROWSER[0]&&66<=parseFloat(a.BROWSER[1])&&(a.globalOpts.allowFileWasm=!0);if(!window.electronVersion||5>parseInt(window.electronVersion,10))a.globalOpts.internalColorPicker=!1;a.hasNode="object"===typeof process&&"function"===typeof require;a.hasNode&&(a.localMount=require("os").hostname()||"localAccess");window.multiElectron&&(a.globalOpts.localStorage=!1);window&&"function"===typeof window.eval&&(window.eval=function(){throw Error("For security reasons, Desktop JS9 does not support window.eval()"); -})}a.Image=function(c,b,d){var e=this,f=null,g=0,h=0,k=function(b){b=b||{};a.isNull(b.scaleclipping)?"zscale"===e.params.scaleclipping?e.zscale(!0):"zmax"===e.params.scaleclipping&&e.zscale("zmax"):"zscale"===b.scaleclipping?e.zscale(!0):"zmax"===b.scaleclipping&&e.zscale("zmax");a.notNull(b.scalemin)&&(e.params.scalemin=b.scalemin);a.notNull(b.scalemax)&&(e.params.scalemax=b.scalemax)},l=function(b){var c=a.globalOpts.imopts,d=a.globalOpts.imcmap,g=a.globalOpts.alerts;var h=/(annulus|box|circle|ellipse|line|polygon|point|text) *\(/; -e.display.clearMessage();a.images.push(e);e.notifyHelper();e.showShapeLayer("regions",!0,{local:!0});f&&((a.notNull(f.x)&&a.notNull(f.y)||a.notNull(f.px)&&a.notNull(f.py)||a.notNull(f.ra)&&a.notNull(f.dec)||a.notNull(f.wcs))&&e.setPan(f),f.regions&&(f.regions.match(h)?e.addShapes("regions",f.regions):a.LoadRegions(f.regions,{display:e.display})));a.globalOpts.alerts=!1;if(e.raw&&e.raw.header&&e.raw.header[d]){try{var k=JSON.parse(e.raw.header[d])}catch(x){k=null}if(k)try{a.AddColormap(k)}catch(x){}}if(e.raw&& -e.raw.header&&e.raw.header[d+"1"]){var l=1;for(h="";100>l;l++){var m=d+String(l);if(e.raw.header[m])h+=e.raw.header[m];else break}if(h){try{k=JSON.parse(h)}catch(x){k=null}if(k)try{a.AddColormap(k)}catch(x){}}}if(e.raw&&e.raw.header&&e.raw.header[c]){try{k=JSON.parse(e.raw.header[c])}catch(x){k=null}if(k)try{e.setParam("all",k)}catch(x){}}if(e.raw&&e.raw.header&&e.raw.header[c+"1"]){l=1;for(h="";100>l;l++)if(m=c+String(l),e.raw.header[m])h+=e.raw.header[m];else break;if(h){try{k=JSON.parse(h)}catch(x){k= -null}if(k)try{e.setParam("all",k)}catch(x){}}}a.globalOpts.alerts=g;e.xeqPlugins("image","onimageload");e.updateshapes&&e.updateShapes("regions","all","update");e.setStatus("load","complete");a.waiting(!1);if(b)try{a.xeqByName(b,window,e)}catch(x){a.error("in image onload callback",x,!1)}h=e.proxyURL||e.file;b=h.replace(/\[.*\]/,"");if(a.preloadwaiting[h]||a.preloadwaiting[b])if(delete a.preloadwaiting[h],delete a.preloadwaiting[b],!Object.keys(a.preloadwaiting).length&&a.notNull(a.globalOpts.onpreload))try{a.xeqByName(a.globalOpts.onpreload, -window,e)}catch(x){a.error("in onpreload callback",x,!1)}f&&f.allext&&e.hdus&&0=f.length&&a.cleanupFITSFile(g,!0));g.altwcs&&this.freeWCS(g)}e.removeProxyFile();e.rgb=null;e.offscreen=null;e.raw=null;e.colorData=null;e.colorCells=null;e.psColors=null;e.psInverse=null;a.images.splice(b,1);break}if(d){for(b=d-=2;0<=b;b--)if(e= -a.images[b],this.display===e.display){e.displayImage("all");e.refreshLayers();d=a.images.length;break}for(b=a.images.length-1;b>d;b--)if(e=a.images[b],this.display===e.display){e.displayImage("all");e.refreshLayers();break}}};a.Image.prototype.mkOffScreenCanvas=function(){if(!this.png||!this.png.image)return this;this.offscreen={};this.offscreen.canvas=document.createElement("canvas");this.offscreen.canvas.setAttribute("width",this.png.image.width);this.offscreen.canvas.setAttribute("height",this.png.image.height); -this.offscreen.context=this.offscreen.canvas.getContext("2d");a.ANTIALIAS||(this.offscreen.context.imageSmoothingEnabled=!1,this.offscreen.context.webkitImageSmoothingEnabled=!1,this.offscreen.context.msImageSmoothingEnabled=!1);this.offscreen.context.drawImage(this.png.image,0,0);try{this.offscreen.img=this.offscreen.context.getImageData(0,0,this.png.image.width,this.png.image.height)}catch(c){a.CHROMEFILEWARNING&&"Chrome"===a.BROWSER[0]&&""===document.domain?alert("When using the file:// URI, Chrome must be run with the --allow-file-access-from-files switch to permit JS9 to access data."): -alert("could not read off-screen image data [same-origin policy violation?]")}return this};a.Image.prototype.initLCS=function(c){var b=[[0,0,0],[0,0,0],[0,0,0]];c=c||this.raw.header;var d=c.CRPIX1||1,e=c.CRPIX2||1;if(c.LCSROTA2&&c.CROTA2){var f=-c.CROTA2*Math.PI/180;var g=Math.sin(f);var h=Math.cos(f);f=[[0,0,0],[0,0,0],[0,0,0]];f[0][0]=h;f[0][1]=-g;f[0][2]=0;f[1][0]=g;f[1][1]=h;f[1][2]=0;(g=a.invertMatrix3(f))||(f=null)}b[0][0]=a.defNull(c.LTM1_1,1);b[1][0]=c.LTM2_1||0;b[0][1]=c.LTM1_2||0;b[1][1]= -a.defNull(c.LTM2_2,1);b[2][0]=c.LTV1||0;b[2][1]=c.LTV2||0;if("image"===this.imtab&&this.params.ltvbug){if(a.notNull(c.LTV1))for(h=0;2>h;h++){var k=Math.abs(b[0][h]);0k&&(b[2][0]+=.5*k)}if(a.notNull(c.LTV2))for(h=0;2>h;h++)k=Math.abs(b[1][h]),0k&&(b[2][1]+=.5*k)}this.lcs.physical={forward:$.extend(!0,[],b),reverse:a.invertMatrix3(b)};this.lcs.physical.reverse?f&&(this.lcs.physical.frot=$.extend(!0,[],f),this.lcs.physical.rrot=$.extend(!0,[],g),this.lcs.physical.cx=d-b[2][0]-1,this.lcs.physical.cy= -e-b[2][1]-1):delete this.lcs.physical;b[0][0]=a.defNull(c.DTM1_1,1);b[1][0]=c.DTM2_1||0;b[0][1]=c.DTM1_2||0;b[1][1]=a.defNull(c.DTM2_2,1);b[2][0]=c.DTV1||0;b[2][1]=c.DTV2||0;this.lcs.detector={forward:$.extend(!0,[],b),reverse:a.invertMatrix3(b)};this.lcs.detector.reverse?f&&(this.lcs.detector.frot=$.extend(!0,[],f),this.lcs.detector.rrot=$.extend(!0,[],g),this.lcs.detector.cx=d-b[2][0]-1,this.lcs.detector.cy=e-b[2][1]-1):delete this.lcs.detector;b[0][0]=a.defNull(c.ATM1_1,1);b[1][0]=c.ATM2_1||0; -b[0][1]=c.ATM1_2||0;b[1][1]=a.defNull(c.ATM2_2,1);b[2][0]=c.ATV1||0;b[2][1]=c.ATV2||0;this.lcs.amplifier={forward:$.extend(!0,[],b),reverse:a.invertMatrix3(b)};this.lcs.amplifier.reverse?f&&(this.lcs.amplifier.frot=$.extend(!0,[],f),this.lcs.amplifier.rrot=$.extend(!0,[],g),this.lcs.amplifier.cx=d-b[2][0]-1,this.lcs.amplifier.cy=e-b[2][1]-1):delete this.lcs.amplifier;this.params&&!this.lcs[this.params.lcs]&&(this.params.lcs="image");this.params&&!this.params.wcssys0&&(this.setWCSSys("physical"),this.params.wcssys0= -this.params.lcs);this.lcs.physical&&!this.lcs.ophysical&&(this.lcs.ophysical=$.extend(!0,{},this.lcs.physical));return this};a.Image.prototype.mkRawDataFromIMG=function(c){var b,d;if(c){var e=c.height;var f=c.width;var g=c.data;this.raws.push({from:"img"});this.raw=this.raws[this.raws.length-1];this.raw.id=a.RAWID0;this.raw.data=new Float32Array(e*f);for(d=c=0;dc||m)this.mkRawDataFromIMG(this.offscreen.img);else{c=f.join("");2l.naxis&&a.error("can't image a FITS file with less than 2 dimensions"); -if(this.raw){var m=this.raw;var n=this.raw.width;var q=this.raw.height;var p=this.raw.bitpix;var u=this.params.wcssys;var r=this.params.wcsunits;this.freeWCS()}this.raws=this.raws||[];if(g=this.raws.length){b.rawid=b.rawid||a.RAWIDX;for(e=f=0;ef&&(f=1/Math.abs(f)),a.notNull(e.NAXIS1)&&(e.NAXIS1/=f),a.notNull(e.NAXIS2)&&(e.NAXIS2/=f),a.notNull(e.CRPIX1)&&(e.CRPIX1=(e.CRPIX1+1-h-.5)/f+.5),a.notNull(e.CRPIX2)&&(e.CRPIX2=(e.CRPIX2+1-k-.5)/f+.5),a.notNull(e.CDELT1)&&(e.CDELT1*=f),a.notNull(e.CDELT2)&&(e.CDELT2*=f),a.notNull(e.CD1_1)&&(e.CD1_1*=f),a.notNull(e.CD1_2)&&(e.CD1_2*=f),a.notNull(e.CD2_1)&&(e.CD2_1*=f),a.notNull(e.CD2_2)&&(e.CD2_2*=f),e.LTM1_1=a.defNull(e.LTM1_1,1),e.LTM1_1/=f,e.LTM2_1=e.LTM2_1||0,e.LTM2_1/= -f,e.LTM1_2=e.LTM1_2||0,e.LTM1_2/=f,e.LTM2_2=a.defNull(e.LTM2_2,1),e.LTM2_2/=f,e.LTV1=e.LTV1||0,e.LTV1=(e.LTV1-h)/f+.5,e.LTV2=e.LTV2||0,e.LTV2=(e.LTV2-k)/f+.5;b.lcsUseRota2&&(e.LCSROTA2=!0);b.file&&b.file!==this.file?(this.file=b.file,this.id=null):b.filename&&b.filename!==this.file?(this.file=b.filename,this.id=null):l.filename&&l.filename!==this.file&&(this.file=l.filename,this.id=null);this.file0=this.file=this.file||a.ANON+a.uniqueID();b.id&&(this.id0=b.id,this.id=a.getImageID(b.id,this.display.id, -this));this.id||!this.file||this.file.match(/\[.*[^a-zA-Z0-9_].*\]/)||(b.extname||b.extnum?(b.extname?(this.file=this.file.replace(/\[.*\]/,""),this.file+="["+b.extname+"]"):b.extnum&&0]/);m=c=!1;e=0;for(b=!1;e=this.raw.header.NAXIS&&(!this.hdus||1===this.hdus.length)?c=!0:(c=!1,b=!0);break;case "nocube":2>=this.raw.header.NAXIS?c=!0:(c=!1,b=!0);break;case "noext":this.hdus&&1!==this.hdus.length?(c=!1, -b=!0):c=!0;break;case "size":t[e+1]?a.vsize(l.fits.vfile)>1E6*t[e+1]?c=!0:(c=!1,b=!0):(c=!1,b=!0)}c?(2d.x0&&(a.globalOpts.panWithinDisplay?d.x1-=d.x0:d.ix=d.x0*d.zoom,d.x0=0);0>d.y0&&(a.globalOpts.panWithinDisplay?d.y1-=d.y0:d.iy=d.y0*d.zoom,d.y0=0);d.x1>this.raw.width&&(a.globalOpts.panWithinDisplay?d.x0-=d.x1-this.raw.width: -d.ix=(d.x1-this.raw.width)*d.zoom,d.x1=this.raw.width);d.y1>this.raw.height&&(a.globalOpts.panWithinDisplay?d.y0-=d.y1-this.raw.height:d.iy=(d.y1-this.raw.height)*d.zoom,d.y1=this.raw.height);0d.ix&&d.x1d.iy&&d.y1=d.width||0>=d.height)b=sprintf("invalid image section: %s,%s [%s,%s, %s,%s, %s]",d.width,d.height,d.x0,d.y0,d.x1,d.y1,d.zoom),a.error(b);this.offscreenRGB=null;this.params.zoom=d.zoom;return this}; -a.Image.prototype.mkColorData=function(){var c,b=a.SCALESIZE,d=this.params.scalemin,e=this.params.scalemax,f=this.raw.width*this.raw.height,g=(b-1)/(e-d);if("static"===this.cmapObj.type)return this;if(!this.colorData||this.colorData.length=e?b-1:Math.floor((h-d)*g+.5)}return this};a.Image.prototype.calcContrastBias=function(c){var b=this.params.bias,d=a.COLORSIZE,e=this.params.contrast;if(1E-4>b- -.5&&1E-4>e-1)return c;this.params.invert&&(b=1-b);c=Math.floor(((c/d-b)*e+.5)*d);return 0>c?0:c>=d?d-1:c};a.Image.prototype.mkColorCells=function(){var c,b=a.COLORSIZE;if("static"===this.cmapObj.type)return this;this.colorCells||(this.colorCells=[]);for(c=0;cb;b+=2,c++){var m="0123456789ABCDEF".indexOf(k.charAt(b));var n="0123456789ABCDEF".indexOf(k.charAt(b+1));l[c]=16*m+n}h[NaN]=l}this.psInverse||(this.psInverse=[],this.psInverse[NaN]=0);k=this.params.scalemax-this.params.scalemin;b=this.params.scalemin;switch(this.params.scale){case "linear":for(h= -0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c]; -for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h= -b&&l[h]<=p&&(n=Math.floor((l[h]-b)/k*g+.5),n=n&&ld);n++);c=n/g;this.psInverse[h]=c*k+b}break;default:a.error("unknown scale '"+this.params.scale+"'")}return this};a.Image.prototype.mkRGBImage=function(){var c,b, -d,e,f=!1,g=null,h=null,k=null,l=!1,m=!1,n=!1,q=!1,p=[];if(!this.rgb)return this;!a.globalOpts.rgb.active||this!==a.globalOpts.rgb.rim&&this!==a.globalOpts.rgb.gim&&this!==a.globalOpts.rgb.bim||(l=!0,a.globalOpts.rgb.rim&&(g=a.globalOpts.rgb.rim),a.globalOpts.rgb.gim&&(h=a.globalOpts.rgb.gim),a.globalOpts.rgb.bim&&(k=a.globalOpts.rgb.bim));var u=this.display.context;var r=this.rgb;var t=r.sect;if(this.MakeRGBImage&&"function"===typeof this.MakeRGBImage&&this.MakeRGBImage()||this.MakePrimaryImage&& -"function"===typeof this.MakePrimaryImage&&this.MakePrimaryImage())return this;if(this.rgbFile){var v=t.width/t.zoom;var y=t.height/t.zoom;var w=t.x0;var x=this.offscreen.canvas.height-1-(t.y0+y);x=this.offscreen.context.getImageData(w,x,v,y);if(1===t.zoom)r.img=x;else for(r.img=u.createImageData(t.width,t.height),r=r.img,d=c=0;c=t.y0;c-=N,d++)for(A=c*this.raw.width,z=d*P,u=Math.floor(t.x0),b=0;uthis.mask.value?L:K:n&&(G=255*M.raw.data[A+u]);if(l){if(x=g?g.colorData[A+u]:0,v=h?h.colorData[A+u]:0,y=k?k.colorData[A+u]:0,a.isNull(x)||a.isNull(v)||a.isNull(y))return a.globalOpts.rgb.active=!1,a.error("RGB images are incompatible. Turning off RGB mode.","",!1),this.mkRGBImage(),this}else this.staticObj||(w=this.colorData[A+u]);var Q=G;f&&this.raw.data[A+ -u]<=R&&(Q=J);B=b*P;for(e=0;eh&&(h=a.pts[r].x),a.pts[r].xm&&(m=a.pts[r].y),a.pts[r].yc.bin&&(c.bin=1/Math.floor(1/c.bin+.5));c.filter=n(c.filter,p.filter,"");this.raw.filter=c.filter||"";!1!==c.waiting&&a.waiting(!0,this.display);this.setStatus("displaySection","processing");window.setTimeout(function(){switch(f){case "parentFile":e=d.proxyFile;m=[];m.push({name:"xcen",value:c.xcen});delete c.xcen;m.push({name:"ycen",value:c.ycen});delete c.ycen;m.push({name:"xdim",value:c.xdim});m.push({name:"ydim",value:c.ydim});void 0!==c.xdim&&(c.xdim=0);void 0!==c.ydim&&(c.ydim=0);c.binMode&& -(c.bin=""+c.bin+c.binMode,delete c.binMode);m.push({name:"bin",value:c.bin});delete c.bin;m.push({name:"filter",value:c.filter||""});m.push({name:"slice",value:c.slice||""});delete c.slice;g={id:d.expandMacro("$id"),image:d.file,fits:d.parentFile,rtype:"text"};g.cmd="js9Xeq imsection "+d.parentFile;c.extension&&(g.cmd=g.cmd.replace(/\[.*\]/,""),g.cmd+="["+c.extension+"]",delete c.extension);g.cmd+=d.expandMacro(" $xdim@$xcen,$ydim@$ycen,$bin $filter $slice",m);a.helper.send("imsection",g,function(b){b= -"object"===typeof b?b:0<=b.search(a.analOpts.epattern)?{stderr:b}:{stdout:b};if(b.stderr)a.error(b.stderr);else if(b.errcode)a.error("in displaySection: "+b.errcode);else{var f=b.stdout.split(/\n/);b=a.cleanPath(f[0]);"/"!==b.charAt(0)&&(b=a.InstallDir(b));c.proxyFile=b;e&&e!==c.proxyFile&&d.removeProxyFile(e);if(f[1]){try{var g=JSON.parse(f[1])}catch(w){a.log("couldn't parse imsection as JSON: %s",b),g=null}g&&(c.extname=g.extname,c.extnum=g.extnum,c.hdus=g.hdus,c.binstr=g.binstr,c.parent=g)}f[2]&& -(g=a.cleanPath(f[2]),c.parentFile=g);a.fetchURL(b,b,c,function(b){a.cleanupFITSFile(d.raw,!0);!1!==c.waiting&&a.waiting(!0,d.display);a.fits.handleFITSFile(b,c,q)})}});break;case "virtualFile":a.cleanupFITSFile(d.raw,!1);a.getFITSImage(u.fits,u,c,function(a){q(a,c)});break;default:a.error("image section cannot be extracted from this data file")}},a.SPINOUT)};a.Image.prototype.displayExtension=function(c,b,d){var e=this,f,g,h=function(c){var f=$.extend(!0,{},b);f.separate=!0;if(c===e.hdus.length){if(d)try{a.xeqByName(d, -window,e)}catch(p){a.error("in displayExtension callback",p,!1)}}else{var g=e.hdus[c];"image"===g.type&&2<=g.naxis?e.displayExtension(g.hdu,f,function(){h(c+1)}):h(c+1)}};b=b||{};if("string"===typeof b)try{b=JSON.parse(b)}catch(m){a.error("can't parse extension opts: "+b,m)}b.waiting=!1;this.hdus||a.error("no FITS HDUs found for displayExtension()");a.isNull(c)&&a.error("missing extname/extnum for displayExtension()");if("all"===c)h(0);else{if("string"===typeof c){b.extension=c;var k=c.toLowerCase(); -for(g=f=0;fa;)a+=360;for(;360<=a;)a-=360;270===a&&(a=-90);return a},k=function(a,b){var c,d,e=a.data,f=b.data;b.width=a.height;b.height=a.width;for(d=0;dMath.abs(c.CD1_1)&&(c.CD1_1=0);1E-15>Math.abs(c.CD1_2)&&(c.CD1_2=0);1E-15>Math.abs(c.CD2_1)&&(c.CD2_1=0);1E-15>Math.abs(c.CD2_2)&&(c.CD2_2=0)}else a.notNull(f.CRPIX1)&&(e.raw.wcsinfo?(0>e.raw.wcsinfo.cdelt1&& -0>e.raw.wcsinfo.cdelt2||0Math.abs(c.LTM1_1)&&(c.LTM1_1=0);1E-15>Math.abs(c.LTM1_2)&&(c.LTM1_2=0);1E-15>Math.abs(c.LTM2_1)&&(c.LTM2_1=0);1E-15>Math.abs(c.LTM2_2)&&(c.LTM2_2=0)},q=function(b,c,d){var f=b.header,g=c.header;switch(d){case 0:c.header=b.header;break;case 90:case -270:g.NAXIS1=f.NAXIS2;g.NAXIS2=f.NAXIS1;a.notNull(f.CRPIX1)&&a.notNull(f.CRPIX2)&&(g.CRPIX1=g.NAXIS1-f.CRPIX2+1,g.CRPIX2=f.CRPIX1,m(b,c,d));g.LTV1=g.NAXIS1-(f.LTV2||0)+1;g.LTV2=f.LTV1|| -0;n(b,c,d);break;case 270:case -90:g.NAXIS1=f.NAXIS2;g.NAXIS2=f.NAXIS1;a.notNull(f.CRPIX1)&&a.notNull(f.CRPIX2)&&(g.CRPIX1=f.CRPIX2,g.CRPIX2=g.NAXIS2-f.CRPIX1+1,m(b,c,d));g.LTV1=f.LTV2||0;g.LTV2=f.NAXIS1-(f.LTV1||0)+1;n(b,c,d);break;default:a.error("unknown rot90 type: "+e.params.rot90)}};if(!b)return this;this&&this.raw&&this.raw.header||a.error("invalid image for rot90");this.raw.header.CTYPE1&&this.raw.header.CTYPE1.match(/HPX/)&&a.error("support for rotating HEALPix is not yet available");f=f|| -{};if("string"===typeof f)try{f=JSON.parse(f)}catch(p){a.error("can't parse rot90 opts: "+f,p)}switch(b){case 1:b=90;break;case -1:b=-90;break;case 90:break;case -90:break;default:a.error("invalid rot90 value: "+b+" (use: +/1, +/90)")}d=a.getRawCopy(g);switch(b){case 90:k(g,d);q(g,d,90);this.params.rot90=h(90);break;case -90:l(g,d),q(g,d,-90),this.params.rot90=h(-90)}this.raw=d;this.initWCS();this.initLCS();this.setPan();this.displayImage("all",f);this.refreshLayers();a.globalOpts.extendedPlugins&& -this.xeqPlugins("image","onsetrot90");return this};a.Image.prototype.reFlipRot90=function(){var a=this.params.flip;var b=this.params.rot90;if("none"!==a){this.params.flip="none";var d=a.split("");for(a=0;athis.raw.bitpix?.5:1,void 0!==this.raw.header.TABMIN1&&(e=e-h+this.raw.header.TABMIN1),void 0!==this.raw.header.TABMIN2&&(f=f-h+this.raw.header.TABMIN2)));return{x:e,y:f,sys:c}};a.Image.prototype.logicalToImagePos=function(a,b){var c={x:a.x,y:a.y};var e=this.raw.header.CRPIX1||1;var f=this.raw.header.CRPIX2|| -1;b=b||this.params.lcs||"image";switch(b){case "ophysical":if(this.lcs.ophysical){var g=this.lcs.ophysical.forward;var h=this.lcs.ophysical.frot}else this.lcs.physical&&(g=this.lcs.physical.forward,h=this.lcs.physical.frot);break;case "physical":this.lcs.physical&&(g=this.lcs.physical.forward,h=this.lcs.physical.frot);break;case "detector":this.lcs.detector&&(g=this.lcs.detector.forward,h=this.lcs.detector.frot);break;case "amplifier":this.lcs.amplifier&&(g=this.lcs.amplifier.forward,h=this.lcs.amplifier.frot)}g&& -("table"===this.imtab&&(b=0>this.raw.bitpix?.5:1,void 0!==this.raw.header.TABMIN1&&(a.x=a.x-this.raw.header.TABMIN1+b),void 0!==this.raw.header.TABMIN2&&(a.y=a.y-this.raw.header.TABMIN2+b)),c.x=a.x*g[0][0]+a.y*g[1][0]+g[2][0],c.y=a.x*g[0][1]+a.y*g[1][1]+g[2][1],h&&(a=e+(c.x-e)*h[0][0]+(c.y-f)*h[1][0]+h[2][0],h=f+(c.x-e)*h[0][1]+(c.y-f)*h[1][1]+h[2][1],c.x=a,c.y=h));return c};a.Image.prototype.displayToImagePos=function(a){var b=this.rgb.sect;return{x:(a.x-this.ix+.5)/b.zoom+b.x0+.5,y:(this.rgb.img.height- -(a.y-this.iy+.5))/b.zoom+b.y0+.5}};a.Image.prototype.imageToDisplayPos=function(a){var b=this.rgb.sect;return{x:(a.x-.5-b.x0)*b.zoom+this.ix-.5,y:(b.y0-(a.y-.5))*b.zoom+this.rgb.img.height+this.iy-.5}};a.Image.prototype.logicalToDisplayPos=function(a,b,d){return this.imageToDisplayPos(this.logicalToImagePos(a,b,d))};a.Image.prototype.displayToLogicalPos=function(a){return this.imageToLogicalPos(this.displayToImagePos(a))};a.Image.prototype.getWCSSys=function(){if(this.params.wcssys)return this.params.wcssys}; -a.Image.prototype.setWCSSys=function(c){if(!(0<=$.inArray("wcs",this.params.disable)))return"image"===c?(this.params.wcssys="image",this.params.wcsunits="pixels",a.wcsunits.image="pixels"):"physical"===c?(this.params.wcssys="physical",this.params.wcsunits="pixels",a.globalOpts.wcsUnits.physical="pixels"):this.raw.wcs&&0=this.raw.altwcs[b].wcs&&a.error("invalid WCS for version: %s",c),this.raw.wcs=this.raw.altwcs[b].wcs,this.raw.wcsinfo=this.raw.altwcs[b].wcsinfo,c=this.raw.wcsinfo&&this.raw.wcsinfo.radecsys?this.raw.wcsinfo.radecsys:"native"!==this.params.wcssys?this.params.wcssys.trim():this.params.lcs,this.setWCSSys(c),this.params.wcssys0||(this.params.wcssys0=c),this.setWCSUnits(this.params.wcsunits), -this}a.error("could not find WCS version: "+c)};a.Image.prototype.getWCSUnits=function(){return this.params.wcsunits?this.params.wcsunits:"pixels"};a.Image.prototype.setWCSUnits=function(c){if(!(0<=$.inArray("wcs",this.params.disable))){if("pixels"===c)"image"!==this.params.wcssys&&(this.params.wcssys="physical"),this.params.wcsunits="pixels",a.globalOpts.wcsUnits[this.params.wcssys]="pixels";else if(this.raw.wcs&&0c.search(/ERROR:/i))a.log(c); -else{k(c,a.analOpts.epattern);return}else if(n.errcode)if(c="ERROR: running "+f.name+" ["+n.errcode+"]",n.stdout)a.log(c);else{k(c,a.analOpts.epattern);return}switch(f.rtype){case "text":case void 0:e.displayAnalysis("text",n.stdout,{divid:a.globalOpts.analysisDiv});break;case "plot":e.displayAnalysis("plot",n.stdout,{divid:a.globalOpts.analysisDiv});break;case "alert":n.stdout&&alert(n.stdout);break;case "fits":case "png":(l=n.stdout.split(/\s+/))&&l[0]&&(c=a.cleanPath(l[0]),"/"!==c.charAt(0)&&(c= -a.InstallDir(c)),n={proxyFile:c},l[1]&&(l=a.cleanPath(l[1]),n.parentFile=l),n.fits2fits=!1,n.fixpath=!1,a.Load(c,n,{display:e.display}));break;case "regions":if((l=n.stdout.split(/\s+/))&&l[0]){if(1
");if(f)f.html(b);else{l=l||h.textWin;var n=a.lightWin(d,"inline",b,m,l)}break;case "plot":if(b&&"string"===typeof b)try{var q=JSON.parse(b)}catch(r){a.error("can't plot return data: "+ -b,r)}else"object"===typeof b&&(q=b);if(!q)return;q.curscale={x:"linear",y:"linear"};b="
";f?f.html(b):(l=l||h.plotWin,n=a.lightWin(d,"inline",b,m,l));var p=$("#"+d+" #"+d+"Plot");f&&(p.css("width",f.css("width")),p.css("height",f.css("height")),p.css("margin",0));if(q.data){switch(a.globalOpts.plotLibrary){case "plotly":h=$.extend(!0,{},a.Plot.opts,q.opts);q.label&&(h.title=q.label);b={x:[],y:[],type:"scatter"};3<= -q.data[0].length&&(b.error_y={type:"data",array:[],visible:!0},q.points&&q.points.yerr&&q.points.yerr.color&&(b.error_y.color=q.points.yerr.color));for(l=0;l");l.on("click",k);b=$("
"); -b.append(l);p.append(b)}break;case "params":case "regions":case "textline":f?a.allinone?f.html(b):$.ajax({url:b,cache:!1,dataType:"text",success:function(a){f.html(a)}}):(l="params"===c?l||h.paramWin:"regions"===c?"small"===a.globalOpts.regionConfigSize?l||h.regWin0:l||h.regWin:l||h.dpathWin,n=a.allinone?"inline":"ajax",n=a.lightWin(d,n,b,m,l))}return n};a.Image.prototype.saveFITS=function(c){if(window.hasOwnProperty("saveAs")){c=c?c.replace(/\.fz$/i,"").replace(/(png|jpg|jpeg)$/i,"fits"):"js9.fits"; -var b=this.toArray({notab:!0,twoaxes:!0});b=new Blob([b],{type:"application/octet-binary"});saveAs(b,c)}else a.error("no saveAs() available to save FITS file");return c};a.Image.prototype.saveIMG=function(c,b,d){var e;if(window.hasOwnProperty("saveAs")){d=d||{};if("number"===typeof d){var f=d;d=null}else if("string"===typeof d){if(a.isNumber(d))f=parseFloat(d),d=null;else try{d=JSON.parse(d)}catch(m){d=null}d&&(f=d.quality)}c=c||"js9.png";b=b||"image/png";var g=this.display.width;var h=this.display.height; -var k=document.createElement("canvas");k.setAttribute("width",g);k.setAttribute("height",h);var l=k.getContext("2d");"image"===d.source?l.putImageData(this.rgb.img,0,0):l.drawImage(this.display.canvas,0,0);if(!1!==d.layers)for(e in this.layers)this.layers.hasOwnProperty(e)&&"main"===this.layers[e].dlayer.dtype&&this.layers[e].show&&(d=this.layers[e].dlayer.canvasjq[0],l.drawImage(d,0,0,g,h));a.notNull(f)&&(0>f||1a&&(a=Math.abs(a),c="-");for(a=""+a;a.length=f||k>=f?(n="'",c*=60,k*=60):(n='"',c*=3600,k*=3600);h=this.rgb.sect;g=this.binning.bin;f=((h.x1-h.x0)*c).toFixed(0);k=((h.y1-h.y0)*k).toFixed(0);d.wcsfov=""+f+n+" \u00d7 "+k+n;f=(c*g/h.zoom).toFixed(3);d.wcspix=""+f+n+"/pix";d.wcsfovpix=d.wcsfov+" ("+d.wcspix+")";c=a.pix2wcs(this.raw.wcs,(h.x1+h.x0)/2,(h.y1+h.y0)/2).trim().split(/\s+/);d.racen=c[0];d.deccen=c[1];d.wcscen=c[0]+"\t "+c[1]}d.vstrsmall=e+"    "+l;d.vstr=m;d.vstrmedium= -m;d.vstrlarge=m+"    "+this.file;b&&this.display.displayMessage("info",d,a.globalOpts.valposTarget)}return d};a.Image.prototype.toggleValpos=function(){this.params.valpos=!this.params.valpos;this.params.valpos||this.display.clearMessage()};a.Image.prototype.getColormap=function(){if(this.cmapObj)return{colormap:this.cmapObj.name,contrast:this.params.contrast,bias:this.params.bias}};a.Image.prototype.setColormap=function(c){for(var b=[],d=0;d=c&&(c*=255),d.alpha=c);break;case 3:d.min=parseFloat(a[b][1]),Number.isNaN(d.min)&&(d.min=-Infinity),d.max=parseFloat(a[b][2]),Number.isNaN(d.max)&&(d.max=Infinity)}break}}};if(!(0<=$.inArray("colormap",this.params.disable)&&this.cmapObj)){switch(b.length){case 1:switch(d){case "rgb":a.globalOpts.rgb.active=!a.globalOpts.rgb.active;break;case "invert":this.params.invert=!this.params.invert;break;case "reset":this.params.invert= -a.imageOpts.invert;this.params.contrast=a.imageOpts.contrast;this.params.bias=a.imageOpts.bias;break;default:if(this.cmapObj&&"static"===this.cmapObj.type)if($.isArray(d))l(d);else if("string"===typeof d&&"["===d.charAt(0))try{var m=JSON.parse(d);l(m)}catch(n){a.error("can't parse JSON in setColormap: "+d,n)}else h(d);else"string"===typeof d&&h(d)}break;case 2:a.isNumber(d)&&a.isNumber(g)?k(d,g):this.cmapObj&&"static"===this.cmapObj.type&&(h(d),l(g));break;case 3:h(d),k(g,f)}this.displayImage("colors"); -this.xeqstash&&this.xeqstash.filterRGBImage&&delete this.xeqstash.filterRGBImage;a.globalOpts.extendedPlugins&&this.xeqPlugins("image","onsetcolormap");return this}};a.Image.prototype.getScale=function(){if(this.params.scale)return{scale:this.params.scale,scalemin:this.params.scalemin,scalemax:this.params.scalemax,scaleclipping:this.params.scaleclipping}};a.Image.prototype.setScale=function(c){for(var b=[],d=0;da&&this.params.disable.push(b[c]);return this.params.disable}if("enable"===a){$.isArray(b)||(b=[b]);for(c=0;cf.search(/(^| )-c/)&&(f+=" -c "+(this.raw.hdu.slice||1));if(g.reduce&&!this.parentFile&&(l=this.fileDimensions(),l=Math.floor(Math.max(l.xdim,l.ydim)/g.dim+.5),1b.radius2)&&a.error("radial profile source region must be an annulus"),b=[(b.radius1+b.radius2)/2,b.surfBrightness,b.surfError],h.data.push(b);return this.displayAnalysis("plot",h,{divid:a.globalOpts.analysisDiv})};a.Image.prototype.plot3d=function(c,b,d){var e,f,g=[];this.raw.header&&3===this.raw.header.NAXIS||a.error("plot3d requires a data cube with 3 dimensions");d=$.extend(!0,{},d,a.globalOpts.plot3d);d.cube=d.cube||"*:*:all";var h=d.cube.split(":");for(e=0;e=h.length&&a.cleanupFITSFile(g,!0)}this.raw=this.raws[0];if(g.current0&&g.current0.id)for(h=0;hg||d.alwaysCopy){h=$.extend(!0,{},f);h.current0=f;if(d.bitpix){switch(d.bitpix){case 8:h.data=new Uint8Array(f.height*f.width);break;case 16:h.data=new Int16Array(f.height*f.width);break;case -16:h.data=new Uint16Array(f.height*f.width);break;case 32:h.data=new Int32Array(f.height*f.width);break;case -32:h.data=new Float32Array(f.height*f.width);break; -case -64:h.data=new Float64Array(f.height*f.width)}var l=h.width*h.height;for(b=0;bthis.raw.bitpix&&0>e.argval.raw.bitpix?Math.min(this.raw.bitpix,e.argval.raw.bitpix):0>this.raw.bitpix&&0f||f>=a.height)){var g=0;var h=g+b.xoff;e=a.width;0>h&&(g-=h,e+=h,h=0);h+e>a.width&&(e-=h+e-a.width);if(0>=e)return!1;g=(c*a.width+g)*d;g=new Uint8Array(a.data.buffer,g,e*d); -h=(f*a.width+h)*d;e=new Uint8Array(b.data.buffer,h,e*d);e.set(g)}}return!0});return this};a.Image.prototype.rotateData=function(c){for(var b=[],d=0;df&&(f=-f);break;default:g=parseInt(g,10)}a.notNull(k.CD1_1)?(f=-(g*Math.PI/180),e=Math.sin(f),f=Math.cos(f),l.CD1_1=k.CD1_1*f+k.CD1_2*e,l.CD1_2=k.CD1_1* --e+k.CD1_2*f,l.CD2_1=k.CD2_1*f+k.CD2_2*e,l.CD2_2=k.CD2_1*-e+k.CD2_2*f):(l.CROTA2=g,l.CDELT1=e,l.CDELT2=f);h.lcsUseRota2=!0;d.wcsinfo&&(l.ptype=d.wcsinfo.ptype);this.xeqStashSave("rotateData",b,h.rawid);return this.reprojectData(l,h)};a.Image.prototype.reproject=function(c,b){var d,e,f,g=!1;var h={};var k=/SIMPLE|BITPIX|NAXIS|NAXIS[1-4]|AMDX|AMDY|CD[1-2]_[1-2]|CDELT[1-4]|CNPIX[1-4]|CO1_[1-9][0-9]|CO2_[1-9][0-9]|CROTA[1-4]|CRPIX[1-4]|CRVAL[1-4]|CTYPE[1-4]|CUNIT[1-4]|DATE|DATE_OBS|DC-FLAG|DEC|DETSEC|DETSIZE|EPOCH|EQUINOX|EQUINOX[a-z]|IMAGEH|IMAGEW|LATPOLE|LONGPOLE|MJD-OBS|PC00[1-4]00[1-4]|PC[1-4]_[1-4]|PIXSCALE|PIXSCAL[1-2]|PLTDECH|PLTDECM|PLTDECS|PLTDECSN|PLTRAH|PLTRAM|PLTRAS|PPO|PROJP[1-9]|PROJR0|PV[1-3]_[1-3]|PV[1-4]_[1-4]|RA|RADECSYS|SECPIX|SECPIX|SECPIX[1-2]|UT|UTMID|VELOCITY|VSOURCE|WCSAXES|WCSDEP|WCSDIM|WCSNAME|XPIXSIZE|YPIXSIZE|ZSOURCE|LTM|LTV/; +metaClickPan:!0,statusBar:"zoom: $zoom; scale: $scale/$scaleclipping($scalemin,$scalemax); color: $colormap($contrast,$bias); wcs: $wcssys($wcsunits)",toolbarTooltips:!1,centerDivs:["JS9Menubar"],resizeDivs:["JS9Menubar","JS9Colorbar","JS9Toolbar","JS9Statusbar"],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:"$data.ra $data.dec"},topColormaps:"grey heat cool turbo 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",menuPosition:"right-5 bottom-5", +menuClickEvent:"mouseup",menuSelected:"check",userMenus:!1,userMenuDivider:"   ",imagesFileSubmenu:5,toolBar:"annulus box circle ellipse line polygon text linear log zoom+ zoom- zoom1".split(" "),syncOps:"colormap contrastbias flip pan regions rot90 scale wcs zoom".split(" "),syncReciprocate:!0,syncWCS:!0,hiddenPluginDivs:[],separate:{layout:"auto",leftMargin:10,topMargin:10},imageTemplates:".fits,.fts,.png,.jpg,.jpeg,.fz,.ftz",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",localTemplates:".fits,.fts",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,flip:"none",rot90:0,zscalecontrast:.25,zscalesamples:600,zscaleline:120,wcssys:"native",lcs:"physical",valpos:!0,sigma:"none",opacity:1,alpha:255,nancolor:"#000000",nocolor:{red:0,green:0,blue:0,alpha:0},zoom:1,zooms:6,topZooms:2,wcsalign:!0,rotationMode:"relative",crosshair:!1,disable:[],ltvbug:!1,listonchange:!1,whichonchange:"selected"};a.regionOpts={};a.catalogOpts={};a.crosshairOpts={};a.gridOpts={};a.emscriptenOpts={};a.blendOpts={active:!0,mode:"screen",opacity:1};a.maskOpts= +{active:!1,mode:"overlay",opacity:1,value:0,syncops:["flip","pan","rot90","zoom"],invert:!1};a.analOpts={epattern:/^(ERROR:[^\n]*)\n/,dpathURL:"params/datapath.html",fpathURL:"params/filepath.html"};a.lightOpts={nclick:0,dhtml:{top:".dhtmlwindow",drag:".drag-contentarea",dragBar:"drag-handle",format:"width=%spx,height=%spx,center=1,resize=%s,scrolling=0",textWin:"width=830px,height=400px,center=1,resize=1,scrolling=1",plotWin:"width=830px,height=420px,center=1,resize=1,scrolling=1",dpathWin:"width=830px,height=175px,center=1,resize=1,scrolling=1", +lcloseWin:"width=512px,height=190px,center=1,resize=1,scrolling=1",paramWin:"width=830px,height=235px,center=1,resize=1,scrolling=1",regWin0:"width=600px,height=72px,center=1,resize=1,scrolling=1",regWin:"width=600px,height=235px,center=1,resize=1,scrolling=1",imageWin:"width=512px,height=598px,center=1,resize=1,scrolling=1",lineWin:"width=400px,height=60px,center=1,resize=1,scrolling=1"},lcloseURL:"params/lightclose.html"};a.textColorOpts={regions:"#00FF00",info:"#00FF00",inimage:"#000000"};a.helpOpts= +{user:{heading:"JS9Help",type:"help",url:"user.html",title:"User Manual"},install:{heading:"JS9Help",type:"help",url:"install.html",title:"Installing JS9"},webpage:{heading:"JS9Help",type:"help",url:"webpage.html",title:"Adding JS9 to a Web Page"},yourdata:{heading:"JS9Help",type:"help",url:"yourdata.html",title:"Adding Data to a Web Page"},localtasks:{heading:"JS9Help",type:"help",url:"localtasks.html",title:"Adding Local Analysis Tasks and Plugins"},helper:{heading:"JS9Help",type:"help",url:"helper.html", +title:"Adding Server-side Analysis Tasks"},serverside:{heading:"JS9Help",type:"help",url:"serverside.html",title:"Server-side Analysis with JS9"},publicapi:{heading:"JS9Help",type:"help",url:"publicapi.html",title:"The JS9 Public API"},extmsg:{heading:"JS9Help",type:"help",url:"extmsg.html",title:"External Messaging"},desktop:{heading:"JS9Help",type:"help",url:"desktop.html",title:"JS9 on the Desktop"},python:{heading:"JS9Help",type:"help",url:"python.html",title:"JS9 with Python and Jupyter"},archives:{heading:"JS9Help", +type:"help",url:"archives.html",title:"Accessing Data Archives"},preferences:{heading:"JS9Help",type:"help",url:"preferences.html",title:"Setting Site Preferences"},regions:{heading:"JS9Help",type:"help",url:"regions.html",title:"Regions Format"},changelog:{heading:"JS9Help",type:"help",url:"changelog.html",title:"ChangeLog"},repfile:{heading:"JS9Help",type:"help",url:"repfile.html",title:"Dealing with Large Files"},memory:{heading:"JS9Help",type:"help",url:"memory.html",title:"Dealing with Memory Limitations"}, +issues:{heading:"JS9Help",type:"help",url:"knownissues.html",title:"Known Issues"}};a.images=[];a.displays=[];a.colormaps=[];a.commands=[];a.plugins=[];a.preloads=[];a.auxFiles=[];a.supermenus=[];a.publics={};a.helper={};a.fits={};a.userOpts={};a.preloadwaiting={};a.scales="linear log histeq power sqrt squared asinh sinh".split(" ");a.wcssyss="FK4 FK5 ICRS galactic ecliptic native image physical".split(" ");a.wcsunitss=["degrees","sexagesimal","pixels"];a.bugs={};a.bugs.hide_menu=!1;"Firefox"===a.BROWSER[0]&& +0<=a.BROWSER[2].search(/Linux/)&&(a.bugs.firefox_linux=!0);if("Chrome"===a.BROWSER[0]||"Safari"===a.BROWSER[0])a.bugs.webkit_resize=!0;"Chrome"!==a.BROWSER[0]&&(a.globalOpts.imageTemplates+=",.gz");/iPad|iPhone|iPod/.test(navigator.platform)&&/11_2_(?:[2-9])/.test(navigator.userAgent)&&(a.globalOpts.useWasm=!1);a.BROWSER[3]&&(a.globalOpts.maxMemory=Math.min(a.globalOpts.maxMemory,35E7),a.globalOpts.table.xdim=2048,a.globalOpts.table.ydim=2048,a.globalOpts.image.xdim=2048,a.globalOpts.image.ydim=2048, +a.imageOpts.crosshair=!1,a.globalOpts.reproj={xdim:2048,ydim:2048});window.hasOwnProperty("Jupyter")&&(a.globalOpts.useWasm=!1);if(window.isElectron){"Chrome"===a.BROWSER[0]&&66<=parseFloat(a.BROWSER[1])&&(a.globalOpts.allowFileWasm=!0);if(!window.electronVersion||5>parseInt(window.electronVersion,10))a.globalOpts.internalColorPicker=!1;a.hasNode="object"===typeof process&&"function"===typeof require;a.hasNode&&(a.localMount=require("os").hostname()||"localAccess");window.multiElectron&&(a.globalOpts.localStorage= +!1);window&&"function"===typeof window.eval&&(window.eval=function(){throw Error("For security reasons, Desktop JS9 does not support window.eval()");})}a.Image=function(c,b,d){var e=this,f=null,g=0,h=0,k=function(b){b=b||{};a.isNull(b.scaleclipping)?"zscale"===e.params.scaleclipping?e.zscale(!0):"zmax"===e.params.scaleclipping&&e.zscale("zmax"):"zscale"===b.scaleclipping?e.zscale(!0):"zmax"===b.scaleclipping&&e.zscale("zmax");a.notNull(b.scalemin)&&(e.params.scalemin=b.scalemin);a.notNull(b.scalemax)&& +(e.params.scalemax=b.scalemax)},l=function(b){var c=a.globalOpts.imopts,d=a.globalOpts.imcmap,g=a.globalOpts.alerts;var h=/(annulus|box|circle|ellipse|line|polygon|point|text) *\(/;e.display.clearMessage();a.images.push(e);e.notifyHelper();e.showShapeLayer("regions",!0,{local:!0});f&&((a.notNull(f.x)&&a.notNull(f.y)||a.notNull(f.px)&&a.notNull(f.py)||a.notNull(f.ra)&&a.notNull(f.dec)||a.notNull(f.wcs))&&e.setPan(f),f.regions&&(f.regions.match(h)?e.addShapes("regions",f.regions):a.LoadRegions(f.regions, +{display:e.display})));a.globalOpts.alerts=!1;if(e.raw&&e.raw.header&&e.raw.header[d]){try{var k=JSON.parse(e.raw.header[d])}catch(x){k=null}if(k)try{a.AddColormap(k)}catch(x){}}if(e.raw&&e.raw.header&&e.raw.header[d+"1"]){var l=1;for(h="";100>l;l++){var m=d+String(l);if(e.raw.header[m])h+=e.raw.header[m];else break}if(h){try{k=JSON.parse(h)}catch(x){k=null}if(k)try{a.AddColormap(k)}catch(x){}}}if(e.raw&&e.raw.header&&e.raw.header[c]){try{k=JSON.parse(e.raw.header[c])}catch(x){k=null}if(k)try{e.setParam("all", +k)}catch(x){}}if(e.raw&&e.raw.header&&e.raw.header[c+"1"]){l=1;for(h="";100>l;l++)if(m=c+String(l),e.raw.header[m])h+=e.raw.header[m];else break;if(h){try{k=JSON.parse(h)}catch(x){k=null}if(k)try{e.setParam("all",k)}catch(x){}}}a.globalOpts.alerts=g;e.xeqPlugins("image","onimageload");e.updateshapes&&e.updateShapes("regions","all","update");e.setStatus("load","complete");a.waiting(!1);if(b)try{a.xeqByName(b,window,e)}catch(x){a.error("in image onload callback",x,!1)}h=e.proxyURL||e.file;b=h.replace(/\[.*\]/, +"");if(a.preloadwaiting[h]||a.preloadwaiting[b])if(delete a.preloadwaiting[h],delete a.preloadwaiting[b],!Object.keys(a.preloadwaiting).length&&a.notNull(a.globalOpts.onpreload))try{a.xeqByName(a.globalOpts.onpreload,window,e)}catch(x){a.error("in onpreload callback",x,!1)}f&&f.allext&&e.hdus&&0=f.length&&a.cleanupFITSFile(g,!0));g.altwcs&&this.freeWCS(g)}e.removeProxyFile(); +e.rgb=null;e.offscreen=null;e.raw=null;e.colorData=null;e.colorCells=null;e.psColors=null;e.psInverse=null;a.images.splice(b,1);break}if(d){for(b=d-=2;0<=b;b--)if(e=a.images[b],this.display===e.display){e.displayImage("all");e.refreshLayers();d=a.images.length;break}for(b=a.images.length-1;b>d;b--)if(e=a.images[b],this.display===e.display){e.displayImage("all");e.refreshLayers();break}}};a.Image.prototype.mkOffScreenCanvas=function(){if(!this.png||!this.png.image)return this;this.offscreen={};this.offscreen.canvas= +document.createElement("canvas");this.offscreen.canvas.setAttribute("width",this.png.image.width);this.offscreen.canvas.setAttribute("height",this.png.image.height);this.offscreen.context=this.offscreen.canvas.getContext("2d");a.ANTIALIAS||(this.offscreen.context.imageSmoothingEnabled=!1,this.offscreen.context.webkitImageSmoothingEnabled=!1,this.offscreen.context.msImageSmoothingEnabled=!1);this.offscreen.context.drawImage(this.png.image,0,0);try{this.offscreen.img=this.offscreen.context.getImageData(0, +0,this.png.image.width,this.png.image.height)}catch(c){a.CHROMEFILEWARNING&&"Chrome"===a.BROWSER[0]&&""===document.domain?alert("When using the file:// URI, Chrome must be run with the --allow-file-access-from-files switch to permit JS9 to access data."):alert("could not read off-screen image data [same-origin policy violation?]")}return this};a.Image.prototype.initLCS=function(c){var b=[[0,0,0],[0,0,0],[0,0,0]];c=c||this.raw.header;var d=c.CRPIX1||1,e=c.CRPIX2||1;if(c.LCSROTA2&&c.CROTA2){var f=-c.CROTA2* +Math.PI/180;var g=Math.sin(f);var h=Math.cos(f);f=[[0,0,0],[0,0,0],[0,0,0]];f[0][0]=h;f[0][1]=-g;f[0][2]=0;f[1][0]=g;f[1][1]=h;f[1][2]=0;(g=a.invertMatrix3(f))||(f=null)}b[0][0]=a.defNull(c.LTM1_1,1);b[1][0]=c.LTM2_1||0;b[0][1]=c.LTM1_2||0;b[1][1]=a.defNull(c.LTM2_2,1);b[2][0]=c.LTV1||0;b[2][1]=c.LTV2||0;if("image"===this.imtab&&this.params.ltvbug){if(a.notNull(c.LTV1))for(h=0;2>h;h++){var k=Math.abs(b[0][h]);0k&&(b[2][0]+=.5*k)}if(a.notNull(c.LTV2))for(h=0;2>h;h++)k=Math.abs(b[1][h]),0k&&(b[2][1]+=.5*k)}this.lcs.physical={forward:$.extend(!0,[],b),reverse:a.invertMatrix3(b)};this.lcs.physical.reverse?f&&(this.lcs.physical.frot=$.extend(!0,[],f),this.lcs.physical.rrot=$.extend(!0,[],g),this.lcs.physical.cx=d-b[2][0]-1,this.lcs.physical.cy=e-b[2][1]-1):delete this.lcs.physical;b[0][0]=a.defNull(c.DTM1_1,1);b[1][0]=c.DTM2_1||0;b[0][1]=c.DTM1_2||0;b[1][1]=a.defNull(c.DTM2_2,1);b[2][0]=c.DTV1||0;b[2][1]=c.DTV2||0;this.lcs.detector={forward:$.extend(!0,[],b),reverse:a.invertMatrix3(b)}; +this.lcs.detector.reverse?f&&(this.lcs.detector.frot=$.extend(!0,[],f),this.lcs.detector.rrot=$.extend(!0,[],g),this.lcs.detector.cx=d-b[2][0]-1,this.lcs.detector.cy=e-b[2][1]-1):delete this.lcs.detector;b[0][0]=a.defNull(c.ATM1_1,1);b[1][0]=c.ATM2_1||0;b[0][1]=c.ATM1_2||0;b[1][1]=a.defNull(c.ATM2_2,1);b[2][0]=c.ATV1||0;b[2][1]=c.ATV2||0;this.lcs.amplifier={forward:$.extend(!0,[],b),reverse:a.invertMatrix3(b)};this.lcs.amplifier.reverse?f&&(this.lcs.amplifier.frot=$.extend(!0,[],f),this.lcs.amplifier.rrot= +$.extend(!0,[],g),this.lcs.amplifier.cx=d-b[2][0]-1,this.lcs.amplifier.cy=e-b[2][1]-1):delete this.lcs.amplifier;this.params&&!this.lcs[this.params.lcs]&&(this.params.lcs="image");this.params&&!this.params.wcssys0&&(this.setWCSSys("physical"),this.params.wcssys0=this.params.lcs);this.lcs.physical&&!this.lcs.ophysical&&(this.lcs.ophysical=$.extend(!0,{},this.lcs.physical));return this};a.Image.prototype.mkRawDataFromIMG=function(c){var b,d;if(c){var e=c.height;var f=c.width;var g=c.data;this.raws.push({from:"img"}); +this.raw=this.raws[this.raws.length-1];this.raw.id=a.RAWID0;this.raw.data=new Float32Array(e*f);for(d=c=0;dc||m)this.mkRawDataFromIMG(this.offscreen.img);else{c=f.join("");2l.naxis&&a.error("can't image a FITS file with less than 2 dimensions");if(this.raw){var m=this.raw;var n=this.raw.width;var q=this.raw.height;var p=this.raw.bitpix;var u=this.params.wcssys;var r=this.params.wcsunits;this.freeWCS()}this.raws=this.raws||[];if(g=this.raws.length){b.rawid=b.rawid||a.RAWIDX;for(e=f=0;ef&&(f=1/Math.abs(f)),a.notNull(e.NAXIS1)&&(e.NAXIS1/=f),a.notNull(e.NAXIS2)&&(e.NAXIS2/=f),a.notNull(e.CRPIX1)&&(e.CRPIX1=(e.CRPIX1+1-h-.5)/f+.5),a.notNull(e.CRPIX2)&&(e.CRPIX2=(e.CRPIX2+1-k-.5)/f+.5),a.notNull(e.CDELT1)&&(e.CDELT1*=f),a.notNull(e.CDELT2)&&(e.CDELT2*=f),a.notNull(e.CD1_1)&& +(e.CD1_1*=f),a.notNull(e.CD1_2)&&(e.CD1_2*=f),a.notNull(e.CD2_1)&&(e.CD2_1*=f),a.notNull(e.CD2_2)&&(e.CD2_2*=f),e.LTM1_1=a.defNull(e.LTM1_1,1),e.LTM1_1/=f,e.LTM2_1=e.LTM2_1||0,e.LTM2_1/=f,e.LTM1_2=e.LTM1_2||0,e.LTM1_2/=f,e.LTM2_2=a.defNull(e.LTM2_2,1),e.LTM2_2/=f,e.LTV1=e.LTV1||0,e.LTV1=(e.LTV1-h)/f+.5,e.LTV2=e.LTV2||0,e.LTV2=(e.LTV2-k)/f+.5;b.lcsUseRota2&&(e.LCSROTA2=!0);b.file&&b.file!==this.file?(this.file=b.file,this.id=null):b.filename&&b.filename!==this.file?(this.file=b.filename,this.id=null): +l.filename&&l.filename!==this.file&&(this.file=l.filename,this.id=null);this.file0=this.file=this.file||a.ANON+a.uniqueID();b.id&&(this.id0=b.id,this.id=a.getImageID(b.id,this.display.id,this));this.id||!this.file||this.file.match(/\[.*[^a-zA-Z0-9_].*\]/)||(b.extname||b.extnum?(b.extname?(this.file=this.file.replace(/\[.*\]/,""),this.file+="["+b.extname+"]"):b.extnum&&0]/);m=c=!1;e=0;for(b=!1;e=this.raw.header.NAXIS&&(!this.hdus||1===this.hdus.length)?c=!0:(c=!1,b=!0);break;case "nocube":2>=this.raw.header.NAXIS?c=!0:(c=!1,b=!0);break;case "noext":this.hdus&&1!==this.hdus.length?(c=!1,b=!0):c=!0;break;case "size":t[e+1]?a.vsize(l.fits.vfile)>1E6*t[e+1]?c=!0:(c=!1,b=!0):(c=!1,b=!0)}c?(2d.x0&&(a.globalOpts.panWithinDisplay? +d.x1-=d.x0:d.ix=d.x0*d.zoom,d.x0=0);0>d.y0&&(a.globalOpts.panWithinDisplay?d.y1-=d.y0:d.iy=d.y0*d.zoom,d.y0=0);d.x1>this.raw.width&&(a.globalOpts.panWithinDisplay?d.x0-=d.x1-this.raw.width:d.ix=(d.x1-this.raw.width)*d.zoom,d.x1=this.raw.width);d.y1>this.raw.height&&(a.globalOpts.panWithinDisplay?d.y0-=d.y1-this.raw.height:d.iy=(d.y1-this.raw.height)*d.zoom,d.y1=this.raw.height);0d.ix&&d.x1d.iy&&d.y1=d.width|| +0>=d.height)b=sprintf("invalid image section: %s,%s [%s,%s, %s,%s, %s]",d.width,d.height,d.x0,d.y0,d.x1,d.y1,d.zoom),a.error(b);this.offscreenRGB=null;this.params.zoom=d.zoom;return this};a.Image.prototype.mkColorData=function(){var c,b=a.SCALESIZE,d=this.params.scalemin,e=this.params.scalemax,f=this.raw.width*this.raw.height,g=(b-1)/(e-d);if("static"===this.cmapObj.type)return this;if(!this.colorData||this.colorData.length=e?b-1:Math.floor((h-d)*g+.5)}return this};a.Image.prototype.calcContrastBias=function(c){var b=this.params.bias,d=a.COLORSIZE,e=this.params.contrast;if(1E-4>b-.5&&1E-4>e-1)return c;this.params.invert&&(b=1-b);c=Math.floor(((c/d-b)*e+.5)*d);return 0>c?0:c>=d?d-1:c};a.Image.prototype.mkColorCells=function(){var c,b=a.COLORSIZE;if("static"===this.cmapObj.type)return this;this.colorCells||(this.colorCells=[]);for(c=0;cb;b+=2,c++){var m="0123456789ABCDEF".indexOf(k.charAt(b));var n="0123456789ABCDEF".indexOf(k.charAt(b+1));l[c]=16*m+n}h[NaN]= +l}this.psInverse||(this.psInverse=[],this.psInverse[NaN]=0);k=this.params.scalemax-this.params.scalemin;b=this.params.scalemin;switch(this.params.scale){case "linear":for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h= +0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=d&&(c=d-1),this.psColors[h]=this.colorCells[c];for(h=0;h=b&&l[h]<=p&&(n=Math.floor((l[h]-b)/k*g+.5),n=n&&l +d);n++);c=n/g;this.psInverse[h]=c*k+b}break;default:a.error("unknown scale '"+this.params.scale+"'")}return this};a.Image.prototype.mkRGBImage=function(){var c,b,d,e,f=!1,g=null,h=null,k=null,l=!1,m=!1,n=!1,q=!1,p=[];if(!this.rgb)return this;!a.globalOpts.rgb.active||this!==a.globalOpts.rgb.rim&&this!==a.globalOpts.rgb.gim&&this!==a.globalOpts.rgb.bim||(l=!0,a.globalOpts.rgb.rim&&(g=a.globalOpts.rgb.rim),a.globalOpts.rgb.gim&&(h=a.globalOpts.rgb.gim),a.globalOpts.rgb.bim&&(k=a.globalOpts.rgb.bim)); +var u=this.display.context;var r=this.rgb;var t=r.sect;if(this.MakeRGBImage&&"function"===typeof this.MakeRGBImage&&this.MakeRGBImage()||this.MakePrimaryImage&&"function"===typeof this.MakePrimaryImage&&this.MakePrimaryImage())return this;if(this.rgbFile){var v=t.width/t.zoom;var y=t.height/t.zoom;var w=t.x0;var x=this.offscreen.canvas.height-1-(t.y0+y);x=this.offscreen.context.getImageData(w,x,v,y);if(1===t.zoom)r.img=x;else for(r.img=u.createImageData(t.width,t.height),r=r.img,d=c=0;c=t.y0;c-=N,d++)for(A=c*this.raw.width,z=d*P,u=Math.floor(t.x0),b=0;uthis.mask.value?L:K:n&&(G=255*M.raw.data[A+u]);if(l){if(x=g?g.colorData[A+u]:0,v=h?h.colorData[A+u]:0,y=k?k.colorData[A+u]:0,a.isNull(x)||a.isNull(v)||a.isNull(y))return a.globalOpts.rgb.active=!1,a.error("RGB images are incompatible. Turning off RGB mode.", +"",!1),this.mkRGBImage(),this}else this.staticObj||(w=this.colorData[A+u]);var Q=G;f&&this.raw.data[A+u]<=R&&(Q=J);B=b*P;for(e=0;eh&&(h=a.pts[r].x),a.pts[r].xm&&(m=a.pts[r].y),a.pts[r].yc.bin&&(c.bin=1/Math.floor(1/c.bin+.5));c.filter=n(c.filter,p.filter,"");this.raw.filter=c.filter||"";!1!==c.waiting&&a.waiting(!0,this.display);this.setStatus("displaySection","processing");window.setTimeout(function(){switch(f){case "parentFile":e= +d.proxyFile;m=[];m.push({name:"xcen",value:c.xcen});delete c.xcen;m.push({name:"ycen",value:c.ycen});delete c.ycen;m.push({name:"xdim",value:c.xdim});m.push({name:"ydim",value:c.ydim});void 0!==c.xdim&&(c.xdim=0);void 0!==c.ydim&&(c.ydim=0);c.binMode&&(c.bin=""+c.bin+c.binMode,delete c.binMode);m.push({name:"bin",value:c.bin});delete c.bin;m.push({name:"filter",value:c.filter||""});m.push({name:"slice",value:c.slice||""});delete c.slice;g={id:d.expandMacro("$id"),image:d.file,fits:d.parentFile,rtype:"text"}; +g.cmd="js9Xeq imsection "+d.parentFile;c.extension&&(g.cmd=g.cmd.replace(/\[.*\]/,""),g.cmd+="["+c.extension+"]",delete c.extension);g.cmd+=d.expandMacro(" $xdim@$xcen,$ydim@$ycen,$bin $filter $slice",m);a.helper.send("imsection",g,function(b){b="object"===typeof b?b:0<=b.search(a.analOpts.epattern)?{stderr:b}:{stdout:b};if(b.stderr)a.error(b.stderr);else if(b.errcode)a.error("in displaySection: "+b.errcode);else{var f=b.stdout.split(/\n/);b=a.cleanPath(f[0]);"/"!==b.charAt(0)&&(b=a.InstallDir(b)); +c.proxyFile=b;e&&e!==c.proxyFile&&d.removeProxyFile(e);if(f[1]){try{var g=JSON.parse(f[1])}catch(w){a.log("couldn't parse imsection as JSON: %s",b),g=null}g&&(c.extname=g.extname,c.extnum=g.extnum,c.hdus=g.hdus,c.binstr=g.binstr,c.parent=g)}f[2]&&(g=a.cleanPath(f[2]),c.parentFile=g);a.fetchURL(b,b,c,function(b){a.cleanupFITSFile(d.raw,!0);!1!==c.waiting&&a.waiting(!0,d.display);a.fits.handleFITSFile(b,c,q)})}});break;case "virtualFile":a.cleanupFITSFile(d.raw,!1);a.getFITSImage(u.fits,u,c,function(a){q(a, +c)});break;default:a.error("image section cannot be extracted from this data file")}},a.SPINOUT)};a.Image.prototype.displayExtension=function(c,b,d){var e=this,f,g,h=function(c){var f=$.extend(!0,{},b);f.separate=!0;if(c===e.hdus.length){if(d)try{a.xeqByName(d,window,e)}catch(p){a.error("in displayExtension callback",p,!1)}}else{var g=e.hdus[c];"image"===g.type&&2<=g.naxis?e.displayExtension(g.hdu,f,function(){h(c+1)}):h(c+1)}};b=b||{};if("string"===typeof b)try{b=JSON.parse(b)}catch(m){a.error("can't parse extension opts: "+ +b,m)}b.waiting=!1;this.hdus||a.error("no FITS HDUs found for displayExtension()");a.isNull(c)&&a.error("missing extname/extnum for displayExtension()");if("all"===c)h(0);else{if("string"===typeof c){b.extension=c;var k=c.toLowerCase();for(g=f=0;fa;)a+=360;for(;360<=a;)a-=360;270===a&&(a=-90);return a},k=function(a,b){var c,d,e=a.data,f=b.data;b.width=a.height;b.height=a.width; +for(d=0;dMath.abs(c.CD1_1)&&(c.CD1_1=0);1E-15>Math.abs(c.CD1_2)&&(c.CD1_2=0);1E-15>Math.abs(c.CD2_1)&&(c.CD2_1=0);1E-15>Math.abs(c.CD2_2)&&(c.CD2_2=0)}else a.notNull(f.CRPIX1)&&(e.raw.wcsinfo?(0>e.raw.wcsinfo.cdelt1&&0>e.raw.wcsinfo.cdelt2||0Math.abs(c.LTM1_1)&&(c.LTM1_1=0);1E-15>Math.abs(c.LTM1_2)&&(c.LTM1_2=0);1E-15>Math.abs(c.LTM2_1)&&(c.LTM2_1=0);1E-15>Math.abs(c.LTM2_2)&&(c.LTM2_2=0)},q=function(b, +c,d){var f=b.header,g=c.header;switch(d){case 0:c.header=b.header;break;case 90:case -270:g.NAXIS1=f.NAXIS2;g.NAXIS2=f.NAXIS1;a.notNull(f.CRPIX1)&&a.notNull(f.CRPIX2)&&(g.CRPIX1=g.NAXIS1-f.CRPIX2+1,g.CRPIX2=f.CRPIX1,m(b,c,d));g.LTV1=g.NAXIS1-(f.LTV2||0)+1;g.LTV2=f.LTV1||0;n(b,c,d);break;case 270:case -90:g.NAXIS1=f.NAXIS2;g.NAXIS2=f.NAXIS1;a.notNull(f.CRPIX1)&&a.notNull(f.CRPIX2)&&(g.CRPIX1=f.CRPIX2,g.CRPIX2=g.NAXIS2-f.CRPIX1+1,m(b,c,d));g.LTV1=f.LTV2||0;g.LTV2=f.NAXIS1-(f.LTV1||0)+1;n(b,c,d);break; +default:a.error("unknown rot90 type: "+e.params.rot90)}};if(!b)return this;this&&this.raw&&this.raw.header||a.error("invalid image for rot90");this.raw.header.CTYPE1&&this.raw.header.CTYPE1.match(/HPX/)&&a.error("support for rotating HEALPix is not yet available");f=f||{};if("string"===typeof f)try{f=JSON.parse(f)}catch(p){a.error("can't parse rot90 opts: "+f,p)}switch(b){case 1:b=90;break;case -1:b=-90;break;case 90:break;case -90:break;default:a.error("invalid rot90 value: "+b+" (use: +/1, +/90)")}d= +a.getRawCopy(g);switch(b){case 90:k(g,d);q(g,d,90);this.params.rot90=h(90);break;case -90:l(g,d),q(g,d,-90),this.params.rot90=h(-90)}this.raw=d;this.initWCS();this.initLCS();this.setPan();this.displayImage("all",f);this.refreshLayers();a.globalOpts.extendedPlugins&&this.xeqPlugins("image","onsetrot90");return this};a.Image.prototype.reFlipRot90=function(){var a=this.params.flip;var b=this.params.rot90;if("none"!==a){this.params.flip="none";var d=a.split("");for(a=0;athis.raw.bitpix?.5:1,void 0!==this.raw.header.TABMIN1&&(e=e-h+this.raw.header.TABMIN1),void 0!==this.raw.header.TABMIN2&&(f=f-h+this.raw.header.TABMIN2)));return{x:e,y:f,sys:c}};a.Image.prototype.logicalToImagePos=function(a,b){var c={x:a.x,y:a.y};var e=this.raw.header.CRPIX1||1;var f=this.raw.header.CRPIX2||1;b=b||this.params.lcs||"image";switch(b){case "ophysical":if(this.lcs.ophysical){var g=this.lcs.ophysical.forward;var h=this.lcs.ophysical.frot}else this.lcs.physical&&(g=this.lcs.physical.forward, +h=this.lcs.physical.frot);break;case "physical":this.lcs.physical&&(g=this.lcs.physical.forward,h=this.lcs.physical.frot);break;case "detector":this.lcs.detector&&(g=this.lcs.detector.forward,h=this.lcs.detector.frot);break;case "amplifier":this.lcs.amplifier&&(g=this.lcs.amplifier.forward,h=this.lcs.amplifier.frot)}g&&("table"===this.imtab&&(b=0>this.raw.bitpix?.5:1,void 0!==this.raw.header.TABMIN1&&(a.x=a.x-this.raw.header.TABMIN1+b),void 0!==this.raw.header.TABMIN2&&(a.y=a.y-this.raw.header.TABMIN2+ +b)),c.x=a.x*g[0][0]+a.y*g[1][0]+g[2][0],c.y=a.x*g[0][1]+a.y*g[1][1]+g[2][1],h&&(a=e+(c.x-e)*h[0][0]+(c.y-f)*h[1][0]+h[2][0],h=f+(c.x-e)*h[0][1]+(c.y-f)*h[1][1]+h[2][1],c.x=a,c.y=h));return c};a.Image.prototype.displayToImagePos=function(a){var b=this.rgb.sect;return{x:(a.x-this.ix+.5)/b.zoom+b.x0+.5,y:(this.rgb.img.height-(a.y-this.iy+.5))/b.zoom+b.y0+.5}};a.Image.prototype.imageToDisplayPos=function(a){var b=this.rgb.sect;return{x:(a.x-.5-b.x0)*b.zoom+this.ix-.5,y:(b.y0-(a.y-.5))*b.zoom+this.rgb.img.height+ +this.iy-.5}};a.Image.prototype.logicalToDisplayPos=function(a,b,d){return this.imageToDisplayPos(this.logicalToImagePos(a,b,d))};a.Image.prototype.displayToLogicalPos=function(a){return this.imageToLogicalPos(this.displayToImagePos(a))};a.Image.prototype.getWCSSys=function(){if(this.params.wcssys)return this.params.wcssys};a.Image.prototype.setWCSSys=function(c){if(!(0<=$.inArray("wcs",this.params.disable)))return"image"===c?(this.params.wcssys="image",this.params.wcsunits="pixels",a.wcsunits.image= +"pixels"):"physical"===c?(this.params.wcssys="physical",this.params.wcsunits="pixels",a.globalOpts.wcsUnits.physical="pixels"):this.raw.wcs&&0=this.raw.altwcs[b].wcs&&a.error("invalid WCS for version: %s",c),this.raw.wcs=this.raw.altwcs[b].wcs,this.raw.wcsinfo=this.raw.altwcs[b].wcsinfo,c=this.raw.wcsinfo&& +this.raw.wcsinfo.radecsys?this.raw.wcsinfo.radecsys:"native"!==this.params.wcssys?this.params.wcssys.trim():this.params.lcs,this.setWCSSys(c),this.params.wcssys0||(this.params.wcssys0=c),this.setWCSUnits(this.params.wcsunits),this}a.error("could not find WCS version: "+c)};a.Image.prototype.getWCSUnits=function(){return this.params.wcsunits?this.params.wcsunits:"pixels"};a.Image.prototype.setWCSUnits=function(c){if(!(0<=$.inArray("wcs",this.params.disable))){if("pixels"===c)"image"!==this.params.wcssys&& +(this.params.wcssys="physical"),this.params.wcsunits="pixels",a.globalOpts.wcsUnits[this.params.wcssys]="pixels";else if(this.raw.wcs&&0c.search(/ERROR:/i))a.log(c);else{k(c,a.analOpts.epattern);return}else if(n.errcode)if(c="ERROR: running "+f.name+" ["+n.errcode+"]",n.stdout)a.log(c);else{k(c,a.analOpts.epattern);return}switch(f.rtype){case "text":case void 0:e.displayAnalysis("text",n.stdout,{divid:a.globalOpts.analysisDiv});break;case "plot":e.displayAnalysis("plot",n.stdout,{divid:a.globalOpts.analysisDiv});break; +case "alert":n.stdout&&alert(n.stdout);break;case "fits":case "png":(l=n.stdout.split(/\s+/))&&l[0]&&(c=a.cleanPath(l[0]),"/"!==c.charAt(0)&&(c=a.InstallDir(c)),n={proxyFile:c},l[1]&&(l=a.cleanPath(l[1]),n.parentFile=l),n.fits2fits=!1,n.fixpath=!1,a.Load(c,n,{display:e.display}));break;case "regions":if((l=n.stdout.split(/\s+/))&&l[0]){if(1
");if(f)f.html(b);else{l=l||h.textWin;var n=a.lightWin(d, +"inline",b,m,l)}break;case "plot":if(b&&"string"===typeof b)try{var q=JSON.parse(b)}catch(r){a.error("can't plot return data: "+b,r)}else"object"===typeof b&&(q=b);if(!q)return;q.curscale={x:"linear",y:"linear"};b="
";f?f.html(b):(l=l||h.plotWin,n=a.lightWin(d,"inline",b,m,l));var p=$("#"+d+" #"+d+"Plot");f&&(p.css("width",f.css("width")),p.css("height",f.css("height")),p.css("margin",0));if(q.data){switch(a.globalOpts.plotLibrary){case "plotly":h= +$.extend(!0,{},a.Plot.opts,q.opts);q.label&&(h.title=q.label);b={x:[],y:[],type:"scatter"};3<=q.data[0].length&&(b.error_y={type:"data",array:[],visible:!0},q.points&&q.points.yerr&&q.points.yerr.color&&(b.error_y.color=q.points.yerr.color));for(l=0;l");l.on("click",k);b=$("
");b.append(l);p.append(b)}break;case "params":case "regions":case "textline":f?a.allinone?f.html(b):$.ajax({url:b,cache:!1,dataType:"text",success:function(a){f.html(a)}}):(l="params"===c?l||h.paramWin:"regions"===c?"small"===a.globalOpts.regionConfigSize?l||h.regWin0:l||h.regWin:l||h.dpathWin,n=a.allinone?"inline":"ajax",n=a.lightWin(d,n,b,m,l))}return n};a.Image.prototype.saveFITS= +function(c){if(window.hasOwnProperty("saveAs")){c=c?c.replace(/\.fz$/i,"").replace(/(png|jpg|jpeg)$/i,"fits"):"js9.fits";var b=this.toArray({notab:!0,twoaxes:!0});b=new Blob([b],{type:"application/octet-binary"});saveAs(b,c)}else a.error("no saveAs() available to save FITS file");return c};a.Image.prototype.saveIMG=function(c,b,d){var e;if(window.hasOwnProperty("saveAs")){d=d||{};if("number"===typeof d){var f=d;d=null}else if("string"===typeof d){if(a.isNumber(d))f=parseFloat(d),d=null;else try{d= +JSON.parse(d)}catch(m){d=null}d&&(f=d.quality)}c=c||"js9.png";b=b||"image/png";var g=this.display.width;var h=this.display.height;var k=document.createElement("canvas");k.setAttribute("width",g);k.setAttribute("height",h);var l=k.getContext("2d");"image"===d.source?l.putImageData(this.rgb.img,0,0):l.drawImage(this.display.canvas,0,0);if(!1!==d.layers)for(e in this.layers)this.layers.hasOwnProperty(e)&&"main"===this.layers[e].dlayer.dtype&&this.layers[e].show&&(d=this.layers[e].dlayer.canvasjq[0], +l.drawImage(d,0,0,g,h));a.notNull(f)&&(0>f||1a&&(a=Math.abs(a),c="-");for(a=""+a;a.length=f||k>=f?(n="'",c*=60,k*=60):(n='"',c*=3600,k*=3600);h=this.rgb.sect;g=this.binning.bin;f=((h.x1-h.x0)*c).toFixed(0);k=((h.y1-h.y0)*k).toFixed(0);d.wcsfov=""+f+n+" \u00d7 "+k+n;f=(c*g/h.zoom).toFixed(3);d.wcspix=""+f+n+"/pix";d.wcsfovpix=d.wcsfov+" ("+d.wcspix+")";c=a.pix2wcs(this.raw.wcs,(h.x1+h.x0)/ +2,(h.y1+h.y0)/2).trim().split(/\s+/);d.racen=c[0];d.deccen=c[1];d.wcscen=c[0]+"\t "+c[1]}d.vstrsmall=e+"    "+l;d.vstr=m;d.vstrmedium=m;d.vstrlarge=m+"    "+this.file;b&&this.display.displayMessage("info",d,a.globalOpts.valposTarget)}return d};a.Image.prototype.toggleValpos=function(){this.params.valpos=!this.params.valpos;this.params.valpos||this.display.clearMessage()};a.Image.prototype.getColormap=function(){if(this.cmapObj)return{colormap:this.cmapObj.name, +contrast:this.params.contrast,bias:this.params.bias}};a.Image.prototype.setColormap=function(c){for(var b=[],d=0;d=c&&(c*=255),d.alpha=c);break;case 3:d.min=parseFloat(a[b][1]),Number.isNaN(d.min)&&(d.min=-Infinity),d.max=parseFloat(a[b][2]),Number.isNaN(d.max)&&(d.max=Infinity)}break}}};if(!(0<=$.inArray("colormap",this.params.disable)&&this.cmapObj)){switch(b.length){case 1:switch(d){case "rgb":a.globalOpts.rgb.active= +!a.globalOpts.rgb.active;break;case "invert":this.params.invert=!this.params.invert;break;case "reset":this.params.invert=a.imageOpts.invert;this.params.contrast=a.imageOpts.contrast;this.params.bias=a.imageOpts.bias;break;default:if(this.cmapObj&&"static"===this.cmapObj.type)if($.isArray(d))l(d);else if("string"===typeof d&&"["===d.charAt(0))try{var m=JSON.parse(d);l(m)}catch(n){a.error("can't parse JSON in setColormap: "+d,n)}else h(d);else"string"===typeof d&&h(d)}break;case 2:a.isNumber(d)&&a.isNumber(g)? +k(d,g):this.cmapObj&&"static"===this.cmapObj.type&&(h(d),l(g));break;case 3:h(d),k(g,f)}this.displayImage("colors");this.xeqstash&&this.xeqstash.filterRGBImage&&delete this.xeqstash.filterRGBImage;a.globalOpts.extendedPlugins&&this.xeqPlugins("image","onsetcolormap");return this}};a.Image.prototype.getScale=function(){if(this.params.scale)return{scale:this.params.scale,scalemin:this.params.scalemin,scalemax:this.params.scalemax,scaleclipping:this.params.scaleclipping}};a.Image.prototype.setScale= +function(c){for(var b=[],d=0;da&&this.params.disable.push(b[c]);return this.params.disable}if("enable"===a){$.isArray(b)||(b=[b]);for(c=0;cf.search(/(^| )-c/)&&(f+=" -c "+(this.raw.hdu.slice||1));if(g.reduce&&!this.parentFile&&(l=this.fileDimensions(),l=Math.floor(Math.max(l.xdim,l.ydim)/g.dim+.5),1b.radius2)&&a.error("radial profile source region must be an annulus"),b=[(b.radius1+b.radius2)/2,b.surfBrightness,b.surfError],h.data.push(b);return this.displayAnalysis("plot",h,{divid:a.globalOpts.analysisDiv})};a.Image.prototype.plot3d=function(c,b,d){var e,f,g=[];this.raw.header&&3===this.raw.header.NAXIS||a.error("plot3d requires a data cube with 3 dimensions"); +d=$.extend(!0,{},d,a.globalOpts.plot3d);d.cube=d.cube||"*:*:all";var h=d.cube.split(":");for(e=0;e=h.length&&a.cleanupFITSFile(g,!0)}this.raw=this.raws[0];if(g.current0&&g.current0.id)for(h=0;hg||d.alwaysCopy){h=$.extend(!0,{},f);h.current0=f;if(d.bitpix){switch(d.bitpix){case 8:h.data=new Uint8Array(f.height*f.width);break;case 16:h.data=new Int16Array(f.height* +f.width);break;case -16:h.data=new Uint16Array(f.height*f.width);break;case 32:h.data=new Int32Array(f.height*f.width);break;case -32:h.data=new Float32Array(f.height*f.width);break;case -64:h.data=new Float64Array(f.height*f.width)}var l=h.width*h.height;for(b=0;bthis.raw.bitpix&&0>e.argval.raw.bitpix?Math.min(this.raw.bitpix,e.argval.raw.bitpix):0>this.raw.bitpix&&0f||f>=a.height)){var g=0;var h=g+b.xoff;e=a.width;0>h&&(g-=h,e+=h,h=0);h+e>a.width&&(e-=h+e-a.width);if(0>=e)return!1;g=(c*a.width+g)*d;g=new Uint8Array(a.data.buffer,g,e*d);h=(f*a.width+h)*d;e=new Uint8Array(b.data.buffer,h,e*d);e.set(g)}}return!0});return this};a.Image.prototype.rotateData=function(c){for(var b=[],d=0;df&&(f=-f);break;default:g=parseInt(g,10)}a.notNull(k.CD1_1)?(f=-(g*Math.PI/180),e=Math.sin(f),f=Math.cos(f),l.CD1_1=k.CD1_1*f+k.CD1_2*e,l.CD1_2=k.CD1_1*-e+k.CD1_2*f,l.CD2_1=k.CD2_1*f+k.CD2_2*e,l.CD2_2=k.CD2_1*-e+k.CD2_2*f):(l.CROTA2=g,l.CDELT1=e,l.CDELT2=f);h.lcsUseRota2=!0;d.wcsinfo&&(l.ptype=d.wcsinfo.ptype);this.xeqStashSave("rotateData",b,h.rawid);return this.reprojectData(l,h)};a.Image.prototype.reproject=function(c, +b){var d,e,f,g=!1;var h={};var k=/SIMPLE|BITPIX|NAXIS|NAXIS[1-4]|AMDX|AMDY|CD[1-2]_[1-2]|CDELT[1-4]|CNPIX[1-4]|CO1_[1-9][0-9]|CO2_[1-9][0-9]|CROTA[1-4]|CRPIX[1-4]|CRVAL[1-4]|CTYPE[1-4]|CUNIT[1-4]|DATE|DATE_OBS|DC-FLAG|DEC|DETSEC|DETSIZE|EPOCH|EQUINOX|EQUINOX[a-z]|IMAGEH|IMAGEW|LATPOLE|LONGPOLE|MJD-OBS|PC00[1-4]00[1-4]|PC[1-4]_[1-4]|PIXSCALE|PIXSCAL[1-2]|PLTDECH|PLTDECM|PLTDECS|PLTDECSN|PLTRAH|PLTRAM|PLTRAS|PPO|PROJP[1-9]|PROJR0|PV[1-3]_[1-3]|PV[1-4]_[1-4]|RA|RADECSYS|SECPIX|SECPIX|SECPIX[1-2]|UT|UTMID|VELOCITY|VSOURCE|WCSAXES|WCSDEP|WCSDIM|WCSNAME|XPIXSIZE|YPIXSIZE|ZSOURCE|LTM|LTV/; var l=/TAN|SIN|ZEA|STG|ARC/,m=function(b,c){if(!c)return b;b=$.extend(!0,{},b);a.isNull(b.CRVAL1)&&!a.isNull(c.crval1)&&(b.CRVAL1=c.crval1);a.isNull(b.CRVAL2)&&!a.isNull(c.crval2)&&(b.CRVAL2=c.crval2);a.isNull(b.CRPIX1)&&!a.isNull(c.crpix1)&&(b.CRPIX1=c.crpix1);a.isNull(b.CRPIX2)&&!a.isNull(c.crpix2)&&(b.CRPIX2=c.crpix2);a.isNull(b.CDELT1)&&!a.isNull(c.cdelt1)&&(b.CDELT1=c.cdelt1);a.isNull(b.CDELT2)&&!a.isNull(c.cdelt2)&&(b.CDELT2=c.cdelt2);a.isNull(b.CROTA2)&&!a.isNull(c.crot)&&(b.CROTA2=c.crot); return b};if(a.reproject&&c&&this!==c){this.raws&&this.raws[0]||a.error("no raw data for reprojection");var n=this.raws[0];n.header&&n.wcsinfo||a.error("no WCS info available for reprojection");b=b||{};var q=$.extend(!0,{},n.header);for(p in q)q.hasOwnProperty(p)&&k.test(p)&&delete q[p];if("object"===typeof c){c.raw&&c.raw.header?d=c.raw.header:c.BITPIX&&c.NAXIS1&&c.NAXIS2?d=c:a.error("invalid wcs object input to reproject()");for(p in d)d.hasOwnProperty(p)&&k.test(p)&&(h[p]=d[p]);var p=$.extend(!0, {},h,q);if(!p.NAXIS||!p.NAXIS1||!p.NAXIS2)return;h=a.raw2FITS(p,{addcr:!0});q="wcs_"+a.uniqueID()+".txt";a.vfile(q,h);h=a.globalOpts.reproj.xdim||a.globalOpts.image.xdim;k=a.globalOpts.reproj.ydim||a.globalOpts.image.ydim;var u=h*k*32;(p.NAXIS1*p.NAXIS2*Math.abs(p.BITPIX)>u||n.header.NAXIS1*n.header.NAXIS2*Math.abs(n.header.BITPIX)>u)&&a.error("the max reproject size is "+h+" * "+k+" * 4 bytes/pixel. You can use the Bin/Filter/Section plugin to extract a section, then save it as FITS and reproject the smaller image.")}else q= @@ -288,62 +290,62 @@ a.strace(n))}}else if("inactive"===f.status){if(f.winHandle&&(f.winHandle.show() a.Display.prototype.resize=function(c,b,d){var e,f,g=function(a){a.left+=k;a.top+=l;a.setCoords()};a.globalOpts.resize||a.error("display resize not enabled");if(!c&&!b)return{width:this.width,height:this.height};if("full"===c){if(d=b,window.innerWidth&&(c=window.innerWidth),window.innerHeight)for(b=window.innerHeight,e=0;ec||10>b)&&a.error("invalid dimension(s) passed to display resize");if(c===this.width&&b===this.height)return this;d=d||{};e=c;c=b;var k=(e-this.width)/2;var l=(c-this.height)/2;this.width=e;this.height=c;this.divjq.css("width",e);this.divjq.css("height",c);this.canvasjq.attr("width",e);this.canvasjq.attr("height",c);a.bugs.webkit_resize&&!this.resizing&& (this.owidth=Math.min(this.owidth,e),this.oheight=Math.min(this.oheight,c));0<=$.inArray("JS9Menubar",a.globalOpts.resizeDivs)&&(a.isNull(d.resizeMenubar)||d.resizeMenubar)&&(b=this.pluginInstances.JS9Menubar)&&$("#"+this.id+"Menubar").css("width",e);0<=$.inArray("JS9Toolbar",a.globalOpts.resizeDivs)&&(a.isNull(d.resizeToolbar)||d.resizeToolbar)&&(b=this.pluginInstances.JS9Toolbar)&&(b.divjq.attr("data-width",String(e)+"px"),a.Toolbar.init.call(b));0<=$.inArray("JS9Colorbar",a.globalOpts.resizeDivs)&& -(a.isNull(d.resizeColorbar)||d.resizeColorbar)&&(b=this.pluginInstances.JS9Colorbar)&&(b.divjq.attr("data-width",String(e)+"px"),a.Colorbar.init.call(b));for(f in this.layers)this.layers.hasOwnProperty(f)&&(b=this.layers[f],"main"===b.dtype&&(b.divjq.css("width",e),b.divjq.css("height",c),b.canvasjq.attr("width",e),b.canvasjq.attr("height",c),b.canvas.setWidth(e),b.canvas.setHeight(c),b.canvas.calcOffset()));for(e=0;e=this.divjq.width()&&c.y+a.RESIZEDIST>=this.divjq.height()?!0:!1};a.Display.prototype.center=function(){var c=this.divjq,b;var d=c.offset().top;var e=c.height(),f=$(window).height();var g=c.offset().left;c=c.width();var h=$(window).width();for(b=0;b
",b,u.width()));t.isactive&&(c+=sprintf("
",b,u.width()));c+=sprintf("
",b,u.width()-D,u.height()-D);v.isactive&&(c+=sprintf("
", -b,u.width()))}"auto"===l&&A+y*(h+.5)>window.innerWidth&&(g++,h=0);var d=sprintf("width=%s,height=%s,top=%s,left=%s,resize=1,scolling=1",y,w,x+(w+n+q)*g,A+(y+m+p)*h);"auto"===l||"horizontal"===l?h++:"vertical"===l&&g++}return{id:b,html:c,winopts:d}},G=function(g){var h;var l=f++;g.length>l?(l="number"===typeof g[l]?a.images[g[l]]:g[l])&&l.display===b?(l.displayImage("all"),void 0===d?(d=l.display.id,C(d,c),G(g)):(e="string"===typeof c.idbase?h=c.idbase+k++:d.replace(B,"")+"_sep"+a.uniqueID(),z[e]= -l,$("#dhtmlwindowholder").arrive("#"+e,{onceOnly:!0},function(a){h=$(a).attr("id");window.setTimeout(function(){z[h].moveToDisplay(h);G(g)},0)}),l=E(d,e),h&&(l.id=h),a.LoadWindow(null,{id:l.id},"light",l.html,l.winopts))):G(g):a.globalOpts.extendedPlugins&&b.image&&b.image.xeqPlugins("image","onseparatedisplay")};c=c||{};if("string"===typeof c)try{c=JSON.parse(c)}catch(J){a.error("can't parse separate opts: "+c,J)}G(c.images||a.images)};a.Display.prototype.nextImage=function(c){var b,d;c=c||1;if(this.image){var e= -this.image.pos;for(b=0;b=a.images.length&&(d=0),0>d&&(d=a.images.length-1),a.images[d].display!==this);d+=c);b!==d&&(c=a.images[d],c.displayImage("all"),c.refreshLayers(),c.display.clearMessage(),e&&(e=c.displayToImagePos(e),c.valpos=null,c.valpos=c.updateValpos(e,!0)));return this}};a.Display.prototype.loadSession=function(c,b){var d=this,e,f,g={},h=function(c){var e,h=function(){var b=t.canvas.getObjects();b&&"undefined"!==typeof b.length&& -(c.layers[t.layerName].nshape=b.length+1);a.Fabric.updateChildren(t,null,"objects");c.refreshLayers()};var k=g[c.file]||{};k.blend&&(c.blend=$.extend(!0,{},k.blend));k.tmp&&(c.tmp=$.extend(!0,{},k.tmp));k.wcsim&&(c.wcsim=a.lookupImage(k.wcsim));if(k.layers&&k.layers.length)for(e=0;ec.search(/\[struct stat="OK"/)&&(a.waiting(!1),l(),(d=c.match(/msg="(.*)"/))&&d[1]? -a.error(d[1]+" (from "+b+")"):a.error(c||"unknown "+b+" failure"))},n=function(b,c){c=c||{};var e=$.extend(!0,{},c);!1!==c.waiting&&a.waiting(!0,d);e.display=d.id;b=new a.Image(b,e);k.setStatus("createMosaic","complete");b.setStatus("createMosaic","complete");a.waiting(!1)},q=function(c){for(var d=[],e=0;e %s",k,v,w),k=a.reproject(k,w,z,y),m("mProjectPP",k));a.vfile(x,B);k=a.imgtbl(x,".",A,"");m("mImgtbl",k);a.vsize(A)||a.error("no FITS files were added to output table for mosaic");q("create mosaic: %s", -f);k=a.madd(A,z,f,"");m("mAdd",k);l();x=$.extend(!0,{},a.fits.options,b);x.image={xdim:0,ydim:0};x.file=f;a.fits.handleFITSFile(f,x,n)},a.SPINOUT);return this};a.Display.prototype.moveImageInStack=function(c,b){var d,e,f,g;for(e=d=0;d").addClass("JS9Container").css("z-index",0).appendTo(d);g.canvasjq=$("").addClass("JS9Layer").attr("id",h).attr("width",d.css("width")).attr("height",d.css("height")).appendTo(g.divjq);a.bugs.webkit_resize&&"main"===g.dtype&&g.canvasjq.attr("width",this.width).attr("height",this.height);g.canvas=new fabric.Canvas(g.canvasjq[0]);g.canvas.renderOnAddRemove=!1;g.canvas.preserveObjectStacking=!0;g.opts.movable?(g.opts.lockMovementX=!1,g.opts.lockMovementY=!1,g.opts.selectable= -!0,g.opts.evented=!0):!1===g.opts.movable&&(g.opts.lockMovementX=!0,g.opts.lockMovementY=!0,g.opts.selectable=!1,g.opts.evented=!1);void 0===g.opts.changeable&&void 0!==g.opts.fixinplace&&(g.opts.changeable=!g.opts.fixinplace);g.opts.changeable?(g.opts.hasControls=!0,g.opts.hasRotatingPoint=!0,g.opts.hasBorders=!0,g.opts.lockMovementX=!1,g.opts.lockMovementY=!1,g.opts.lockRotation=!1,g.opts.lockScalingX=!1,g.opts.lockScalingY=!1,g.opts.lockUniScaling=!1,g.opts.selectable=!0,g.opts.evented=!0,g.opts.usekeyboard= -!0):!1===g.opts.changeable&&(g.opts.hasControls=!1,g.opts.hasRotatingPoint=!1,g.opts.hasBorders=!1,g.opts.lockMovementX=!0,g.opts.lockMovementY=!0,g.opts.lockRotation=!0,g.opts.lockScalingX=!0,g.opts.lockScalingY=!0,g.opts.lockUniScaling=!0,g.opts.selectable=!1,g.opts.evented=!1,g.opts.usekeyboard=!1);g.opts.selectable&&(g.opts.canvas.selection=!0);if(g.opts.onmousedown||g.opts.onmouseup||g.opts.onmousemove||g.opts.tooltip||g.opts.onmouseover||g.opts.onmouseout){g.opts.evented=!0;if(g.opts.onmousedown)g.canvas.on("mouse:down", -function(b){if(g.display.image&&b.target)"main"===g.dtype&&(g.display.image.clickInRegion=!0,g.display.image.clickInLayer=c),g.opts.onmousedown.call(g.canvas,g.display.image,b.target.pub,b.e,b.target);else if(g.canvas._selection=g.canvas.selection)g.canvas.selection=a.specialKey(b.e)});else g.canvas.on("mouse:down",function(b){if(g.canvas._selection=g.canvas.selection)g.canvas.selection=a.specialKey(b.e)});if(g.opts.onmouseup)g.canvas.on("mouse:up",function(a){g.display.image&&a.target&&g.opts.onmouseup.call(g.canvas, -g.display.image,a.target.pub,a.e,a.target);g.canvas.selection=g.canvas._selection||g.canvas.selection});else g.canvas.on("mouse:up",function(){g.canvas.selection=g.canvas._selection||g.canvas.selection});if(g.opts.onmousemove)g.canvas.on("mouse:move",function(a){g.display.image&&a.target&&g.opts.onmousemove.call(g.canvas,g.display.image,a.target.pub,a.e,a.target)});if(g.opts.onmouseover)g.canvas.on("mouse:over",function(a){g.display.image&&a.target&&g.opts.onmouseover.call(g.canvas,g.display.image, -a.target.pub,a.e,a.target)});if(g.opts.onmouseout)g.canvas.on("mouse:out",function(a){g.display.image&&a.target&&g.opts.onmouseout.call(g.canvas,g.display.image,a.target.pub,a.e,a.target)});g.opts.tooltip&&(g.canvas.on("mouse:over",function(b){g.display.image&&b.target&&a.tooltip(b.target.left+b.target.width+2,b.target.top+b.target.height+2,g.opts.tooltip,g.display.image,b.target.pub,b.e,b.target)}),g.canvas.on("mouse:out",function(b){g.display.image&&b.target&&a.tooltip(b.target.left,b.target.top, -null,g.display.image,b.target.pub,b.e,b.target)}))}else g.canvas.on("mouse:down",function(b){if(g.canvas._selection=g.canvas.selection)g.canvas.selection=a.specialKey(b.e)}),g.canvas.on("mouse:up",function(){g.canvas.selection=g.canvas._selection||g.canvas.selection});"function"===typeof g.opts.ongroupcreate&&(g.opts.canvas.selection=!0,g.opts.selectable=!0,g.canvas.on("selection:created",function(a){var b=[],c=[];g.display.image&&a.target&&"group"===a.target.type&&(a.target.forEachObject(function(a){a.pub&& -(c.push(a),b.push(a.pub))}),g.opts.ongroupcreate.call(g.canvas,g.display.image,b,a.e,c))}));g.canvas.on("object:modified",function(b){var c=[];if(b.target){var d=b.target;a.Fabric.updateChildren(g,d,"deltas");if(g.opts.sortOverlapping&&(d.setCoords(),g.canvas.forEachObject(function(a){a!==d&&d.intersectsWithObject(a)&&(1===fabric.major_version?(e=a.getWidth(),f=a.getHeight()):(e=a.getScaledWidth(),f=a.getScaledHeight()),c.push({obj:a,siz:e*f}))}),c.length)){if(1===fabric.major_version){var e=d.getWidth(); -var f=d.getHeight()}else e=d.getScaledWidth(),f=d.getScaledHeight();c.push({obj:d,siz:e*f});c.sort(function(a,b){return a.sizb.siz?1:0});var h=c.length;for(b=0;b$.inArray(k,e)&&d.addWithUpdate(k)}if(h.params.children)for(k=0;k$.inArray(p,e)&&d.addWithUpdate(p)}switch(h.type){case "polyline":case "polygon":a.Fabric.removePolygonAnchors(g,h)}h&&g.display.image&&g.display.image.updateShapes(c,h,"select")}}g.canvas.renderAll()}else f(g,d)}),g.canvas.on("before:selection:cleared",function(a){var b=g.canvas.getActiveObject();if("activeSelection"===b.type){var c= -g.canvas.getActiveObjects(a);for(a=0;a=this.divjq.width()&&c.y+a.RESIZEDIST>=this.divjq.height()?!0:!1};a.Display.prototype.center=function(){var c=this.divjq,b;var d=c.offset().top;var e=c.height(),f=$(window).height();var g=c.offset().left;c=c.width();var h=$(window).width(); +for(b=0;b",b,u.width()));t.isactive&&(c+=sprintf("
",b,u.width()));c+=sprintf("
", +b,u.width()-D,u.height()-D);v.isactive&&(c+=sprintf("
",b,u.width()))}"auto"===l&&A+y*(h+.5)>window.innerWidth&&(g++,h=0);var d=sprintf("width=%s,height=%s,top=%s,left=%s,resize=1,scolling=1",y,w,x+(w+n+q)*g,A+(y+m+p)*h);"auto"===l||"horizontal"===l?h++:"vertical"===l&&g++}return{id:b,html:c,winopts:d}},G=function(g){var h;var l=f++;g.length>l?(l="number"===typeof g[l]?a.images[g[l]]:g[l])&&l.display=== +b?(l.displayImage("all"),void 0===d?(d=l.display.id,C(d,c),G(g)):(e="string"===typeof c.idbase?h=c.idbase+k++:d.replace(B,"")+"_sep"+a.uniqueID(),z[e]=l,$("#dhtmlwindowholder").arrive("#"+e,{onceOnly:!0},function(a){h=$(a).attr("id");window.setTimeout(function(){z[h].moveToDisplay(h);G(g)},0)}),l=E(d,e),h&&(l.id=h),a.LoadWindow(null,{id:l.id},"light",l.html,l.winopts))):G(g):a.globalOpts.extendedPlugins&&b.image&&b.image.xeqPlugins("image","onseparatedisplay")};c=c||{};if("string"===typeof c)try{c= +JSON.parse(c)}catch(J){a.error("can't parse separate opts: "+c,J)}G(c.images||a.images)};a.Display.prototype.nextImage=function(c){var b,d;c=c||1;if(this.image){var e=this.image.pos;for(b=0;b=a.images.length&&(d=0),0>d&&(d=a.images.length-1),a.images[d].display!==this);d+=c);b!==d&&(c=a.images[d],c.displayImage("all"),c.refreshLayers(),c.display.clearMessage(),e&&(e=c.displayToImagePos(e),c.valpos=null,c.valpos=c.updateValpos(e,!0))); +return this}};a.Display.prototype.loadSession=function(c,b){var d=this,e,f,g={},h=function(c){var e,h=function(){var b=t.canvas.getObjects();b&&"undefined"!==typeof b.length&&(c.layers[t.layerName].nshape=b.length+1);a.Fabric.updateChildren(t,null,"objects");c.refreshLayers()};var k=g[c.file]||{};k.blend&&(c.blend=$.extend(!0,{},k.blend));k.tmp&&(c.tmp=$.extend(!0,{},k.tmp));k.wcsim&&(c.wcsim=a.lookupImage(k.wcsim));if(k.layers&&k.layers.length)for(e=0;ec.search(/\[struct stat="OK"/)&&(a.waiting(!1),l(),(d=c.match(/msg="(.*)"/))&&d[1]?a.error(d[1]+" (from "+b+")"):a.error(c||"unknown "+b+" failure"))},n=function(b,c){c=c||{};var e=$.extend(!0,{},c);!1!==c.waiting&&a.waiting(!0,d);e.display=d.id;b=new a.Image(b,e);k.setStatus("createMosaic","complete");b.setStatus("createMosaic","complete");a.waiting(!1)},q=function(c){for(var d=[],e=0;e %s",k,v,w),k=a.reproject(k,w,z,y),m("mProjectPP",k));a.vfile(x,B);k=a.imgtbl(x,".",A,"");m("mImgtbl",k);a.vsize(A)||a.error("no FITS files were added to output table for mosaic"); +q("create mosaic: %s",f);k=a.madd(A,z,f,"");m("mAdd",k);l();x=$.extend(!0,{},a.fits.options,b);x.image={xdim:0,ydim:0};x.file=f;a.fits.handleFITSFile(f,x,n)},a.SPINOUT);return this};a.Display.prototype.moveImageInStack=function(c,b){var d,e,f,g;for(e=d=0;d").addClass("JS9Container").css("z-index",0).appendTo(d);g.canvasjq=$("").addClass("JS9Layer").attr("id",h).attr("width",d.css("width")).attr("height",d.css("height")).appendTo(g.divjq);a.bugs.webkit_resize&&"main"===g.dtype&&g.canvasjq.attr("width",this.width).attr("height",this.height);g.canvas=new fabric.Canvas(g.canvasjq[0]);g.canvas.renderOnAddRemove=!1;g.canvas.preserveObjectStacking=!0;g.opts.movable?(g.opts.lockMovementX= +!1,g.opts.lockMovementY=!1,g.opts.selectable=!0,g.opts.evented=!0):!1===g.opts.movable&&(g.opts.lockMovementX=!0,g.opts.lockMovementY=!0,g.opts.selectable=!1,g.opts.evented=!1);void 0===g.opts.changeable&&void 0!==g.opts.fixinplace&&(g.opts.changeable=!g.opts.fixinplace);g.opts.changeable?(g.opts.hasControls=!0,g.opts.hasRotatingPoint=!0,g.opts.hasBorders=!0,g.opts.lockMovementX=!1,g.opts.lockMovementY=!1,g.opts.lockRotation=!1,g.opts.lockScalingX=!1,g.opts.lockScalingY=!1,g.opts.lockUniScaling=!1, +g.opts.selectable=!0,g.opts.evented=!0,g.opts.usekeyboard=!0):!1===g.opts.changeable&&(g.opts.hasControls=!1,g.opts.hasRotatingPoint=!1,g.opts.hasBorders=!1,g.opts.lockMovementX=!0,g.opts.lockMovementY=!0,g.opts.lockRotation=!0,g.opts.lockScalingX=!0,g.opts.lockScalingY=!0,g.opts.lockUniScaling=!0,g.opts.selectable=!1,g.opts.evented=!1,g.opts.usekeyboard=!1);g.opts.selectable&&(g.opts.canvas.selection=!0);if(g.opts.onmousedown||g.opts.onmouseup||g.opts.onmousemove||g.opts.tooltip||g.opts.onmouseover|| +g.opts.onmouseout){g.opts.evented=!0;if(g.opts.onmousedown)g.canvas.on("mouse:down",function(b){if(g.display.image&&b.target)"main"===g.dtype&&(g.display.image.clickInRegion=!0,g.display.image.clickInLayer=c),g.opts.onmousedown.call(g.canvas,g.display.image,b.target.pub,b.e,b.target);else if(g.canvas._selection=g.canvas.selection)g.canvas.selection=a.specialKey(b.e)});else g.canvas.on("mouse:down",function(b){if(g.canvas._selection=g.canvas.selection)g.canvas.selection=a.specialKey(b.e)});if(g.opts.onmouseup)g.canvas.on("mouse:up", +function(a){g.display.image&&a.target&&g.opts.onmouseup.call(g.canvas,g.display.image,a.target.pub,a.e,a.target);g.canvas.selection=g.canvas._selection||g.canvas.selection});else g.canvas.on("mouse:up",function(){g.canvas.selection=g.canvas._selection||g.canvas.selection});if(g.opts.onmousemove)g.canvas.on("mouse:move",function(a){g.display.image&&a.target&&g.opts.onmousemove.call(g.canvas,g.display.image,a.target.pub,a.e,a.target)});if(g.opts.onmouseover)g.canvas.on("mouse:over",function(a){g.display.image&& +a.target&&g.opts.onmouseover.call(g.canvas,g.display.image,a.target.pub,a.e,a.target)});if(g.opts.onmouseout)g.canvas.on("mouse:out",function(a){g.display.image&&a.target&&g.opts.onmouseout.call(g.canvas,g.display.image,a.target.pub,a.e,a.target)});g.opts.tooltip&&(g.canvas.on("mouse:over",function(b){g.display.image&&b.target&&a.tooltip(b.target.left+b.target.width+2,b.target.top+b.target.height+2,g.opts.tooltip,g.display.image,b.target.pub,b.e,b.target)}),g.canvas.on("mouse:out",function(b){g.display.image&& +b.target&&a.tooltip(b.target.left,b.target.top,null,g.display.image,b.target.pub,b.e,b.target)}))}else g.canvas.on("mouse:down",function(b){if(g.canvas._selection=g.canvas.selection)g.canvas.selection=a.specialKey(b.e)}),g.canvas.on("mouse:up",function(){g.canvas.selection=g.canvas._selection||g.canvas.selection});"function"===typeof g.opts.ongroupcreate&&(g.opts.canvas.selection=!0,g.opts.selectable=!0,g.canvas.on("selection:created",function(a){var b=[],c=[];g.display.image&&a.target&&"group"=== +a.target.type&&(a.target.forEachObject(function(a){a.pub&&(c.push(a),b.push(a.pub))}),g.opts.ongroupcreate.call(g.canvas,g.display.image,b,a.e,c))}));g.canvas.on("object:modified",function(b){var c=[];if(b.target){var d=b.target;a.Fabric.updateChildren(g,d,"deltas");if(g.opts.sortOverlapping&&(d.setCoords(),g.canvas.forEachObject(function(a){a!==d&&d.intersectsWithObject(a)&&(1===fabric.major_version?(e=a.getWidth(),f=a.getHeight()):(e=a.getScaledWidth(),f=a.getScaledHeight()),c.push({obj:a,siz:e* +f}))}),c.length)){if(1===fabric.major_version){var e=d.getWidth();var f=d.getHeight()}else e=d.getScaledWidth(),f=d.getScaledHeight();c.push({obj:d,siz:e*f});c.sort(function(a,b){return a.sizb.siz?1:0});var h=c.length;for(b=0;b$.inArray(k,e)&&d.addWithUpdate(k)}if(h.params.children)for(k=0;k$.inArray(p,e)&&d.addWithUpdate(p)}switch(h.type){case "polyline":case "polygon":a.Fabric.removePolygonAnchors(g,h)}h&&g.display.image&&g.display.image.updateShapes(c,h,"select")}}g.canvas.renderAll()}else f(g,d)}),g.canvas.on("before:selection:cleared",function(a){var b= +g.canvas.getActiveObject();if("activeSelection"===b.type){var c=g.canvas.getActiveObjects(a);for(a=0;af)&&(f=b.zindex,c=e));a=c}return a};a.Fabric._parseShapeOptions=function(c, diff --git a/js9plugins.js b/js9plugins.js index 04dfde5b..d2e8ab28 100644 --- a/js9plugins.js +++ b/js9plugins.js @@ -12044,6 +12044,182 @@ JS9.RegisterPlugin(JS9.Separate.CLASS, JS9.Separate.NAME, JS9.Separate.init, winResize: true, winDims: [JS9.Separate.WIDTH, JS9.Separate.HEIGHT]}); +/* + * status plugin (February 20, 2020) + */ + +/*global $, sprintf, JS9 */ + +"use strict"; + +// create our namespace, and specify some meta-information and params +JS9.Statusbar = {}; +JS9.Statusbar.CLASS = "JS9"; // class of plugins (1st part of div class) +JS9.Statusbar.NAME = "Statusbar"; // name of this plugin (2nd part of div class) +JS9.Statusbar.WIDTH = 512; // width of light window +JS9.Statusbar.HEIGHT = 24; // height of light window +JS9.Statusbar.BASE = JS9.Statusbar.CLASS + JS9.Statusbar.NAME; + +// when an item is clicked, we want to highlight it +JS9.Statusbar.setup = function(target){ + // unhighlight + $(target).removeClass("JS9StatusbarItemNoHighlight"); + $(target).addClass("JS9StatusbarItemHighlight"); +}; + +// try to display a control plugin for a given menu +JS9.Statusbar.xeq = function(target){ + let s, arr; + // unhighlight + $(target).removeClass("JS9StatusbarItemHighlight"); + $(target).addClass("JS9StatusbarItemNoHighlight"); + // look at the html for this element + s = $(target).html(); + if( s ){ + // is there a hint about what sort of menu status it contains? + arr = s.match(/file|edit|view|zoom|scale|color|regions|wcs|analysis/i); + } + // bring up a control plugin, if possible + if( arr && arr[0] ){ + switch(arr[0]){ + case "file": + break; + case "edit": + break; + case "view": + break; + case "zoom": + break; + case "scale": + JS9.DisplayPlugin("JS9Scale"); + break; + case "color": + break; + case "regions": + break; + case "wcs": + break; + case "analysis": + break; + } + } +} + +// redraw status on display +JS9.Statusbar.display = function(im){ + let i, status; + let s = ""; + if( im && JS9.globalOpts.statusBar ){ + if( $.isArray(JS9.globalOpts.statusBar) ){ + // array of parameter names + for(i=0; i%s: $%s
", status, status); + } + } else { + // formatted string + // escape brackets and parens before macro expansion, then unescape + s = JS9.globalOpts.statusBar + .replace(/\(/g, " __OP__ ") + .replace(/\)/g, " __CP__ ") + .replace(/\[/g, " __OB__ ") + .replace(/\]/g, " __CB__ "); + s = im.expandMacro(s) + .replace(/ __OP__ /g, "(") + .replace(/ __CP__ /g, ")") + .replace(/ __OB__ /g, "[") + .replace(/ __CB__ /g, "]"); + // wrap in element containers + s = `${s}` + .replace(/: */g, ": ") + .replace(/; */g, " "); + } + this.statusContainer.html(s); + } else { + this.statusContainer.html(""); + } +}; + +// constructor: add HTML elements to the plugin +// eslint-disable-next-line no-unused-vars +JS9.Statusbar.init = function(width, height){ + // on entry, these elements have already been defined: + // this.div: the DOM element representing the div for this plugin + // this.divjq: the jquery object representing the div for this plugin + // this.id: the id of the div (or the plugin name as a default) + // this.display: the display object associated with this plugin + // this.dispMode: display mode (for internal use) + // + // set width and height of plugin itself + this.width = this.divjq.attr("data-width"); + if( !this.width ){ + this.width = width || JS9.Statusbar.WIDTH; + } + this.divjq.css("width", this.width); + this.width = parseInt(this.divjq.css("width"), 10); + this.height = this.divjq.attr("data-height"); + if( !this.height ){ + this.height = height || JS9.Statusbar.HEIGHT; + } + this.divjq.css("height", this.height); + this.height = parseInt(this.divjq.css("height"), 10); + // clean plugin container + this.divjq.html(""); + // status container + this.statusContainer = $("
") + .addClass(`${JS9.Statusbar.BASE}Container`) + .attr("id", `${this.id}Container`) + .attr("width", this.width) + .attr("height", this.height) + .appendTo(this.divjq); + // display current status, if necessary + if( this.display.image ){ + JS9.Statusbar.display.call(this, this.display.image); + } +}; + +// callback when image is (re-)displayed +JS9.Statusbar.imagedisplay = function(im){ + if( im ){ + JS9.Statusbar.display.call(this, im); + } +}; + +// callback when image is cleared or closed +// eslint-disable-next-line no-unused-vars +JS9.Statusbar.imageclear = function(im){ + JS9.Statusbar.display.call(this, null); +}; + +// dynamic change +JS9.Statusbar.dynamic = function(im){ + let status; + if( im ){ + status = im.display.pluginInstances.JS9Statusbar; + if( status && status.isDynamic ){ + JS9.Statusbar.imagedisplay.call(this, im); + } + } +}; + +// add this plugin into JS9 +JS9.RegisterPlugin(JS9.Statusbar.CLASS, JS9.Statusbar.NAME, JS9.Statusbar.init, + {menuItem: "Status", + dynamicSelect: true, + ondynamicselect: JS9.Statusbar.dynamic, + onimagedisplay: JS9.Statusbar.imagedisplay, + onimageclear: JS9.Statusbar.imageclear, + onimageclose: JS9.Statusbar.imageclear, + onsetcolormap: JS9.Statusbar.imagedisplay, + onsetcontrastbias: JS9.Statusbar.imagedisplay, + onsetpan: JS9.Statusbar.imagedisplay, + onsetscale: JS9.Statusbar.imagedisplay, + onsetwcssys: JS9.Statusbar.imagedisplay, + onsetwcsunits: JS9.Statusbar.imagedisplay, + onsetzoom: JS9.Statusbar.imagedisplay, + help: "help/status.html", + winTitle: "Status", + winDims: [JS9.Statusbar.WIDTH, JS9.Statusbar.HEIGHT]}); /* * image sync plugin (September 2, 2018) * whenever an operation is performed on this image, sync the target images diff --git a/js9support.css b/js9support.css index d0c90d90..ac885306 100644 --- a/js9support.css +++ b/js9support.css @@ -1640,6 +1640,34 @@ div.JS9MouseTouchHeader, div.JS9MouseTouchFooter { .JS9ScalePlot { border: 1px black solid; } +.JS9StatusbarContainer { + background-color: #D5D5D5; + padding-left: 10px; + height: 100%; + font: normal 12px Arial; +} + +.JS9StatusbarItemContainer { + display:inline-block; + vertical-align:middle; + text-align:center; + white-space:nowrap; + background-color: #D0D0D0; + color: black; + margin-top: 5px; + padding-top: 0px; + padding-bottom: 0px; + padding-right: 2px; + padding-left: 2px; +} + +.JS9StatusbarItemNoHighlight { + border: 1px solid #D0D0D0; +} + +.JS9StatusbarItemHighlight { + border: 1px solid #B5B5B5; +} div.JS9SeparateContainer { padding: 2px; } diff --git a/js9support.txt b/js9support.txt index 758afa52..5e44e306 100644 --- a/js9support.txt +++ b/js9support.txt @@ -1,7 +1,7 @@ css files in js9support.css: css/jquery.contextMenu.css css/dhtmlwindow.css css/tabcontent.css css/spectrum.css -plugins/core/blend.css plugins/core/blink.css plugins/core/cmaps.css plugins/core/colorbar.css plugins/core/cube.css plugins/core/divs.css plugins/core/filters.css plugins/core/imarith.css plugins/core/keyboard.css plugins/core/layers.css plugins/core/mef.css plugins/core/mousetouch.css plugins/core/panzoom.css plugins/core/scalelimits.css plugins/core/separate.css plugins/core/toolbar.css +plugins/core/blend.css plugins/core/blink.css plugins/core/cmaps.css plugins/core/colorbar.css plugins/core/cube.css plugins/core/divs.css plugins/core/filters.css plugins/core/imarith.css plugins/core/keyboard.css plugins/core/layers.css plugins/core/mef.css plugins/core/mousetouch.css plugins/core/panzoom.css plugins/core/scalelimits.css plugins/core/statusbar.css plugins/core/separate.css plugins/core/toolbar.css js files in js9support.js: js/winmod.js js/jquery.min.js js/jquery-ui.min.js js/jquery.contextMenu.min.js js/jquery.flot.min.js js/jquery.flot.errorbars.min.js js/jquery.flot.navigate.min.js js/jquery.flot.resize.min.js js/jquery.flot.selection.min.js js/flot-zoom.min.js js/sprintf.min.js js/dhtmlwindow.min.js js/dhtmlwindow_blurb.js js/fabric.min.js js/pako_inflate.min.js js/FileSaver.min.js js/canvas-toBlob.js js/tabcontent.js js/arrive.min.js js/jquery.doubletap.min.js js/jquery.flot.axislabels.js js/spin.js js/ElementQueries.js js/ResizeSensor.js js/gaussblur.js js/imagefilters.js js/jquery.ui.touch-punch.js js/js9inline.js js/spectrum.min.js js/tinycolor.min.js plugin files in js9plugins.js: -plugins/archive/archive.js plugins/fitsy/binning.js plugins/core/blend.js plugins/core/blink.js plugins/core/cmaps.js plugins/core/colorbar.js plugins/core/console.js plugins/core/cube.js plugins/core/divs.js plugins/core/filters.js plugins/core/imarith.js plugins/core/info.js plugins/core/keyboard.js plugins/core/layers.js plugins/core/magnifier.js plugins/core/mef.js plugins/core/menubar.js plugins/core/panner.js plugins/core/panzoom.js plugins/core/prefs.js plugins/core/scalelimits.js plugins/core/separate.js plugins/core/sync.js plugins/core/toolbar.js plugins/imexam/imexam.js plugins/imexam/encircled.js plugins/imexam/pixtable.js plugins/imexam/radproj.js plugins/imexam/reghist.js plugins/imexam/regstat.js plugins/imexam/xyproj.js plugins/imexam/3dplot.js plugins/imexam/contour.js +plugins/archive/archive.js plugins/fitsy/binning.js plugins/core/blend.js plugins/core/blink.js plugins/core/cmaps.js plugins/core/colorbar.js plugins/core/console.js plugins/core/cube.js plugins/core/divs.js plugins/core/filters.js plugins/core/imarith.js plugins/core/info.js plugins/core/keyboard.js plugins/core/layers.js plugins/core/magnifier.js plugins/core/mef.js plugins/core/menubar.js plugins/core/panner.js plugins/core/panzoom.js plugins/core/prefs.js plugins/core/scalelimits.js plugins/core/separate.js plugins/core/statusbar.js plugins/core/sync.js plugins/core/toolbar.js plugins/imexam/imexam.js plugins/imexam/encircled.js plugins/imexam/pixtable.js plugins/imexam/radproj.js plugins/imexam/reghist.js plugins/imexam/regstat.js plugins/imexam/xyproj.js plugins/imexam/3dplot.js plugins/imexam/contour.js diff --git a/plugins/core/statusbar.css b/plugins/core/statusbar.css new file mode 100644 index 00000000..3ee350fe --- /dev/null +++ b/plugins/core/statusbar.css @@ -0,0 +1,28 @@ +.JS9StatusbarContainer { + background-color: #D5D5D5; + padding-left: 10px; + height: 100%; + font: normal 12px Arial; +} + +.JS9StatusbarItemContainer { + display:inline-block; + vertical-align:middle; + text-align:center; + white-space:nowrap; + background-color: #D0D0D0; + color: black; + margin-top: 5px; + padding-top: 0px; + padding-bottom: 0px; + padding-right: 2px; + padding-left: 2px; +} + +.JS9StatusbarItemNoHighlight { + border: 1px solid #D0D0D0; +} + +.JS9StatusbarItemHighlight { + border: 1px solid #B5B5B5; +} diff --git a/plugins/core/statusbar.js b/plugins/core/statusbar.js new file mode 100644 index 00000000..e0504203 --- /dev/null +++ b/plugins/core/statusbar.js @@ -0,0 +1,176 @@ +/* + * status plugin (February 20, 2020) + */ + +/*global $, sprintf, JS9 */ + +"use strict"; + +// create our namespace, and specify some meta-information and params +JS9.Statusbar = {}; +JS9.Statusbar.CLASS = "JS9"; // class of plugins (1st part of div class) +JS9.Statusbar.NAME = "Statusbar"; // name of this plugin (2nd part of div class) +JS9.Statusbar.WIDTH = 512; // width of light window +JS9.Statusbar.HEIGHT = 24; // height of light window +JS9.Statusbar.BASE = JS9.Statusbar.CLASS + JS9.Statusbar.NAME; + +// when an item is clicked, we want to highlight it +JS9.Statusbar.setup = function(target){ + // unhighlight + $(target).removeClass("JS9StatusbarItemNoHighlight"); + $(target).addClass("JS9StatusbarItemHighlight"); +}; + +// try to display a control plugin for a given menu +JS9.Statusbar.xeq = function(target){ + let s, arr; + // unhighlight + $(target).removeClass("JS9StatusbarItemHighlight"); + $(target).addClass("JS9StatusbarItemNoHighlight"); + // look at the html for this element + s = $(target).html(); + if( s ){ + // is there a hint about what sort of menu status it contains? + arr = s.match(/file|edit|view|zoom|scale|color|regions|wcs|analysis/i); + } + // bring up a control plugin, if possible + if( arr && arr[0] ){ + switch(arr[0]){ + case "file": + break; + case "edit": + break; + case "view": + break; + case "zoom": + break; + case "scale": + JS9.DisplayPlugin("JS9Scale"); + break; + case "color": + break; + case "regions": + break; + case "wcs": + break; + case "analysis": + break; + } + } +} + +// redraw status on display +JS9.Statusbar.display = function(im){ + let i, status; + let s = ""; + if( im && JS9.globalOpts.statusBar ){ + if( $.isArray(JS9.globalOpts.statusBar) ){ + // array of parameter names + for(i=0; i%s: $%s", status, status); + } + } else { + // formatted string + // escape brackets and parens before macro expansion, then unescape + s = JS9.globalOpts.statusBar + .replace(/\(/g, " __OP__ ") + .replace(/\)/g, " __CP__ ") + .replace(/\[/g, " __OB__ ") + .replace(/\]/g, " __CB__ "); + s = im.expandMacro(s) + .replace(/ __OP__ /g, "(") + .replace(/ __CP__ /g, ")") + .replace(/ __OB__ /g, "[") + .replace(/ __CB__ /g, "]"); + // wrap in element containers + s = `${s}` + .replace(/: */g, ": ") + .replace(/; */g, " "); + } + this.statusContainer.html(s); + } else { + this.statusContainer.html(""); + } +}; + +// constructor: add HTML elements to the plugin +// eslint-disable-next-line no-unused-vars +JS9.Statusbar.init = function(width, height){ + // on entry, these elements have already been defined: + // this.div: the DOM element representing the div for this plugin + // this.divjq: the jquery object representing the div for this plugin + // this.id: the id of the div (or the plugin name as a default) + // this.display: the display object associated with this plugin + // this.dispMode: display mode (for internal use) + // + // set width and height of plugin itself + this.width = this.divjq.attr("data-width"); + if( !this.width ){ + this.width = width || JS9.Statusbar.WIDTH; + } + this.divjq.css("width", this.width); + this.width = parseInt(this.divjq.css("width"), 10); + this.height = this.divjq.attr("data-height"); + if( !this.height ){ + this.height = height || JS9.Statusbar.HEIGHT; + } + this.divjq.css("height", this.height); + this.height = parseInt(this.divjq.css("height"), 10); + // clean plugin container + this.divjq.html(""); + // status container + this.statusContainer = $("
") + .addClass(`${JS9.Statusbar.BASE}Container`) + .attr("id", `${this.id}Container`) + .attr("width", this.width) + .attr("height", this.height) + .appendTo(this.divjq); + // display current status, if necessary + if( this.display.image ){ + JS9.Statusbar.display.call(this, this.display.image); + } +}; + +// callback when image is (re-)displayed +JS9.Statusbar.imagedisplay = function(im){ + if( im ){ + JS9.Statusbar.display.call(this, im); + } +}; + +// callback when image is cleared or closed +// eslint-disable-next-line no-unused-vars +JS9.Statusbar.imageclear = function(im){ + JS9.Statusbar.display.call(this, null); +}; + +// dynamic change +JS9.Statusbar.dynamic = function(im){ + let status; + if( im ){ + status = im.display.pluginInstances.JS9Statusbar; + if( status && status.isDynamic ){ + JS9.Statusbar.imagedisplay.call(this, im); + } + } +}; + +// add this plugin into JS9 +JS9.RegisterPlugin(JS9.Statusbar.CLASS, JS9.Statusbar.NAME, JS9.Statusbar.init, + {menuItem: "Status", + dynamicSelect: true, + ondynamicselect: JS9.Statusbar.dynamic, + onimagedisplay: JS9.Statusbar.imagedisplay, + onimageclear: JS9.Statusbar.imageclear, + onimageclose: JS9.Statusbar.imageclear, + onsetcolormap: JS9.Statusbar.imagedisplay, + onsetcontrastbias: JS9.Statusbar.imagedisplay, + onsetpan: JS9.Statusbar.imagedisplay, + onsetscale: JS9.Statusbar.imagedisplay, + onsetwcssys: JS9.Statusbar.imagedisplay, + onsetwcsunits: JS9.Statusbar.imagedisplay, + onsetzoom: JS9.Statusbar.imagedisplay, + help: "help/status.html", + winTitle: "Status", + winDims: [JS9.Statusbar.WIDTH, JS9.Statusbar.HEIGHT]});