{"version":3,"sources":["selection.js","selectionoverlay.js","selectionrect.js"],"names":["$","onOutsideDrag","e","this","viewer","setMouseNavEnabled","delta","viewport","deltaPointsFromPixels","end","pointFromPixel","position","start","Point","x","y","rect","oldRect","restrictToImage","clone","rectDone","allowRotation","angle1","getAngleFromCenter","angle2","rotation","Math","PI","startRotated","getPrerotatedRect","rotatedStartPoint","startRotatedHeight","width","height","bounds","world","getHomeBounds","fitsIn","Rect","pointIsInImage","restrictVector","SelectionRect","draw","onOutsideDragEnd","abs","onClick","canvas","focus","onInsideDrag","addClass","element","onInsideDragEnd","removeClass","onBorderDrag","border","center","getDegreeRotation","rotate","getCenter","newCenter","target","minus","onBorderDragEnd","onKeyPress","key","keyCode","charCode","confirm","String","fromCharCode","keyboardShortcut","toggleState","dist","distanceTo","angle","atan2","heightModDelta","self","point","prop","version","major","Error","Viewer","prototype","selection","options","selectionInstance","Selection","extend","isSelecting","buttonActiveImg","toggleButton","showSelectionControl","showConfirmDenyButtons","styleConfirmDenyButtons","returnPixelCoordinates","onSelection","prefixUrl","navImages","REST","GROUP","HOVER","DOWN","selectionConfirm","selectionCancel","handleStyle","top","left","margin","background","cornersStyle","makeNeutralElement","style","className","borders","handle","corners","i","MouseTracker","dragHandler","bind","dragEndHandler","appendChild","setTimeout","right","bottom","overlay","SelectionOverlay","innerTracker","clickTimeThreshold","clickDistThreshold","delegate","clickHandler","outerTracker","startDisabled","addEvent","container","prefix","useGroup","buttons","anyButton","onFocusHandler","onFocus","onBlurHandler","onBlur","Button","getElement","tooltip","getString","srcRest","srcGroup","srcHover","srcDown","onRelease","push","imgDown","cloneNode","confirmButton","classList","add","cancelButton","cancel","transform","addHandler","ControlDock","setState","enabled","setTracking","undraw","visibility","raiseEvent","setAllowRotation","enable","disable","update","normalize","drawHTML","drawer","destroy","result","real","viewportToImageRectangle","fromRect","round","OpenSeadragon","location","Overlay","apply","arguments","isPlainObject","Object","create","replace","equals","other","toString","swapWidthHeight","swapped","diff","fixed","area","getTopLeft","getTopRight","getBottomRight","getBottomLeft","areaEnd","reduceRotation","reduced"],"mappings":"CAAA,SAAAA,GACA,YAyVA,SAAAC,GAAAC,GAEAC,KAAAC,OAAAC,oBAAA,EACA,IAAAC,GAAAH,KAAAC,OAAAG,SAAAC,sBAAAN,EAAAI,OAAA,GACAG,EAAAN,KAAAC,OAAAG,SAAAG,eAAAR,EAAAS,UAAA,GACAC,EAAA,GAAAZ,GAAAa,MAAAJ,EAAAK,EAAAR,EAAAQ,EAAAL,EAAAM,EAAAT,EAAAS,EACA,IAAAZ,KAAAa,KAcA,CACA,GAAAC,EAIA,IAHAd,KAAAe,kBACAD,EAAAd,KAAAa,KAAAG,SAEAhB,KAAAiB,UAEA,GAAAjB,KAAAkB,cAAA,CACA,GAAAC,GAAAnB,KAAAa,KAAAO,mBAAAX,GACAY,EAAArB,KAAAa,KAAAO,mBAAAd,EACAN,MAAAa,KAAAS,UAAAtB,KAAAa,KAAAS,SAAAH,EAAAE,GAAAE,KAAAC,QAGAxB,MAAAyB,aACAzB,KAAAa,KAAAa,EAAA1B,KAAA2B,kBAAArB,EAAAN,KAAA4B,qBAEA5B,KAAAa,KAAAgB,OAAA1B,EAAAQ,EACAX,KAAAa,KAAAiB,QAAA3B,EAAAS,EAGA,IAAAmB,GAAA/B,KAAAC,OAAA+B,MAAAC,eACAjC,MAAAe,kBAAAf,KAAAa,KAAAqB,OAAA,GAAArC,GAAAsC,KAAA,EAAA,EAAAJ,EAAAF,MAAAE,EAAAD,WACA9B,KAAAa,KAAAC,OApCA,CACA,GAAAd,KAAAe,gBAAA,CACA,IAAAqB,EAAApC,KAAAS,GACA,MAEA4B,GAAAlC,EAAAG,GAEAN,KAAAyB,cACAzB,KAAA2B,kBAAAlB,EACAT,KAAAa,KAAAa,EAAAjB,EAAAH,EAAAN,KAAA4B,qBAEA5B,KAAAa,KAAA,GAAAhB,GAAAyC,cAAA7B,EAAAE,EAAAF,EAAAG,EAAAT,EAAAQ,EAAAR,EAAAS,GAEAZ,KAAAiB,UAAA,EA0BAjB,KAAAuC,OAGA,QAAAC,KAGAxC,KAAAa,KAAAgB,MAAA,IACA7B,KAAAa,KAAAF,GAAAX,KAAAa,KAAAgB,MACA7B,KAAAa,KAAAgB,MAAAN,KAAAkB,IAAAzC,KAAAa,KAAAgB,QAEA7B,KAAAa,KAAAiB,OAAA,IACA9B,KAAAa,KAAAD,GAAAZ,KAAAa,KAAAiB,OACA9B,KAAAa,KAAAiB,OAAAP,KAAAkB,IAAAzC,KAAAa,KAAAiB,SAIA9B,KAAAC,OAAAC,oBAAA,GACAF,KAAAiB,UAAA,EAGA,QAAAyB,KACA1C,KAAAC,OAAA0C,OAAAC,QAGA,QAAAC,GAAA9C,GACAF,EAAAiD,SAAA9C,KAAA+C,QAAA,WACA,IAAA5C,GAAAH,KAAAC,OAAAG,SAAAC,sBAAAN,EAAAI,OAAA,EACAH,MAAAa,KAAAF,GAAAR,EAAAQ,EACAX,KAAAa,KAAAD,GAAAT,EAAAS,CACA,IAAAmB,GAAA/B,KAAAC,OAAA+B,MAAAC,eACAjC,MAAAe,kBAAAf,KAAAa,KAAAqB,OAAA,GAAArC,GAAAsC,KAAA,EAAA,EAAAJ,EAAAF,MAAAE,EAAAD,WACA9B,KAAAa,KAAAF,GAAAR,EAAAQ,EACAX,KAAAa,KAAAD,GAAAT,EAAAS,GAEAZ,KAAAuC,OAGA,QAAAS,KACAnD,EAAAoD,YAAAjD,KAAA+C,QAAA,YAGA,QAAAG,GAAAC,EAAApD,GACA,GAEAqD,GAFAjD,EAAAJ,EAAAI,MACAmB,EAAAtB,KAAAa,KAAAwC,oBAEAvC,EAAAd,KAAAe,gBAAAf,KAAAa,KAAAG,QAAA,IAOA,QANA,IAAAM,IAEAnB,EAAAA,EAAAmD,UAAAhC,EAAA,GAAAzB,GAAAa,MAAA,EAAA,IACA0C,EAAApD,KAAAa,KAAA0C,aAEApD,EAAAH,KAAAC,OAAAG,SAAAC,sBAAAF,GAAA,GACAgD,GACA,IAAA,GACAnD,KAAAa,KAAAD,GAAAT,EAAAS,EACAZ,KAAAa,KAAAiB,QAAA3B,EAAAS,CACA,MACA,KAAA,GACAZ,KAAAa,KAAAgB,OAAA1B,EAAAQ,CACA,MACA,KAAA,GACAX,KAAAa,KAAAiB,QAAA3B,EAAAS,CACA,MACA,KAAA,GACAZ,KAAAa,KAAAF,GAAAR,EAAAQ,EACAX,KAAAa,KAAAgB,OAAA1B,EAAAQ,CACA,MACA,KAAA,GACAX,KAAAa,KAAAD,GAAAT,EAAAS,EACAZ,KAAAa,KAAAiB,QAAA3B,EAAAS,EACAZ,KAAAa,KAAAF,GAAAR,EAAAQ,EACAX,KAAAa,KAAAgB,OAAA1B,EAAAQ,CACA,MACA,KAAA,KACAX,KAAAa,KAAAD,GAAAT,EAAAS,EACAZ,KAAAa,KAAAiB,QAAA3B,EAAAS,EACAZ,KAAAa,KAAAgB,OAAA1B,EAAAQ,CACA,MACA,KAAA,KACAX,KAAAa,KAAAgB,OAAA1B,EAAAQ,EACAX,KAAAa,KAAAiB,QAAA3B,EAAAS,CACA,MACA,KAAA,KACAZ,KAAAa,KAAAiB,QAAA3B,EAAAS,EACAZ,KAAAa,KAAAF,GAAAR,EAAAQ,EACAX,KAAAa,KAAAgB,OAAA1B,EAAAQ,EAGA,GAAA,IAAAW,EAAA,CAEA,GAAAkC,GAAAxD,KAAAa,KAAA0C,YAEAE,EAAAD,EAAAF,OAAAhC,EAAA8B,EAEAjD,GAAAsD,EAAAC,MAAAF,GACAxD,KAAAa,KAAAF,GAAAR,EAAAQ,EACAX,KAAAa,KAAAD,GAAAT,EAAAS,EAEA,GAAAmB,GAAA/B,KAAAC,OAAA+B,MAAAC,eACAjC,MAAAe,kBAAAf,KAAAa,KAAAqB,OAAA,GAAArC,GAAAsC,KAAA,EAAA,EAAAJ,EAAAF,MAAAE,EAAAD,WACA9B,KAAAa,KAAAC,GAEAd,KAAAuC,OAKA,QAAAoB,KACA3D,KAAAa,KAAAgB,MAAA,IACA7B,KAAAa,KAAAF,GAAAX,KAAAa,KAAAgB,MACA7B,KAAAa,KAAAgB,MAAAN,KAAAkB,IAAAzC,KAAAa,KAAAgB,QAEA7B,KAAAa,KAAAiB,OAAA,IACA9B,KAAAa,KAAAD,GAAAZ,KAAAa,KAAAiB,OACA9B,KAAAa,KAAAiB,OAAAP,KAAAkB,IAAAzC,KAAAa,KAAAiB,SAIA,QAAA8B,GAAA7D,GACA,GAAA8D,GAAA9D,EAAA+D,QAAA/D,EAAA+D,QAAA/D,EAAAgE,QACA,MAAAF,EACA7D,KAAAgE,UACAC,OAAAC,aAAAL,KAAA7D,KAAAmE,kBACAnE,KAAAoE,cAIA,QAAA1C,GAAAjB,EAAAH,EAAAwB,GACA,GAAArB,EAAAE,EAAAL,EAAAK,EAAA,CAEA,GAAAA,GAAAF,CACAA,GAAAH,EACAA,EAAAK,EAEA,GAAAR,GAAAG,EAAAoD,MAAAjD,GACA4D,EAAA5D,EAAA6D,WAAAhE,GACAiE,KAAAhD,KAAAiD,MAAArE,EAAAQ,EAAAR,EAAAS,GAAAW,KAAAC,GAAA,EACA4B,EAAA,GAAAvD,GAAAa,MACAP,EAAAQ,EAAA,EAAAF,EAAAE,EACAR,EAAAS,EAAA,EAAAH,EAAAG,GAEAC,EAAA,GAAAhB,GAAAyC,cACAc,EAAAzC,EAAA0D,EAAA,EACAjB,EAAAxC,EAAAkB,EAAA,EACAuC,EACAvC,EACAyC,GAEAE,EAAA,GAAA5E,GAAAa,MAAA,EAAAoB,EAIA,OAHA2C,GAAAA,EAAAnB,OAAAzC,EAAAwC,oBAAA,GAAAxD,GAAAa,MAAA,EAAA,IACAG,EAAAF,GAAA8D,EAAA9D,EAAA,EACAE,EAAAD,GAAA6D,EAAA7D,EAAA,EACAC,EAGA,QAAAuB,GAAAsC,EAAAC,GACA,GAAA5C,GAAA2C,EAAAzE,OAAA+B,MAAAC,eACA,OAAA0C,GAAAhE,GAAA,GAAAgE,EAAAhE,GAAAoB,EAAAF,OAAA8C,EAAA/D,GAAA,GAAA+D,EAAA/D,GAAAmB,EAAAD,OAGA,QAAAO,GAAAlC,EAAAG,GACA,GAAAG,EACA,KAAA,GAAAmE,MAAAjE,EAAA,EAAAC,EAAA,GACAH,EAAAH,EAAAsE,GAAAzE,EAAAyE,GACAnE,EAAA,GAAAA,EAAA,IACAH,EAAAsE,GAAA,GACAzE,EAAAyE,IAAAtE,EAAAsE,GAAA,EACAtE,EAAAsE,GAAA,GACAtE,EAAAsE,GAAA,IACAzE,EAAAyE,IAAAtE,EAAAsE,GACAtE,EAAAsE,GAAA,IA9iBA,IAAA/E,EAAAgF,SAAAhF,EAAAgF,QAAAC,MAAA,EACA,KAAA,IAAAC,OAAA,+EAGAlF,GAAAmF,OAAAC,UAAAC,UAAA,SAAAC,GAMA,MALAnF,MAAAoF,oBAAAD,IACAA,EAAAA,MACAA,EAAAlF,OAAAD,KACAA,KAAAoF,kBAAA,GAAAvF,GAAAwF,UAAAF,IAEAnF,KAAAoF,mBAUAvF,EAAAwF,UAAA,SAAAF,GAEAtF,EAAAyF,QAAA,EAAAtF,MAEAC,OAAA,KACAsF,aAAA,EACAC,iBAAA,EACAvE,UAAA,EAGA8B,QAAA,KACA0C,aAAA,KACAC,sBAAA,EACAC,wBAAA,EACAC,yBAAA,EACAC,wBAAA,EACA1B,iBAAA,IACAtD,KAAA,KACAK,eAAA,EACAO,cAAA,EACAG,mBAAA,GACAb,iBAAA,EACA+E,YAAA,KACAC,UAAA,KACAC,WACAd,WACAe,KAAA,qBACAC,MAAA,2BACAC,MAAA,sBACAC,KAAA,yBAEAC,kBACAJ,KAAA,6BACAC,MAAA,mCACAC,MAAA,8BACAC,KAAA,iCAEAE,iBACAL,KAAA,4BACAC,MAAA,kCACAC,MAAA,6BACAC,KAAA,iCAGAG,aACAC,IAAA,MACAC,KAAA,MACA5E,MAAA,MACAC,OAAA,MACA4E,OAAA,gBACAC,WAAA,OACAxD,OAAA,kBAEAyD,cACA/E,MAAA,MACAC,OAAA,MACA6E,WAAA,OACAxD,OAAA,mBAGAgC,GAEAtF,EAAAyF,QAAA,EAAAtF,KAAAgG,UAAAhG,KAAAC,OAAA+F,WAEAhG,KAAA+C,UACA/C,KAAA+C,QAAAlD,EAAAgH,mBAAA,OACA7G,KAAA+C,QAAA+D,MAAAH,WAAA,qBACA3G,KAAA+C,QAAAgE,UAAA,iBAEA/G,KAAAgH,QAAAhH,KAAAgH,WAGA,KAAA,GAFAC,GACAC,KACAC,EAAA,EAAAA,EAAA,EAAAA,IACAnH,KAAAgH,QAAAG,KACAnH,KAAAgH,QAAAG,GAAAtH,EAAAgH,mBAAA,OACA7G,KAAAgH,QAAAG,GAAAJ,UAAA,UAAAI,EACAnH,KAAAgH,QAAAG,GAAAL,MAAAtG,SAAA,WACAR,KAAAgH,QAAAG,GAAAL,MAAAjF,MAAA,MACA7B,KAAAgH,QAAAG,GAAAL,MAAAhF,OAAA,MACA9B,KAAAgH,QAAAG,GAAAL,MAAAH,WAAA,QAGAM,EAAApH,EAAAgH,mBAAA,OACAI,EAAAF,UAAA,UAAAI,EAAA,UACAF,EAAAH,MAAAtG,SAAA,WACAyG,EAAAH,MAAAN,IAAAxG,KAAAuG,YAAAC,IACAS,EAAAH,MAAAL,KAAAzG,KAAAuG,YAAAE,KACAQ,EAAAH,MAAAjF,MAAA7B,KAAAuG,YAAA1E,MACAoF,EAAAH,MAAAhF,OAAA9B,KAAAuG,YAAAzE,OACAmF,EAAAH,MAAAJ,OAAA1G,KAAAuG,YAAAG,OACAO,EAAAH,MAAAH,WAAA3G,KAAAuG,YAAAI,WACAM,EAAAH,MAAA3D,OAAAnD,KAAAuG,YAAApD,OACA,GAAAtD,GAAAuH,cACArE,QAAA/C,KAAAgH,QAAAG,GACAE,YAAAnE,EAAAoE,KAAAtH,KAAAmH,GACAI,eAAA5D,EAAA2D,KAAAtH,KAAAmH,KAGAD,EAAAC,GAAAtH,EAAAgH,mBAAA,OACAK,EAAAC,GAAAJ,UAAA,UAAAI,EAAA,UACAD,EAAAC,GAAAL,MAAAtG,SAAA,WACA0G,EAAAC,GAAAL,MAAAjF,MAAA7B,KAAA4G,aAAA/E,MACAqF,EAAAC,GAAAL,MAAAhF,OAAA9B,KAAA4G,aAAA9E,OACAoF,EAAAC,GAAAL,MAAAH,WAAA3G,KAAA4G,aAAAD,WACAO,EAAAC,GAAAL,MAAA3D,OAAAnD,KAAA4G,aAAAzD,OACA,GAAAtD,GAAAuH,cACArE,QAAAmE,EAAAC,GACAE,YAAAnE,EAAAoE,KAAAtH,KAAAmH,EAAA,IACAI,eAAA5D,EAAA2D,KAAAtH,KAAAmH,KAGAnH,KAAAgH,QAAAG,GAAAK,YAAAP,GACAjH,KAAA+C,QAAAyE,YAAAxH,KAAAgH,QAAAG,IAEAM,WAAAzH,KAAA+C,QAAAyE,YAAAF,KAAAtH,KAAA+C,QAAAmE,EAAAC,IAAA,EAEAnH,MAAAgH,QAAA,GAAAF,MAAAN,IAAA,EACAxG,KAAAgH,QAAA,GAAAF,MAAAjF,MAAA,OACA7B,KAAAgH,QAAA,GAAAF,MAAAY,MAAA,EACA1H,KAAAgH,QAAA,GAAAF,MAAAhF,OAAA,OACA9B,KAAAgH,QAAA,GAAAF,MAAAa,OAAA,EACA3H,KAAAgH,QAAA,GAAAF,MAAAjF,MAAA,OACA7B,KAAAgH,QAAA,GAAAF,MAAAL,KAAA,EACAzG,KAAAgH,QAAA,GAAAF,MAAAhF,OAAA,OACAoF,EAAA,GAAAJ,MAAAN,IAAA,OACAU,EAAA,GAAAJ,MAAAL,KAAA,OACAS,EAAA,GAAAJ,MAAAN,IAAA,OACAU,EAAA,GAAAJ,MAAAY,MAAA,OACAR,EAAA,GAAAJ,MAAAa,OAAA,OACAT,EAAA,GAAAJ,MAAAY,MAAA,OACAR,EAAA,GAAAJ,MAAAa,OAAA,OACAT,EAAA,GAAAJ,MAAAL,KAAA,OAEAzG,KAAA4H,UACA5H,KAAA4H,QAAA,GAAA/H,GAAAgI,iBAAA7H,KAAA+C,QAAA/C,KAAAa,MAAA,GAAAhB,GAAAyC,gBAGAtC,KAAA8H,aAAA,GAAAjI,GAAAuH,cACArE,QAAA/C,KAAA+C,QACAgF,mBAAA/H,KAAAC,OAAA8H,mBACAC,mBAAAhI,KAAAC,OAAA+H,mBACAX,YAAAxH,EAAAoI,SAAAjI,KAAA6C,GACA0E,eAAA1H,EAAAoI,SAAAjI,KAAAgD,GAEAkF,aAAArI,EAAAoI,SAAAjI,KAAA0C,KAKA1C,KAAAmI,aAAA,GAAAtI,GAAAuH,cACArE,QAAA/C,KAAAC,OAAA0C,OACAoF,mBAAA/H,KAAAC,OAAA8H,mBACAC,mBAAAhI,KAAAC,OAAA+H,mBACAX,YAAAxH,EAAAoI,SAAAjI,KAAAF,GACAyH,eAAA1H,EAAAoI,SAAAjI,KAAAwC,GACA0F,aAAArI,EAAAoI,SAAAjI,KAAA0C,GACA0F,eAAApI,KAAAuF,cAGAvF,KAAAmE,kBACAtE,EAAAwI,SACArI,KAAAC,OAAAqI,UACA,WACAzI,EAAAoI,SAAAjI,KAAA4D,IACA,EAIA,IAAA2E,GAAAvI,KAAA+F,WAAA/F,KAAAC,OAAA8F,WAAA,GACAyC,EAAAxI,KAAAC,OAAAwI,SAAAzI,KAAAC,OAAAwI,QAAAA,QACAC,EAAAF,EAAAxI,KAAAC,OAAAwI,QAAAA,QAAA,GAAA,KACAE,EAAAD,EAAAA,EAAAE,QAAA,KACAC,EAAAH,EAAAA,EAAAI,OAAA,IAwBA,IAvBA9I,KAAA0F,uBACA1F,KAAAyF,aAAA,GAAA5F,GAAAkJ,QACAhG,QAAA/C,KAAAyF,aAAA5F,EAAAmJ,WAAAhJ,KAAAyF,cAAA,KACAsC,mBAAA/H,KAAAC,OAAA8H,mBACAC,mBAAAhI,KAAAC,OAAA+H,mBACAiB,QAAApJ,EAAAqJ,UAAA,6BAAA,mBACAC,QAAAZ,EAAAvI,KAAAgG,UAAAd,UAAAe,KACAmD,SAAAb,EAAAvI,KAAAgG,UAAAd,UAAAgB,MACAmD,SAAAd,EAAAvI,KAAAgG,UAAAd,UAAAiB,MACAmD,QAAAf,EAAAvI,KAAAgG,UAAAd,UAAAkB,KACAmD,UAAAvJ,KAAAoE,YAAAkD,KAAAtH,MACA4I,QAAAD,EACAG,OAAAD,IAEAL,IACAxI,KAAAC,OAAAwI,QAAAA,QAAAe,KAAAxJ,KAAAyF,cACAzF,KAAAC,OAAAwI,QAAA1F,QAAAyE,YAAAxH,KAAAyF,aAAA1C,UAEA/C,KAAAyF,aAAAgE,UACAzJ,KAAAwF,gBAAAxF,KAAAyF,aAAAgE,QAAAC,WAAA,GACA1J,KAAAyF,aAAA1C,QAAAyE,YAAAxH,KAAAwF,mBAGAxF,KAAA2F,uBAAA,CACA3F,KAAA2J,cAAA,GAAA9J,GAAAkJ,QACAhG,QAAA/C,KAAA2J,cAAA9J,EAAAmJ,WAAAhJ,KAAA2J,eAAA,KACA5B,mBAAA/H,KAAAC,OAAA8H,mBACAC,mBAAAhI,KAAAC,OAAA+H,mBACAiB,QAAApJ,EAAAqJ,UAAA,8BAAA,oBACAC,QAAAZ,EAAAvI,KAAAgG,UAAAK,iBAAAJ,KACAmD,SAAAb,EAAAvI,KAAAgG,UAAAK,iBAAAH,MACAmD,SAAAd,EAAAvI,KAAAgG,UAAAK,iBAAAF,MACAmD,QAAAf,EAAAvI,KAAAgG,UAAAK,iBAAAD,KACAmD,UAAAvJ,KAAAgE,QAAAsD,KAAAtH,MACA4I,QAAAD,EACAG,OAAAD,GAEA,IAAA7E,GAAAhE,KAAA2J,cAAA5G,OACAiB,GAAA4F,UAAAC,IAAA,kBACA7J,KAAA+C,QAAAyE,YAAAxD,GAEAhE,KAAA8J,aAAA,GAAAjK,GAAAkJ,QACAhG,QAAA/C,KAAA8J,aAAAjK,EAAAmJ,WAAAhJ,KAAA8J,cAAA,KACA/B,mBAAA/H,KAAAC,OAAA8H,mBACAC,mBAAAhI,KAAAC,OAAA+H,mBACAiB,QAAApJ,EAAAqJ,UAAA,8BAAA,mBACAC,QAAAZ,EAAAvI,KAAAgG,UAAAM,gBAAAL,KACAmD,SAAAb,EAAAvI,KAAAgG,UAAAM,gBAAAJ,MACAmD,SAAAd,EAAAvI,KAAAgG,UAAAM,gBAAAH,MACAmD,QAAAf,EAAAvI,KAAAgG,UAAAM,gBAAAF,KACAmD,UAAAvJ,KAAA+J,OAAAzC,KAAAtH,MACA4I,QAAAD,EACAG,OAAAD,GAEA,IAAAkB,GAAA/J,KAAA8J,aAAA/G,OACAgH,GAAAH,UAAAC,IAAA,iBACA7J,KAAA+C,QAAAyE,YAAAuC,GAEA/J,KAAA4F,0BACA5B,EAAA8C,MAAAtG,SAAA,WACAwD,EAAA8C,MAAAN,IAAA,MACAxC,EAAA8C,MAAAL,KAAA,MACAzC,EAAA8C,MAAAkD,UAAA,yBAEAD,EAAAjD,MAAAtG,SAAA,WACAuJ,EAAAjD,MAAAN,IAAA,MACAuD,EAAAjD,MAAAL,KAAA,MACAsD,EAAAjD,MAAAkD,UAAA,sBAIAhK,KAAAC,OAAAgK,WAAA,YAAAjK,KAAA8F,aAEA9F,KAAAC,OAAAgK,WAAA,OAAAjK,KAAAuC,KAAA+E,KAAAtH,OACAA,KAAAC,OAAAgK,WAAA,YAAAjK,KAAAuC,KAAA+E,KAAAtH,OACAA,KAAAC,OAAAgK,WAAA,SAAAjK,KAAAuC,KAAA+E,KAAAtH,OACAA,KAAAC,OAAAgK,WAAA,SAAAjK,KAAAuC,KAAA+E,KAAAtH,QAGAH,EAAAyF,OAAAzF,EAAAwF,UAAAJ,UAAApF,EAAAqK,YAAAjF,WAEAb,YAAA,WACA,MAAApE,MAAAmK,UAAAnK,KAAAuF,cAGA4E,SAAA,SAAAC,GASA,MARApK,MAAAuF,YAAA6E,EAEApK,KAAAmI,aAAAkC,YAAAD,GACAA,EAAApK,KAAAuC,OAAAvC,KAAAsK,SACAtK,KAAAwF,kBACAxF,KAAAwF,gBAAAsB,MAAAyD,WAAAH,EAAA,UAAA,UAEApK,KAAAC,OAAAuK,WAAA,oBAAAJ,QAAAA,IACApK,MAGAyK,iBAAA,SAAAvJ,GACAlB,KAAAkB,cAAAA,GAGAwJ,OAAA,WACA,MAAA1K,MAAAmK,UAAA,IAGAQ,QAAA,WACA,MAAA3K,MAAAmK,UAAA,IAGA5H,KAAA,WAKA,MAJAvC,MAAAa,OACAb,KAAA4H,QAAAgD,OAAA5K,KAAAa,KAAAgK,aACA7K,KAAA4H,QAAAkD,SAAA9K,KAAAC,OAAA8K,OAAAzC,UAAAtI,KAAAC,OAAAG,WAEAJ,MAGAsK,OAAA,WAGA,MAFAtK,MAAA4H,QAAAoD,UACAhL,KAAAa,KAAA,KACAb,MAGAgE,QAAA,WACA,GAAAhE,KAAAa,KAAA,CACA,GAAAoK,GAAAjL,KAAAa,KAAAgK,WACA,IAAA7K,KAAA6F,uBAAA,CACA,GAAAqF,GAAAlL,KAAAC,OAAAG,SAAA+K,yBAAAF,EACAC,GAAArL,EAAAyC,cAAA8I,SAAAF,GAAAG,QACAH,EAAA5J,SAAA2J,EAAA3J,SACA2J,EAAAC,EAEAlL,KAAAC,OAAAuK,WAAA,YAAAS,GACAjL,KAAAsK,SAEA,MAAAtK,OAGA+J,OAAA,WAQA,MAHA/J,MAAAmI,aAAAkC,aAAA,GACArK,KAAAmI,aAAAkC,aAAA,GACArK,KAAAC,OAAAuK,WAAA,oBAAA,GACAxK,KAAAsK,aAiOAgB,eCvjBA,SAAAzL,GACA,YAuBAA,GAAAgI,iBAAA,SAAA9E,EAAAwI,GACA1L,EAAA2L,QAAAC,MAAAzL,KAAA0L,WAGA7L,EAAA8L,cAAA5I,GACA/C,KAAAsB,SAAAyB,EAAAwI,SAAAjK,UAAA,EAEAtB,KAAAsB,SAAAiK,EAAAjK,UAAA,GAIAzB,EAAAgI,iBAAA5C,UAAApF,EAAAyF,OAAAsG,OAAAC,OAAAhM,EAAA2L,QAAAvG,YAMA6F,SAAA,WACAjL,EAAA2L,QAAAvG,UAAA6F,SAAAW,MAAAzL,KAAA0L,WACA1L,KAAA8G,MAAAkD,UAAAhK,KAAA8G,MAAAkD,UAAA8B,QAAA,oBAAA,IACA,WAAA9L,KAAAsB,SAAA,QAQAsJ,OAAA,SAAAW,GACA1L,EAAA2L,QAAAvG,UAAA2F,OAAAa,MAAAzL,KAAA0L,WACA1L,KAAAsB,SAAAiK,EAAAjK,UAAA,MAIAgK,eC1DA,SAAAzL,GACA,YAeAA,GAAAyC,cAAA,SAAA3B,EAAAC,EAAAiB,EAAAC,EAAAR,GACAzB,EAAAsC,KAAAsJ,MAAAzL,MAAAW,EAAAC,EAAAiB,EAAAC,IAOA9B,KAAAsB,SAAAA,GAAA,GAGAzB,EAAAyC,cAAA8I,SAAA,SAAAvK,GACA,MAAA,IAAAhB,GAAAyC,cACAzB,EAAAF,EACAE,EAAAD,EACAC,EAAAgB,MACAhB,EAAAiB,SAIAjC,EAAAyC,cAAA2C,UAAApF,EAAAyF,OAAAsG,OAAAC,OAAAhM,EAAAsC,KAAA8C,YAMAjE,MAAA,WACA,MAAA,IAAAnB,GAAAyC,cAAAtC,KAAAW,EAAAX,KAAAY,EAAAZ,KAAA6B,MAAA7B,KAAA8B,OAAA9B,KAAAsB,WASAyK,OAAA,SAAAC,GACA,MAAAnM,GAAAsC,KAAA8C,UAAA8G,OAAAN,MAAAzL,MAAAgM,KACAhM,KAAAsB,WAAA0K,EAAA1K,UASA2K,SAAA,WACA,MAAA,IACA1K,KAAA8J,MAAA,IAAArL,KAAAW,GAAA,IAAA,IACAY,KAAA8J,MAAA,IAAArL,KAAAY,GAAA,IAAA,IACAW,KAAA8J,MAAA,IAAArL,KAAA6B,OAAA,IAAA,IACAN,KAAA8J,MAAA,IAAArL,KAAA8B,QAAA,IAAA,IACAP,KAAA8J,MAAA,IAAArL,KAAAsB,UAAA,IACA,KAGA4K,gBAAA,WACA,GAAAC,GAAAnM,KAAAgB,OAKA,OAJAmL,GAAAtK,MAAA7B,KAAA8B,OACAqK,EAAArK,OAAA9B,KAAA6B,MACAsK,EAAAxL,IAAAX,KAAA6B,MAAA7B,KAAA8B,QAAA,EACAqK,EAAAvL,IAAAZ,KAAA8B,OAAA9B,KAAA6B,OAAA,EACAsK,GAOA9I,kBAAA,WACA,MAAArD,MAAAsB,UAAA,IAAAC,KAAAC,KAQAJ,mBAAA,SAAAuD,GACA,GAAAyH,GAAAzH,EAAAjB,MAAA1D,KAAAuD,YACA,OAAAhC,MAAAiD,MAAA4H,EAAAzL,EAAAyL,EAAAxL,IAQAyK,MAAA,WACA,MAAA,IAAAxL,GAAAyC,cACAf,KAAA8J,MAAArL,KAAAW,GACAY,KAAA8J,MAAArL,KAAAY,GACAW,KAAA8J,MAAArL,KAAA6B,OACAN,KAAA8J,MAAArL,KAAA8B,QACA9B,KAAAsB,WASAuJ,UAAA,WACA,GAAAwB,GAAArM,KAAAgB,OAUA,OATAqL,GAAAxK,MAAA,IACAwK,EAAA1L,GAAA0L,EAAAxK,MACAwK,EAAAxK,WAEAwK,EAAAvK,OAAA,IACAuK,EAAAzL,GAAAyL,EAAAvK,OACAuK,EAAAvK,YAEAuK,EAAA/K,UAAAC,KAAAC,GACA6K,GAQAnK,OAAA,SAAAoK,GAWA,IAAA,GAVAzL,GAAAb,KAAA6K,YACA3D,GACArG,EAAA0L,aACA1L,EAAA2L,cACA3L,EAAA4L,iBACA5L,EAAA6L,iBAEAtJ,EAAAvC,EAAA0C,YACAjC,EAAAT,EAAAwC,oBACAsJ,EAAAL,EAAAG,iBACAtF,EAAA,EAAAA,EAAA,EAAAA,IAEA,GADAD,EAAAC,GAAAD,EAAAC,GAAA7D,OAAAhC,EAAA8B,GACA8D,EAAAC,GAAAxG,EAAA2L,EAAA3L,GAAAuG,EAAAC,GAAAxG,EAAAgM,EAAAhM,GACAuG,EAAAC,GAAAvG,EAAA0L,EAAA1L,GAAAsG,EAAAC,GAAAvG,EAAA+L,EAAA/L,EACA,OAAA,CAGA,QAAA,GAQAgM,eAAA,WACA,GAAAC,EAUA,OATA7M,MAAAsB,SAAAC,KAAAC,OACAqL,EAAA7M,KAAAkM,kBACAW,EAAAvL,UAAAC,KAAAC,GAAA,GACAxB,KAAAsB,SAAAC,KAAAC,GAAA,GACAqL,EAAA7M,KAAAkM,kBACAW,EAAAvL,UAAAC,KAAAC,GAAA,GAEAqL,EAAA7M,KAAAgB,QAEA6L,MAIAvB","file":"openseadragonselection.js","sourcesContent":["(function($) {\r\n 'use strict';\r\n\r\n if (!$.version || $.version.major < 2) {\r\n throw new Error('This version of OpenSeadragonSelection requires OpenSeadragon version 2.0.0+');\r\n }\r\n\r\n $.Viewer.prototype.selection = function(options) {\r\n if (!this.selectionInstance || options) {\r\n options = options || {};\r\n options.viewer = this;\r\n this.selectionInstance = new $.Selection(options);\r\n }\r\n return this.selectionInstance;\r\n };\r\n\r\n\r\n /**\r\n * @class Selection\r\n * @classdesc Provides functionality for selecting part of an image\r\n * @memberof OpenSeadragon\r\n * @param {Object} options\r\n */\r\n $.Selection = function ( options ) {\r\n\r\n $.extend( true, this, {\r\n // internal state properties\r\n viewer: null,\r\n isSelecting: false,\r\n buttonActiveImg: false,\r\n rectDone: true,\r\n\r\n // options\r\n element: null,\r\n toggleButton: null,\r\n showSelectionControl: true,\r\n showConfirmDenyButtons: true,\r\n styleConfirmDenyButtons: true,\r\n returnPixelCoordinates: true,\r\n keyboardShortcut: 'c',\r\n rect: null,\r\n allowRotation: true,\r\n startRotated: false, // useful for rotated crops\r\n startRotatedHeight: 0.1,\r\n restrictToImage: false,\r\n onSelection: null,\r\n prefixUrl: null,\r\n navImages: {\r\n selection: {\r\n REST: 'selection_rest.png',\r\n GROUP: 'selection_grouphover.png',\r\n HOVER: 'selection_hover.png',\r\n DOWN: 'selection_pressed.png'\r\n },\r\n selectionConfirm: {\r\n REST: 'selection_confirm_rest.png',\r\n GROUP: 'selection_confirm_grouphover.png',\r\n HOVER: 'selection_confirm_hover.png',\r\n DOWN: 'selection_confirm_pressed.png'\r\n },\r\n selectionCancel: {\r\n REST: 'selection_cancel_rest.png',\r\n GROUP: 'selection_cancel_grouphover.png',\r\n HOVER: 'selection_cancel_hover.png',\r\n DOWN: 'selection_cancel_pressed.png'\r\n },\r\n },\r\n handleStyle: {\r\n top: '50%',\r\n left: '50%',\r\n width: '6px',\r\n height: '6px',\r\n margin: '-4px 0 0 -4px',\r\n background: '#000',\r\n border: '1px solid #ccc'\r\n },\r\n cornersStyle: {\r\n width: '6px',\r\n height: '6px',\r\n background: '#000',\r\n border: '1px solid #ccc'\r\n }\r\n\r\n }, options );\r\n\r\n $.extend( true, this.navImages, this.viewer.navImages );\r\n\r\n if (!this.element) {\r\n this.element = $.makeNeutralElement('div');\r\n this.element.style.background = 'rgba(0, 0, 0, 0.1)';\r\n this.element.className = 'selection-box';\r\n }\r\n this.borders = this.borders || [];\r\n var handle;\r\n var corners = [];\r\n for (var i = 0; i < 4; i++) {\r\n if (!this.borders[i]) {\r\n this.borders[i] = $.makeNeutralElement('div');\r\n this.borders[i].className = 'border-' + i;\r\n this.borders[i].style.position = 'absolute';\r\n this.borders[i].style.width = '1px';\r\n this.borders[i].style.height = '1px';\r\n this.borders[i].style.background = '#fff';\r\n }\r\n\r\n handle = $.makeNeutralElement('div');\r\n handle.className = 'border-' + i + '-handle';\r\n handle.style.position = 'absolute';\r\n handle.style.top = this.handleStyle.top;\r\n handle.style.left = this.handleStyle.left;\r\n handle.style.width = this.handleStyle.width;\r\n handle.style.height = this.handleStyle.height;\r\n handle.style.margin = this.handleStyle.margin;\r\n handle.style.background = this.handleStyle.background;\r\n handle.style.border = this.handleStyle.border;\r\n new $.MouseTracker({\r\n element: this.borders[i],\r\n dragHandler: onBorderDrag.bind(this, i),\r\n dragEndHandler: onBorderDragEnd.bind(this, i),\r\n });\r\n\r\n corners[i] = $.makeNeutralElement('div');\r\n corners[i].className = 'corner-' + i + '-handle';\r\n corners[i].style.position = 'absolute';\r\n corners[i].style.width = this.cornersStyle.width;\r\n corners[i].style.height = this.cornersStyle.height;\r\n corners[i].style.background = this.cornersStyle.background;\r\n corners[i].style.border = this.cornersStyle.border;\r\n new $.MouseTracker({\r\n element: corners[i],\r\n dragHandler: onBorderDrag.bind(this, i + 0.5),\r\n dragEndHandler: onBorderDragEnd.bind(this, i),\r\n });\r\n\r\n this.borders[i].appendChild(handle);\r\n this.element.appendChild(this.borders[i]);\r\n // defer corners, so they are appended last\r\n setTimeout(this.element.appendChild.bind(this.element, corners[i]), 0);\r\n }\r\n this.borders[0].style.top = 0;\r\n this.borders[0].style.width = '100%';\r\n this.borders[1].style.right = 0;\r\n this.borders[1].style.height = '100%';\r\n this.borders[2].style.bottom = 0;\r\n this.borders[2].style.width = '100%';\r\n this.borders[3].style.left = 0;\r\n this.borders[3].style.height = '100%';\r\n corners[0].style.top = '-3px';\r\n corners[0].style.left = '-3px';\r\n corners[1].style.top = '-3px';\r\n corners[1].style.right = '-3px';\r\n corners[2].style.bottom = '-3px';\r\n corners[2].style.right = '-3px';\r\n corners[3].style.bottom = '-3px';\r\n corners[3].style.left = '-3px';\r\n\r\n if (!this.overlay) {\r\n this.overlay = new $.SelectionOverlay(this.element, this.rect || new $.SelectionRect());\r\n }\r\n\r\n this.innerTracker = new $.MouseTracker({\r\n element: this.element,\r\n clickTimeThreshold: this.viewer.clickTimeThreshold,\r\n clickDistThreshold: this.viewer.clickDistThreshold,\r\n dragHandler: $.delegate( this, onInsideDrag ),\r\n dragEndHandler: $.delegate( this, onInsideDragEnd ),\r\n // keyHandler: $.delegate( this, onKeyPress ),\r\n clickHandler: $.delegate( this, onClick ),\r\n // scrollHandler: $.delegate( this.viewer, this.viewer.innerTracker.scrollHandler ),\r\n // pinchHandler: $.delegate( this.viewer, this.viewer.innerTracker.pinchHandler ),\r\n });\r\n\r\n this.outerTracker = new $.MouseTracker({\r\n element: this.viewer.canvas,\r\n clickTimeThreshold: this.viewer.clickTimeThreshold,\r\n clickDistThreshold: this.viewer.clickDistThreshold,\r\n dragHandler: $.delegate( this, onOutsideDrag ),\r\n dragEndHandler: $.delegate( this, onOutsideDragEnd ),\r\n clickHandler: $.delegate( this, onClick ),\r\n startDisabled: !this.isSelecting,\r\n });\r\n\r\n if (this.keyboardShortcut) {\r\n $.addEvent(\r\n this.viewer.container,\r\n 'keypress',\r\n $.delegate(this, onKeyPress),\r\n false\r\n );\r\n }\r\n\r\n var prefix = this.prefixUrl || this.viewer.prefixUrl || '';\r\n var useGroup = this.viewer.buttons && this.viewer.buttons.buttons;\r\n var anyButton = useGroup ? this.viewer.buttons.buttons[0] : null;\r\n var onFocusHandler = anyButton ? anyButton.onFocus : null;\r\n var onBlurHandler = anyButton ? anyButton.onBlur : null;\r\n if (this.showSelectionControl) {\r\n this.toggleButton = new $.Button({\r\n element: this.toggleButton ? $.getElement( this.toggleButton ) : null,\r\n clickTimeThreshold: this.viewer.clickTimeThreshold,\r\n clickDistThreshold: this.viewer.clickDistThreshold,\r\n tooltip: $.getString('Tooltips.SelectionToggle') || 'Toggle selection',\r\n srcRest: prefix + this.navImages.selection.REST,\r\n srcGroup: prefix + this.navImages.selection.GROUP,\r\n srcHover: prefix + this.navImages.selection.HOVER,\r\n srcDown: prefix + this.navImages.selection.DOWN,\r\n onRelease: this.toggleState.bind( this ),\r\n onFocus: onFocusHandler,\r\n onBlur: onBlurHandler\r\n });\r\n if (useGroup) {\r\n this.viewer.buttons.buttons.push(this.toggleButton);\r\n this.viewer.buttons.element.appendChild(this.toggleButton.element);\r\n }\r\n if (this.toggleButton.imgDown) {\r\n this.buttonActiveImg = this.toggleButton.imgDown.cloneNode(true);\r\n this.toggleButton.element.appendChild(this.buttonActiveImg);\r\n }\r\n }\r\n if (this.showConfirmDenyButtons) {\r\n this.confirmButton = new $.Button({\r\n element: this.confirmButton ? $.getElement( this.confirmButton ) : null,\r\n clickTimeThreshold: this.viewer.clickTimeThreshold,\r\n clickDistThreshold: this.viewer.clickDistThreshold,\r\n tooltip: $.getString('Tooltips.SelectionConfirm') || 'Confirm selection',\r\n srcRest: prefix + this.navImages.selectionConfirm.REST,\r\n srcGroup: prefix + this.navImages.selectionConfirm.GROUP,\r\n srcHover: prefix + this.navImages.selectionConfirm.HOVER,\r\n srcDown: prefix + this.navImages.selectionConfirm.DOWN,\r\n onRelease: this.confirm.bind( this ),\r\n onFocus: onFocusHandler,\r\n onBlur: onBlurHandler\r\n });\r\n var confirm = this.confirmButton.element;\r\n confirm.classList.add('confirm-button');\r\n this.element.appendChild(confirm);\r\n\r\n this.cancelButton = new $.Button({\r\n element: this.cancelButton ? $.getElement( this.cancelButton ) : null,\r\n clickTimeThreshold: this.viewer.clickTimeThreshold,\r\n clickDistThreshold: this.viewer.clickDistThreshold,\r\n tooltip: $.getString('Tooltips.SelectionConfirm') || 'Cancel selection',\r\n srcRest: prefix + this.navImages.selectionCancel.REST,\r\n srcGroup: prefix + this.navImages.selectionCancel.GROUP,\r\n srcHover: prefix + this.navImages.selectionCancel.HOVER,\r\n srcDown: prefix + this.navImages.selectionCancel.DOWN,\r\n onRelease: this.cancel.bind( this ),\r\n onFocus: onFocusHandler,\r\n onBlur: onBlurHandler\r\n });\r\n var cancel = this.cancelButton.element;\r\n cancel.classList.add('cancel-button');\r\n this.element.appendChild(cancel);\r\n\r\n if (this.styleConfirmDenyButtons) {\r\n confirm.style.position = 'absolute';\r\n confirm.style.top = '50%';\r\n confirm.style.left = '50%';\r\n confirm.style.transform = 'translate(-100%, -50%)';\r\n\r\n cancel.style.position = 'absolute';\r\n cancel.style.top = '50%';\r\n cancel.style.left = '50%';\r\n cancel.style.transform = 'translate(0, -50%)';\r\n }\r\n }\r\n\r\n this.viewer.addHandler('selection', this.onSelection);\r\n\r\n this.viewer.addHandler('open', this.draw.bind(this));\r\n this.viewer.addHandler('animation', this.draw.bind(this));\r\n this.viewer.addHandler('resize', this.draw.bind(this));\r\n this.viewer.addHandler('rotate', this.draw.bind(this));\r\n };\r\n\r\n $.extend( $.Selection.prototype, $.ControlDock.prototype, /** @lends OpenSeadragon.Selection.prototype */{\r\n\r\n toggleState: function() {\r\n return this.setState(!this.isSelecting);\r\n },\r\n\r\n setState: function(enabled) {\r\n this.isSelecting = enabled;\r\n // this.viewer.innerTracker.setTracking(!enabled);\r\n this.outerTracker.setTracking(enabled);\r\n enabled ? this.draw() : this.undraw();\r\n if (this.buttonActiveImg) {\r\n this.buttonActiveImg.style.visibility = enabled ? 'visible' : 'hidden';\r\n }\r\n this.viewer.raiseEvent('selection_toggle', {enabled: enabled});\r\n return this;\r\n },\r\n\r\n setAllowRotation: function(allowRotation) {\r\n this.allowRotation = allowRotation;\r\n },\r\n\r\n enable: function() {\r\n return this.setState(true);\r\n },\r\n\r\n disable: function() {\r\n return this.setState(false);\r\n },\r\n\r\n draw: function() {\r\n if (this.rect) {\r\n this.overlay.update(this.rect.normalize());\r\n this.overlay.drawHTML(this.viewer.drawer.container, this.viewer.viewport);\r\n }\r\n return this;\r\n },\r\n\r\n undraw: function() {\r\n this.overlay.destroy();\r\n this.rect = null;\r\n return this;\r\n },\r\n\r\n confirm: function() {\r\n if (this.rect) {\r\n var result = this.rect.normalize();\r\n if (this.returnPixelCoordinates) {\r\n var real = this.viewer.viewport.viewportToImageRectangle(result);\r\n real = $.SelectionRect.fromRect(real).round();\r\n real.rotation = result.rotation;\r\n result = real;\r\n }\r\n this.viewer.raiseEvent('selection', result);\r\n this.undraw();\r\n }\r\n return this;\r\n },\r\n\r\n cancel: function() {\r\n /*\r\n * These two lines have been added to fix a issue with mobile where the selection is just a pinpoint after the first drag\r\n * For some reason disabling then re-enabling the tracking fixes this issue.\r\n */\r\n this.outerTracker.setTracking(false);\r\n this.outerTracker.setTracking(true);\r\n this.viewer.raiseEvent('selection_cancel', false);\r\n return this.undraw();\r\n },\r\n });\r\n\r\n function onOutsideDrag(e) {\r\n // Disable move when makeing new selection\r\n this.viewer.setMouseNavEnabled(false);\r\n var delta = this.viewer.viewport.deltaPointsFromPixels(e.delta, true);\r\n var end = this.viewer.viewport.pointFromPixel(e.position, true);\r\n var start = new $.Point(end.x - delta.x, end.y - delta.y);\r\n if (!this.rect) {\r\n if (this.restrictToImage) {\r\n if (!pointIsInImage(this, start)) {\r\n return;\r\n }\r\n restrictVector(delta, end);\r\n }\r\n if (this.startRotated) {\r\n this.rotatedStartPoint = start;\r\n this.rect = getPrerotatedRect(start, end, this.startRotatedHeight);\r\n } else {\r\n this.rect = new $.SelectionRect(start.x, start.y, delta.x, delta.y);\r\n }\r\n this.rectDone = false;\r\n } else {\r\n var oldRect;\r\n if (this.restrictToImage) {\r\n oldRect = this.rect.clone();\r\n }\r\n if (this.rectDone) {\r\n // All rotation as needed.\r\n if (this.allowRotation) {\r\n var angle1 = this.rect.getAngleFromCenter(start);\r\n var angle2 = this.rect.getAngleFromCenter(end);\r\n this.rect.rotation = (this.rect.rotation + angle1 - angle2) % Math.PI;\r\n }\r\n } else {\r\n if (this.startRotated) {\r\n this.rect = getPrerotatedRect(this.rotatedStartPoint, end, this.startRotatedHeight);\r\n } else {\r\n this.rect.width += delta.x;\r\n this.rect.height += delta.y;\r\n }\r\n }\r\n var bounds = this.viewer.world.getHomeBounds();\r\n if (this.restrictToImage && !this.rect.fitsIn(new $.Rect(0, 0, bounds.width, bounds.height))) {\r\n this.rect = oldRect;\r\n }\r\n }\r\n this.draw();\r\n }\r\n\r\n function onOutsideDragEnd() {\r\n // Resizing a selection will function\r\n // when drawn any direction\r\n if (this.rect.width < 0){\r\n this.rect.x += this.rect.width;\r\n this.rect.width = Math.abs(this.rect.width);\r\n }\r\n if (this.rect.height < 0){\r\n this.rect.y += this.rect.height;\r\n this.rect.height = Math.abs(this.rect.height);\r\n }\r\n \r\n // Eable move after new selection is done\r\n this.viewer.setMouseNavEnabled(true);\r\n this.rectDone = true;\r\n }\r\n\r\n function onClick() {\r\n this.viewer.canvas.focus();\r\n }\r\n\r\n function onInsideDrag(e) {\r\n $.addClass(this.element, 'dragging');\r\n var delta = this.viewer.viewport.deltaPointsFromPixels(e.delta, true);\r\n this.rect.x += delta.x;\r\n this.rect.y += delta.y;\r\n var bounds = this.viewer.world.getHomeBounds();\r\n if (this.restrictToImage && !this.rect.fitsIn(new $.Rect(0, 0, bounds.width, bounds.height))) {\r\n this.rect.x -= delta.x;\r\n this.rect.y -= delta.y;\r\n }\r\n this.draw();\r\n }\r\n\r\n function onInsideDragEnd() {\r\n $.removeClass(this.element, 'dragging');\r\n }\r\n\r\n function onBorderDrag(border, e) {\r\n var delta = e.delta;\r\n var rotation = this.rect.getDegreeRotation();\r\n var center;\r\n var oldRect = this.restrictToImage ? this.rect.clone() : null;\r\n if (rotation !== 0) {\r\n // adjust vector\r\n delta = delta.rotate(-1 * rotation, new $.Point(0, 0));\r\n center = this.rect.getCenter();\r\n }\r\n delta = this.viewer.viewport.deltaPointsFromPixels(delta, true);\r\n switch (border) {\r\n case 0:\r\n this.rect.y += delta.y;\r\n this.rect.height -= delta.y;\r\n break;\r\n case 1:\r\n this.rect.width += delta.x;\r\n break;\r\n case 2:\r\n this.rect.height += delta.y;\r\n break;\r\n case 3:\r\n this.rect.x += delta.x;\r\n this.rect.width -= delta.x;\r\n break;\r\n case 0.5:\r\n this.rect.y += delta.y;\r\n this.rect.height -= delta.y;\r\n this.rect.x += delta.x;\r\n this.rect.width -= delta.x;\r\n break;\r\n case 1.5:\r\n this.rect.y += delta.y;\r\n this.rect.height -= delta.y;\r\n this.rect.width += delta.x;\r\n break;\r\n case 2.5:\r\n this.rect.width += delta.x;\r\n this.rect.height += delta.y;\r\n break;\r\n case 3.5:\r\n this.rect.height += delta.y;\r\n this.rect.x += delta.x;\r\n this.rect.width -= delta.x;\r\n break;\r\n }\r\n if (rotation !== 0) {\r\n // calc center deviation\r\n var newCenter = this.rect.getCenter();\r\n // rotate new center around old\r\n var target = newCenter.rotate(rotation, center);\r\n // adjust new center\r\n delta = target.minus(newCenter);\r\n this.rect.x += delta.x;\r\n this.rect.y += delta.y;\r\n }\r\n var bounds = this.viewer.world.getHomeBounds();\r\n if (this.restrictToImage && !this.rect.fitsIn(new $.Rect(0, 0, bounds.width, bounds.height))) {\r\n this.rect = oldRect;\r\n }\r\n this.draw();\r\n }\r\n \r\n // After you have completed dragging, ensure the top left of the selection\r\n // box is still the top left corner of the box\r\n function onBorderDragEnd(){\r\n if (this.rect.width < 0){\r\n this.rect.x += this.rect.width;\r\n this.rect.width = Math.abs(this.rect.width);\r\n }\r\n if (this.rect.height < 0){\r\n this.rect.y += this.rect.height;\r\n this.rect.height = Math.abs(this.rect.height);\r\n }\r\n }\r\n\r\n function onKeyPress(e) {\r\n var key = e.keyCode ? e.keyCode : e.charCode;\r\n if (key === 13) {\r\n this.confirm();\r\n } else if (String.fromCharCode(key) === this.keyboardShortcut) {\r\n this.toggleState();\r\n }\r\n }\r\n\r\n function getPrerotatedRect(start, end, height) {\r\n if (start.x > end.x) {\r\n // always draw left to right\r\n var x = start;\r\n start = end;\r\n end = x;\r\n }\r\n var delta = end.minus(start);\r\n var dist = start.distanceTo(end);\r\n var angle = -1 * Math.atan2(delta.x, delta.y) + (Math.PI / 2);\r\n var center = new $.Point(\r\n delta.x / 2 + start.x,\r\n delta.y / 2 + start.y\r\n );\r\n var rect = new $.SelectionRect(\r\n center.x - (dist / 2),\r\n center.y - (height / 2),\r\n dist,\r\n height,\r\n angle\r\n );\r\n var heightModDelta = new $.Point(0, height);\r\n heightModDelta = heightModDelta.rotate(rect.getDegreeRotation(), new $.Point(0, 0));\r\n rect.x += heightModDelta.x / 2;\r\n rect.y += heightModDelta.y / 2;\r\n return rect;\r\n }\r\n\r\n function pointIsInImage(self, point) {\r\n var bounds = self.viewer.world.getHomeBounds();\r\n return point.x >= 0 && point.x <= bounds.width && point.y >= 0 && point.y <= bounds.height;\r\n }\r\n\r\n function restrictVector(delta, end) {\r\n var start;\r\n for (var prop in {x: 0, y: 0}) {\r\n start = end[prop] - delta[prop];\r\n if (start < 1 && start > 0) {\r\n if (end[prop] > 1) {\r\n delta[prop] -= end[prop] - 1;\r\n end[prop] = 1;\r\n } else if (end[prop] < 0) {\r\n delta[prop] -= end[prop];\r\n end[prop] = 0;\r\n }\r\n }\r\n }\r\n }\r\n\r\n})(OpenSeadragon);\r\n","(function( $ ){\r\n 'use strict';\r\n\r\n /**\r\n * @class Overlay\r\n * @classdesc Provides a way to float an HTML element on top of the viewer element.\r\n *\r\n * @memberof OpenSeadragon\r\n * @param {Object} options\r\n * @param {Element} options.element\r\n * @param {OpenSeadragon.Point|OpenSeadragon.Rect|OpenSeadragon.SelectionRect} options.location - The\r\n * location of the overlay on the image. If a {@link OpenSeadragon.Point}\r\n * is specified, the overlay will keep a constant size independently of the\r\n * zoom. If a {@link OpenSeadragon.Rect} is specified, the overlay size will\r\n * be adjusted when the zoom changes.\r\n * @param {OpenSeadragon.OverlayPlacement} [options.placement=OpenSeadragon.OverlayPlacement.TOP_LEFT]\r\n * Relative position to the viewport.\r\n * Only used if location is a {@link OpenSeadragon.Point}.\r\n * @param {OpenSeadragon.Overlay.OnDrawCallback} [options.onDraw]\r\n * @param {Boolean} [options.checkResize=true] Set to false to avoid to\r\n * check the size of the overlay everytime it is drawn when using a\r\n * {@link OpenSeadragon.Point} as options.location. It will improve\r\n * performances but will cause a misalignment if the overlay size changes.\r\n */\r\n $.SelectionOverlay = function( element, location) {\r\n $.Overlay.apply( this, arguments );\r\n\r\n // set the rotation in radians\r\n if ( $.isPlainObject( element ) ) {\r\n this.rotation = element.location.rotation || 0;\r\n } else {\r\n this.rotation = location.rotation || 0;\r\n }\r\n };\r\n\r\n $.SelectionOverlay.prototype = $.extend( Object.create($.Overlay.prototype), {\r\n\r\n /**\r\n * @function\r\n * @param {Element} container\r\n */\r\n drawHTML: function() {\r\n $.Overlay.prototype.drawHTML.apply( this, arguments );\r\n this.style.transform = this.style.transform.replace(/ ?rotate\\(.+rad\\)/, '') +\r\n ' rotate(' + this.rotation + 'rad)';\r\n },\r\n\r\n /**\r\n * @function\r\n * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location\r\n * @param {OpenSeadragon.OverlayPlacement} position\r\n */\r\n update: function( location ) {\r\n $.Overlay.prototype.update.apply( this, arguments );\r\n this.rotation = location.rotation || 0;\r\n }\r\n });\r\n\r\n}( OpenSeadragon ));\r\n","(function( $ ){\r\n 'use strict';\r\n\r\n /**\r\n * @class SelectionRect\r\n * @classdesc A display rectangle is very similar to {@link OpenSeadragon.Rect} but adds rotation\r\n * around the center point\r\n *\r\n * @memberof OpenSeadragon\r\n * @extends OpenSeadragon.Rect\r\n * @param {Number} x The vector component 'x'.\r\n * @param {Number} y The vector component 'y'.\r\n * @param {Number} width The vector component 'height'.\r\n * @param {Number} height The vector component 'width'.\r\n * @param {Number} rotation The rotation in radians\r\n */\r\n $.SelectionRect = function( x, y, width, height, rotation ) {\r\n $.Rect.apply( this, [ x, y, width, height ] );\r\n\r\n /**\r\n * The rotation in radians\r\n * @member {Number} rotation\r\n * @memberof OpenSeadragon.SelectionRect#\r\n */\r\n this.rotation = rotation || 0;\r\n };\r\n\r\n $.SelectionRect.fromRect = function(rect) {\r\n return new $.SelectionRect(\r\n rect.x,\r\n rect.y,\r\n rect.width,\r\n rect.height\r\n );\r\n };\r\n\r\n $.SelectionRect.prototype = $.extend( Object.create($.Rect.prototype), {\r\n\r\n /**\r\n * @function\r\n * @returns {OpenSeadragon.Rect} a duplicate of this Rect\r\n */\r\n clone: function() {\r\n return new $.SelectionRect(this.x, this.y, this.width, this.height, this.rotation);\r\n },\r\n\r\n /**\r\n * Determines if two Rectangles have equivalent components.\r\n * @function\r\n * @param {OpenSeadragon.Rect} rectangle The Rectangle to compare to.\r\n * @return {Boolean} 'true' if all components are equal, otherwise 'false'.\r\n */\r\n equals: function( other ) {\r\n return $.Rect.prototype.equals.apply(this, [ other ]) &&\r\n ( this.rotation === other.rotation );\r\n },\r\n\r\n /**\r\n * Provides a string representation of the rectangle which is useful for\r\n * debugging.\r\n * @function\r\n * @returns {String} A string representation of the rectangle.\r\n */\r\n toString: function() {\r\n return '[' +\r\n (Math.round(this.x*100) / 100) + ',' +\r\n (Math.round(this.y*100) / 100) + ',' +\r\n (Math.round(this.width*100) / 100) + 'x' +\r\n (Math.round(this.height*100) / 100) + '@' +\r\n (Math.round(this.rotation*100) / 100) +\r\n ']';\r\n },\r\n\r\n swapWidthHeight: function() {\r\n var swapped = this.clone();\r\n swapped.width = this.height;\r\n swapped.height = this.width;\r\n swapped.x += (this.width - this.height) / 2;\r\n swapped.y += (this.height - this.width) / 2;\r\n return swapped;\r\n },\r\n\r\n /**\r\n * @function\r\n * @returns {Number} The rotaion in degrees\r\n */\r\n getDegreeRotation: function() {\r\n return this.rotation * (180/Math.PI);\r\n },\r\n\r\n /**\r\n * @function\r\n * @param {OpenSeadragon.Point} point\r\n * @returns {Number} The angle in radians\r\n */\r\n getAngleFromCenter: function(point) {\r\n var diff = point.minus(this.getCenter());\r\n return Math.atan2(diff.x, diff.y);\r\n },\r\n\r\n /**\r\n * Rounds pixel coordinates\r\n * @function\r\n * @returns {SelectionRect} The altered rect\r\n */\r\n round: function() {\r\n return new $.SelectionRect(\r\n Math.round(this.x),\r\n Math.round(this.y),\r\n Math.round(this.width),\r\n Math.round(this.height),\r\n this.rotation\r\n );\r\n },\r\n\r\n /**\r\n * Fixes negative width/height, rotation larger than PI\r\n * @function\r\n * @returns {SelectionRect} The normalized rect\r\n */\r\n normalize: function() {\r\n var fixed = this.clone();\r\n if (fixed.width < 0) {\r\n fixed.x += fixed.width;\r\n fixed.width *= -1;\r\n }\r\n if (fixed.height < 0) {\r\n fixed.y += fixed.height;\r\n fixed.height *= -1;\r\n }\r\n fixed.rotation %= Math.PI;\r\n return fixed;\r\n },\r\n\r\n /**\r\n * @function\r\n * @param {OpenSeadragon.Rect} area\r\n * @returns {Boolean} Does this rect fit in a specified area\r\n */\r\n fitsIn: function(area) {\r\n var rect = this.normalize();\r\n var corners = [\r\n rect.getTopLeft(),\r\n rect.getTopRight(),\r\n rect.getBottomRight(),\r\n rect.getBottomLeft(),\r\n ];\r\n var center = rect.getCenter();\r\n var rotation = rect.getDegreeRotation();\r\n var areaEnd = area.getBottomRight();\r\n for (var i = 0; i < 4; i++) {\r\n corners[i] = corners[i].rotate(rotation, center);\r\n if (corners[i].x < area.x || corners[i].x > areaEnd.x ||\r\n corners[i].y < area.y || corners[i].y > areaEnd.y) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n },\r\n\r\n /**\r\n * Reduces rotation to within [-45, 45] degrees by swapping width & height\r\n * @function\r\n * @returns {SelectionRect} The altered rect\r\n */\r\n reduceRotation: function() {\r\n var reduced;\r\n if (this.rotation < Math.PI / (-4)) {\r\n reduced = this.swapWidthHeight();\r\n reduced.rotation += Math.PI / 2;\r\n } else if (this.rotation > Math.PI / 4) {\r\n reduced = this.swapWidthHeight();\r\n reduced.rotation -= Math.PI / 2;\r\n } else {\r\n reduced = this.clone();\r\n }\r\n return reduced;\r\n },\r\n });\r\n\r\n}( OpenSeadragon ));\r\n"]}