{"version":3,"sources":["../js/GreenlightCanvasZoom.js"],"names":["CanvasZoom","oCanvas","this","g_oCanvas","g_iZoomMultiplier","getZoomMultiplierForZoomIncrement","g_oSettings","g_oUserSettings","ZoomIncrements","c_iMinimumZoomLevel","c_iMaximumZoomLevel","c_iMinSliderPos","c_iMaxSliderPos","c_iMinSliderZoomVal","Math","log","c_iMaxSliderZoomVal","c_iExpoAdjustmentScale","displayMaximumZoomInWarning","displayMinimumZoomOutWarning","g_bLogZoom","prototype","zoomIn","canZoomIn","g_iTempZoomLevel","g_iZoomLevel","g_iZoomDiff","g_iAnimateFrames","g_iTempDragOffset_x","g_iDragOffset_x","g_iTempDragOffset_y","g_iDragOffset_y","g_iDragXDiff","g_iDragYDiff","startZoomAnimate","zoomOut","canZoomOut","$","find","contents","text","indexOf","c_szMaximumZoomLevelReached","g_oGreenlightMessages","displayWarningBubble","c_szMinimumZoomLevelReached","canZoomAnimate","abs","zoomReset","clearRealtimeRenderImage","fadeOut","zoomSlide","sliderPercentage","getZoomLevelFromSliderPercentage","iZoomLevel","updateZoomSlider","val","getSliderPercentageFromZoomLevel","round","html","exp","zoomLevel","marqueeZoom","oSyncCanvas","_this","g_oAnnotationCanvas","g_szCanvasId","css","g_oAnnotations","g_szPrevCursorStyle","changeCanvasFunction","event","g_oMarquee","initiateMarqueeDraw","eAnnotationTypes","Rectangle","marqueZoomPointerUp","oArtworkViewer","iBeginPoint_x","iBeginPoint_y","iEndPoint_x","iEndPoint_y","isMarqueeWithinArtwork","g_oCanvasZoom","centrePoint_x","centerPoint_y","width","height","marqueePixelsX","g_iOrigin_x","g_iX","zoomLevelWidth","g_oViewer","g_oArtworkViewer","marqueePixelsY","g_iOrigin_y","g_iY","zoomLevelHeight","min","iZoomAmount","i","length","synchroniseZoomPanProperties","redraw","zoomAnimate","iCurrentAnimationFrame","console","g_bIsAnimating","clearImgData","g_iCurrentZoomFrame","requestAnimationFrame","bind","addFloats","subtractFloats","endZoomAnimate","g_bMainCanvas","scrollZoom","scrollType","eWheelZoomType","Static","g_bIsDragging","Centered","Smart","initiateMarqueeWheelZoom","scrollZoomInCallback","scrollZoomOut","initiateMarqueeWheelZoomOut","scrollZoomOutCenteredCallback","scrollZoomOutCallback","g_iCompareImage_x","g_iCompareImage_y","window"],"mappings":"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","file":"GreenlightCanvasZoom-e0333e1546.js","sourcesContent":["/*\r\n* Copyright (c) 2024 SGS Europe. All rights reserved.\r\n*\r\n* This program is the CONFIDENTIAL and PROPRIETARY property of SGS Europe.\r\n* Any unauthorised use, reproduction, or transfer of this program is strictly\r\n* prohibited.\r\n*\r\n* File Name: GreenlightCanvasZoom.js\r\n*\r\n* Description: Contains the code for the Canvas Zoom Functionality.\r\n*\r\n*/\r\n\r\n(function () {\r\n\r\n\t\"use strict\";\r\n\r\n\t/**\r\n\t * Canvas Zoom Object.\r\n\t * @param {object} oCanvas - The canvas to perform zooms on.\r\n\t */\r\n\tfunction CanvasZoom(oCanvas) {\r\n\r\n\t\t// The canvas object to perform zooms on.\r\n\t\tthis.g_oCanvas = oCanvas;\r\n\r\n\t\t// The multipler to zoom in and out by.\r\n\t\tthis.g_iZoomMultiplier = getZoomMultiplierForZoomIncrement(g_oSettings.g_oUserSettings.ZoomIncrements);\r\n\r\n\t\t// The minimum and maximum zoom level.\r\n\t\tthis.c_iMinimumZoomLevel = 1;\r\n\t\tthis.c_iMaximumZoomLevel = 100;\r\n\r\n\t\t// Scale settings for zoom slider.\r\n\t\tthis.c_iMinSliderPos = 0;\r\n\t\tthis.c_iMaxSliderPos = 100;\r\n\t\tthis.c_iMinSliderZoomVal = Math.log(100);\r\n\t\tthis.c_iMaxSliderZoomVal = Math.log(10000);\r\n\t\tthis.c_iExpoAdjustmentScale = (this.c_iMaxSliderZoomVal - this.c_iMinSliderZoomVal) / (this.c_iMaxSliderPos - this.c_iMinSliderPos);\r\n\r\n\t\t// Enable zoom warnings.\r\n\t\tthis.displayMaximumZoomInWarning = true;\r\n\t\tthis.displayMinimumZoomOutWarning = false;\r\n\r\n\t\t// If we should log any zoom steps.\r\n\t\tthis.g_bLogZoom = false;\r\n\t};\r\n\r\n\t/**\r\n\t * Performs a zoom.\r\n\t */\r\n\tCanvasZoom.prototype.zoomIn = function () {\r\n\t\t\r\n\t\t// Check the maximum zoom level has not been reached.\r\n\t\tif (!this.canZoomIn()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Get the zoom level.\r\n\t\tthis.g_oCanvas.g_iTempZoomLevel = this.g_oCanvas.g_iZoomLevel * this.g_iZoomMultiplier;\r\n\r\n\t\t// If the zoom level would be greater then the maximum, set this to the maximum.\r\n\t\tif (this.g_oCanvas.g_iTempZoomLevel > this.c_iMaximumZoomLevel) {\r\n\t\t\tthis.g_oCanvas.g_iTempZoomLevel = this.c_iMaximumZoomLevel;\r\n\t\t}\r\n\r\n\t\t// Calculate the zoom.\r\n\t\tthis.g_oCanvas.g_iZoomDiff = (this.g_oCanvas.g_iTempZoomLevel - this.g_oCanvas.g_iZoomLevel) / this.g_oCanvas.g_iAnimateFrames;\r\n\t\tthis.g_oCanvas.g_iTempDragOffset_x = this.g_oCanvas.g_iDragOffset_x * (this.g_oCanvas.g_iTempZoomLevel / this.g_oCanvas.g_iZoomLevel);\r\n\t\tthis.g_oCanvas.g_iTempDragOffset_y = this.g_oCanvas.g_iDragOffset_y * (this.g_oCanvas.g_iTempZoomLevel / this.g_oCanvas.g_iZoomLevel);\r\n\t\tthis.g_oCanvas.g_iDragXDiff = (this.g_oCanvas.g_iTempDragOffset_x - this.g_oCanvas.g_iDragOffset_x) / this.g_oCanvas.g_iAnimateFrames;\r\n\t\tthis.g_oCanvas.g_iDragYDiff = (this.g_oCanvas.g_iTempDragOffset_y - this.g_oCanvas.g_iDragOffset_y) / this.g_oCanvas.g_iAnimateFrames;\r\n\r\n\t\t// Animate the zoom.\r\n\t\tthis.startZoomAnimate();\r\n\t}\r\n\r\n\t/**\r\n\t * Performs a zoom out.\r\n\t */\r\n\tCanvasZoom.prototype.zoomOut = function () {\r\n\r\n\t\t// Check if we can zoom out.\r\n\t\tif (!this.canZoomOut()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Get the zoom level.\r\n\t\tthis.g_oCanvas.g_iTempZoomLevel = this.g_oCanvas.g_iZoomLevel / this.g_iZoomMultiplier;\r\n\r\n\t\t// If the zoom level would be less then the minimum, set this to the minimum.\r\n\t\tif (this.g_oCanvas.g_iTempZoomLevel < this.c_iMinimumZoomLevel) {\r\n\t\t\tthis.g_oCanvas.g_iTempZoomLevel = this.c_iMinimumZoomLevel;\r\n\t\t}\r\n\r\n\t\t// Calculate the zoom.\r\n\t\tthis.g_oCanvas.g_iZoomDiff = (this.g_oCanvas.g_iZoomLevel - this.g_oCanvas.g_iTempZoomLevel) / this.g_oCanvas.g_iAnimateFrames;\r\n\t\tthis.g_oCanvas.g_iTempDragOffset_x = this.g_oCanvas.g_iDragOffset_x / (this.g_oCanvas.g_iZoomLevel / this.g_oCanvas.g_iTempZoomLevel);\r\n\t\tthis.g_oCanvas.g_iTempDragOffset_y = this.g_oCanvas.g_iDragOffset_y / (this.g_oCanvas.g_iZoomLevel / this.g_oCanvas.g_iTempZoomLevel);\r\n\t\tthis.g_oCanvas.g_iDragXDiff = (this.g_oCanvas.g_iDragOffset_x - this.g_oCanvas.g_iTempDragOffset_x) / this.g_oCanvas.g_iAnimateFrames;\r\n\t\tthis.g_oCanvas.g_iDragYDiff = (this.g_oCanvas.g_iDragOffset_y - this.g_oCanvas.g_iTempDragOffset_y) / this.g_oCanvas.g_iAnimateFrames;\r\n\r\n\t\t// Animate the zoom.\r\n\t\tthis.startZoomAnimate();\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if the canvas can be zoomed in.\r\n\t */\r\n\tCanvasZoom.prototype.canZoomIn = function () {\r\n\r\n\t\t// Display a zoom warning if required.\r\n\t\tif (this.displayMaximumZoomInWarning && this.g_oCanvas.g_iZoomLevel >= this.c_iMaximumZoomLevel && $(\".bubbleWarning\").find(\"span\").contents().text().indexOf(c_szMaximumZoomLevelReached) == -1) {\r\n\t\t\tg_oGreenlightMessages.displayWarningBubble(c_szMaximumZoomLevelReached);\r\n\t\t}\r\n\r\n\t\t// Determine if a zoom in can be performed.\r\n\t\treturn this.g_oCanvas.g_iZoomLevel < this.c_iMaximumZoomLevel;\r\n\t};\r\n\r\n\r\n\t/**\r\n\t * Checks if the canvas can be zoomed out.\r\n\t */\r\n\tCanvasZoom.prototype.canZoomOut = function () {\r\n\r\n\t\t// Display a zoom warning if required.\r\n\t\tif (this.displayMinimumZoomOutWarning && this.g_oCanvas.g_iZoomLevel <= this.c_iMinimumZoomLevel && $(\".bubbleWarning\").find(\"span\").contents().text().indexOf(c_szMinimumZoomLevelReached) == -1) {\r\n\t\t\tg_oGreenlightMessages.displayWarningBubble(c_szMinimumZoomLevelReached);\r\n\t\t}\r\n\r\n\t\t// Determine if a zoom out can be performed.\r\n\t\treturn this.g_oCanvas.g_iZoomLevel > this.c_iMinimumZoomLevel;\r\n\t};\r\n\r\n\t/**\r\n\t * Checks if the canvas can be zoom animated.\r\n\t */\r\n\tCanvasZoom.prototype.canZoomAnimate = function () {\r\n\t\tif ((Math.abs(this.g_oCanvas.g_iTempZoomLevel - this.g_oCanvas.g_iZoomLevel) > 0) ||\r\n\t\t\t(Math.abs(this.g_oCanvas.g_iTempDragOffset_x - this.g_oCanvas.g_iDragOffset_x) > 1) ||\r\n\t\t\t(Math.abs(this.g_oCanvas.g_iTempDragOffset_y - this.g_oCanvas.g_iDragOffset_y) > 1)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Performs a zoom reset.\r\n\t */\r\n\tCanvasZoom.prototype.zoomReset = function () {\r\n\r\n\t\t// Reset the zoom level.\r\n\t\tthis.g_oCanvas.g_iTempZoomLevel = 1;\r\n\t\tthis.g_oCanvas.g_iTempDragOffset_x = 0;\r\n\t\tthis.g_oCanvas.g_iTempDragOffset_y = 0;\r\n\r\n\t\t// Animate to the reset zoom level.\r\n\t\tthis.g_oCanvas.g_iZoomDiff = (this.g_oCanvas.g_iZoomLevel - this.g_oCanvas.g_iTempZoomLevel) / this.g_oCanvas.g_iAnimateFrames;\r\n\t\tthis.g_oCanvas.g_iDragXDiff = (this.g_oCanvas.g_iDragOffset_x - this.g_oCanvas.g_iTempDragOffset_x) / this.g_oCanvas.g_iAnimateFrames;\r\n\t\tthis.g_oCanvas.g_iDragYDiff = (this.g_oCanvas.g_iDragOffset_y - this.g_oCanvas.g_iTempDragOffset_y) / this.g_oCanvas.g_iAnimateFrames;\r\n\t\tthis.startZoomAnimate();\r\n\r\n\t\t// Clear any real-time render image and remove any image loading shine.\r\n\t\tthis.g_oCanvas.clearRealtimeRenderImage();\r\n\t\t$(\".shine\").fadeOut(200);\r\n\t}\r\n\r\n\t/**\r\n\t * Performs a zoom slide.\r\n\t * @param {int} sliderPercentage - The slider percentage.\r\n\t */\r\n\tCanvasZoom.prototype.zoomSlide = function (sliderPercentage) {\r\n\r\n\t\t// Get the zoom level.\r\n\t\tthis.g_oCanvas.g_iTempZoomLevel = this.getZoomLevelFromSliderPercentage(sliderPercentage);\r\n\t\tvar iZoomLevel = 0;\r\n\r\n\t\t// Calculate the zoom.\r\n\t\tif (this.g_oCanvas.g_iTempZoomLevel > this.g_oCanvas.g_iZoomLevel) {\r\n\t\t\tthis.g_oCanvas.g_iZoomDiff = (this.g_oCanvas.g_iTempZoomLevel - this.g_oCanvas.g_iZoomLevel) / this.g_oCanvas.g_iAnimateFrames;\r\n\t\t\tiZoomLevel = this.g_oCanvas.g_iTempZoomLevel / this.g_oCanvas.g_iZoomLevel;\r\n\t\t\tthis.g_oCanvas.g_iTempDragOffset_x = this.g_oCanvas.g_iDragOffset_x * iZoomLevel;\r\n\t\t\tthis.g_oCanvas.g_iTempDragOffset_y = this.g_oCanvas.g_iDragOffset_y * iZoomLevel;\r\n\t\t\tthis.g_oCanvas.g_iDragXDiff = (this.g_oCanvas.g_iTempDragOffset_x - this.g_oCanvas.g_iDragOffset_x) / this.g_oCanvas.g_iAnimateFrames;\r\n\t\t\tthis.g_oCanvas.g_iDragYDiff = (this.g_oCanvas.g_iTempDragOffset_y - this.g_oCanvas.g_iDragOffset_y) / this.g_oCanvas.g_iAnimateFrames;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.g_oCanvas.g_iZoomDiff = (this.g_oCanvas.g_iZoomLevel - this.g_oCanvas.g_iTempZoomLevel) / this.g_oCanvas.g_iAnimateFrames;\r\n\t\t\tiZoomLevel = (this.g_oCanvas.g_iZoomLevel / this.g_oCanvas.g_iTempZoomLevel);\r\n\t\t\tthis.g_oCanvas.g_iTempDragOffset_x = this.g_oCanvas.g_iDragOffset_x / iZoomLevel;\r\n\t\t\tthis.g_oCanvas.g_iTempDragOffset_y = this.g_oCanvas.g_iDragOffset_y / iZoomLevel;\r\n\t\t\tthis.g_oCanvas.g_iDragXDiff = (this.g_oCanvas.g_iDragOffset_x - this.g_oCanvas.g_iTempDragOffset_x) / this.g_oCanvas.g_iAnimateFrames;\r\n\t\t\tthis.g_oCanvas.g_iDragYDiff = (this.g_oCanvas.g_iDragOffset_y - this.g_oCanvas.g_iTempDragOffset_y) / this.g_oCanvas.g_iAnimateFrames;\r\n\t\t}\r\n\r\n\t\t// Animate the zoom.\r\n\t\tthis.startZoomAnimate();\r\n\r\n\t\t// Since we're getting a new image, clear the (if any) real-time rendered image.\r\n\t\tthis.g_oCanvas.clearRealtimeRenderImage();\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the zoom slider.\r\n\t */\r\n\tCanvasZoom.prototype.updateZoomSlider = function () {\r\n\t\t$(\"#divNavSlider_Range\").val(this.getSliderPercentageFromZoomLevel(Math.round(this.g_oCanvas.g_iZoomLevel * 100)));\r\n\t\t$(\"#divNavSlider_Label\").html(Math.round(this.g_oCanvas.g_iZoomLevel * 100) + \"%\");\r\n\t};\r\n\r\n\t/**\r\n\t * Gets the zoom level from the slider percentage.\r\n\t * @param {int} sliderPercentage - The slider percentage.\r\n\t */\r\n\tCanvasZoom.prototype.getZoomLevelFromSliderPercentage = function (sliderPercentage) {\r\n\t\treturn Math.exp(this.c_iMinSliderZoomVal + this.c_iExpoAdjustmentScale * (sliderPercentage - this.c_iMinSliderPos)) / 100;\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the slider percentgae from the zoom level.\r\n\t * @param {any} zoomLevel - The zoom level.\r\n\t */\r\n\tCanvasZoom.prototype.getSliderPercentageFromZoomLevel = function (zoomLevel) {\r\n\t\treturn this.c_iMinSliderPos + (Math.log(zoomLevel) - this.c_iMinSliderZoomVal) / this.c_iExpoAdjustmentScale;\r\n\t}\r\n\r\n\t/**\r\n\t * Performs a marquee zoom.\r\n\t * @param {array} oSyncCanvas - Any sync canvas.\r\n\t */\r\n\tCanvasZoom.prototype.marqueeZoom = function (oSyncCanvas) {\r\n\t\tvar _this = this;\r\n\t\t$(\"#\" + _this.g_oCanvas.g_oAnnotationCanvas.g_szCanvasId).css('cursor', 'crosshair');\r\n\t\tg_oAnnotations.g_szPrevCursorStyle = \"crosshair\";\r\n\t\tchangeCanvasFunction($(\"#\" + _this.g_oCanvas.g_oAnnotationCanvas.g_szCanvasId), 'pointerup');\r\n\t\tchangeCanvasFunction($(\"#\" + _this.g_oCanvas.g_oAnnotationCanvas.g_szCanvasId), 'click');\r\n\t\tchangeCanvasFunction($(\"#\" + _this.g_oCanvas.g_oAnnotationCanvas.g_szCanvasId), 'pointerdown', function (event) {\r\n\t\t\tg_oMarquee.initiateMarqueeDraw(event, eAnnotationTypes.Rectangle, _this.g_oCanvas.g_oAnnotationCanvas, _this.g_oCanvas, oSyncCanvas, null, _this.marqueZoomPointerUp, true, false, null, false);\r\n\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t * The marquee pointer up event for zooming.\r\n\t * @param {object} event - The event.\r\n\t * @param {object} oArtworkViewer - The artwork viewer.\r\n\t * @param {array} oSyncCanvas - Any sync canvas.\r\n\t * @param {int} iBeginPoint_x - The start x point.\r\n\t * @param {int} iBeginPoint_y - The start y point.\r\n\t * @param {int} iEndPoint_x - The end x point.\r\n\t * @param {int} iEndPoint_y - The end y point.\r\n\t */\r\n\tCanvasZoom.prototype.marqueZoomPointerUp = function (event, oArtworkViewer, oSyncCanvas, iBeginPoint_x, iBeginPoint_y, iEndPoint_x, iEndPoint_y) {\r\n\r\n\t\t// Check if the marquee has been drawn within the artwork.\r\n\t\tif (!g_oMarquee.isMarqueeWithinArtwork(oArtworkViewer)) {\r\n\r\n\t\t\t// Clear the marquee.\r\n\t\t\toArtworkViewer.redraw(true);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Check the maximum zoom level has not been reached.\r\n\t\tif (!oArtworkViewer.g_oCanvasZoom.canZoomIn()) {\r\n\t\t\toArtworkViewer.redraw(true);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// We are going to do a marquee zoom.\r\n\t\t// Find the centre of the dragged area in px.\r\n\t\tvar centrePoint_x = (iEndPoint_x - iBeginPoint_x) / 2 + iBeginPoint_x;\r\n\t\tvar centerPoint_y = (iEndPoint_y - iBeginPoint_y) / 2 + iBeginPoint_y;\r\n\r\n\t\t// Find the offset amount in px from centre.\r\n\t\toArtworkViewer.g_iTempDragOffset_x += centrePoint_x - ((oArtworkViewer.g_oCanvas.width / 2) - oArtworkViewer.g_iDragOffset_x);\r\n\t\toArtworkViewer.g_iTempDragOffset_y += centerPoint_y - ((oArtworkViewer.g_oCanvas.height / 2) - oArtworkViewer.g_iDragOffset_y);\r\n\t\t\r\n\t\t// Determine the zoom level for the width of the marquee:\r\n\t\t// 1 - Determine the number of pixels in the width of the marquee.\r\n\t\t// 2 - Determine the number of pixels in the width of the canvas.\r\n\t\t// 3 - Determine the zoom level we need to fit the marquee area to the width of the canvas.\r\n\t\tvar marqueePixelsX = Math.abs(g_oMarquee.g_iOrigin_x - g_oMarquee.g_iX);\r\n\t\tvar canvasPixelsX = g_oViewer.g_oArtworkViewer.g_oCanvas.width * oArtworkViewer.g_iZoomLevel;\r\n\t\tvar zoomLevelWidth = canvasPixelsX / marqueePixelsX;\r\n\r\n\t\t// Determine the zoom level for the height of the marquee:\r\n\t\t// 1 - Determine the number of pixels in the height of the marquee.\r\n\t\t// 2 - Determine the number of pixels in the height of the canvas.\r\n\t\t// 3 - Determine the zoom level we need to fit the marquee area to the height of the canvas.\r\n\t\tvar marqueePixelsY = Math.abs(g_oMarquee.g_iOrigin_y - g_oMarquee.g_iY);\r\n\t\tvar canvasPixelsY = g_oViewer.g_oArtworkViewer.g_oCanvas.height * oArtworkViewer.g_iZoomLevel;\r\n\t\tvar zoomLevelHeight = canvasPixelsY / marqueePixelsY;\r\n\r\n\t\t// Determine the zoom level to be used based on the width and height of the area we wanted to see in the marquee.\r\n\t\toArtworkViewer.g_iTempZoomLevel = Math.min(zoomLevelWidth, zoomLevelHeight);\r\n\r\n\t\t// If the zoom level would be greater then the maximum, set this to the maximum.\r\n\t\tif (oArtworkViewer.g_iTempZoomLevel > oArtworkViewer.g_oCanvasZoom.c_iMaximumZoomLevel) {\r\n\t\t\toArtworkViewer.g_iTempZoomLevel = oArtworkViewer.g_oCanvasZoom.c_iMaximumZoomLevel;\r\n\t\t}\r\n\r\n\t\t// Determine the amount we need to zoom, and the drag offset amount, based on the current zoom level.\r\n\t\tvar iZoomAmount = (oArtworkViewer.g_iTempZoomLevel / oArtworkViewer.g_iZoomLevel);\r\n\t\toArtworkViewer.g_iTempDragOffset_x *= iZoomAmount;\r\n\t\toArtworkViewer.g_iTempDragOffset_y *= iZoomAmount;\r\n\r\n\t\t// Calulate the zoom and drag offset difference by frame.\r\n\t\toArtworkViewer.g_iZoomDiff = (oArtworkViewer.g_iTempZoomLevel - oArtworkViewer.g_iZoomLevel) / oArtworkViewer.g_iAnimateFrames;\r\n\t\toArtworkViewer.g_iDragXDiff = (oArtworkViewer.g_iTempDragOffset_x - oArtworkViewer.g_iDragOffset_x) / oArtworkViewer.g_iAnimateFrames;\r\n\t\toArtworkViewer.g_iDragYDiff = (oArtworkViewer.g_iTempDragOffset_y - oArtworkViewer.g_iDragOffset_y) / oArtworkViewer.g_iAnimateFrames;\r\n\r\n\t\t// Ensure the zoom level has changed.\r\n\t\tif (oArtworkViewer.g_iZoomDiff == 0) {\r\n\r\n\t\t\t// Clear the marquee.\r\n\t\t\toArtworkViewer.redraw(true);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// If we are syncing the zoom across other canvas.\r\n\t\tfor (var i = 0; i < oSyncCanvas.length; i++) {\r\n\t\t\tif (oSyncCanvas[i].g_szCanvasId != oArtworkViewer.g_szCanvasId) {\r\n\t\t\t\toSyncCanvas[i].synchroniseZoomPanProperties(oArtworkViewer);\r\n\t\t\t\toSyncCanvas[i].g_oCanvasZoom.startZoomAnimate();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Zoom the canvas.\r\n\t\toArtworkViewer.g_oCanvasZoom.startZoomAnimate();\r\n\t};\r\n\r\n\t/**\r\n\t * Starts a zoom animation.\r\n\t */\r\n\tCanvasZoom.prototype.startZoomAnimate = function () {\r\n\t\tthis.zoomAnimate(1);\r\n\t}\r\n\r\n\t/**\r\n\t * Performs the frames for a zoom animation.\r\n\t * @param {int} iCurrentAnimationFrame - The current animation frame.\r\n\t */\r\n\tCanvasZoom.prototype.zoomAnimate = function (iCurrentAnimationFrame) {\r\n\t\t\r\n\t\t// Check that there is a valid zoom or translate to make.\r\n\t\tif (this.canZoomAnimate() && iCurrentAnimationFrame <= this.g_oCanvas.g_iAnimateFrames) {\r\n\r\n\t\t\t// If we are logging the zoom steps.\r\n\t\t\tif (this.g_bLogZoom) {\r\n\t\t\t\tconsole.log(\r\n\t\t\t\t\t\"Zoom: (\" + this.g_oCanvas.g_iZoomLevel + \" => \" + this.g_oCanvas.g_iTempZoomLevel + \") \" + this.g_oCanvas.g_iZoomDiff + \". \" +\r\n\t\t\t\t\t\"X: (\" + this.g_oCanvas.g_iDragOffset_x + \" => \" + this.g_oCanvas.g_iTempDragOffset_x + \") \" + this.g_oCanvas.g_iDragXDiff + \". \" +\r\n\t\t\t\t\t\"Y: (\" + this.g_oCanvas.g_iDragOffset_y + \" => \" + this.g_oCanvas.g_iTempDragOffset_y + \") \" + this.g_oCanvas.g_iDragYDiff + \".\"\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\t// Set that we are animating the canvas.\r\n\t\t\tthis.g_oCanvas.g_bIsAnimating = true;\r\n\r\n\t\t\t// Clear any existing image data.\r\n\t\t\tthis.g_oCanvas.clearImgData();\r\n\r\n\t\t\t// Request the next animation frame.\r\n\t\t\tthis.g_iCurrentZoomFrame++;\r\n\t\t\trequestAnimationFrame(this.zoomAnimate.bind(this, ++iCurrentAnimationFrame));\r\n\r\n\t\t\t// If we need to zoom in.\r\n\t\t\tif (this.g_oCanvas.g_iTempZoomLevel > this.g_oCanvas.g_iZoomLevel) {\r\n\r\n\t\t\t\t// Determine the next zoom level.\r\n\t\t\t\tthis.g_oCanvas.g_iZoomLevel = addFloats(this.g_oCanvas.g_iZoomLevel, this.g_oCanvas.g_iZoomDiff);\r\n\t\t\t\tthis.g_oCanvas.g_iDragOffset_x = addFloats(this.g_oCanvas.g_iDragOffset_x, this.g_oCanvas.g_iDragXDiff);\r\n\t\t\t\tthis.g_oCanvas.g_iDragOffset_y = addFloats(this.g_oCanvas.g_iDragOffset_y, this.g_oCanvas.g_iDragYDiff);\r\n\t\t\t}\r\n\t\t\t// If we need to zoom out.\r\n\t\t\telse {\r\n\r\n\t\t\t\t// Determine the next zoom level.\r\n\t\t\t\tthis.g_oCanvas.g_iZoomLevel = subtractFloats(this.g_oCanvas.g_iZoomLevel, this.g_oCanvas.g_iZoomDiff);\r\n\t\t\t\tthis.g_oCanvas.g_iDragOffset_x = subtractFloats(this.g_oCanvas.g_iDragOffset_x, this.g_oCanvas.g_iDragXDiff);\r\n\t\t\t\tthis.g_oCanvas.g_iDragOffset_y = subtractFloats(this.g_oCanvas.g_iDragOffset_y, this.g_oCanvas.g_iDragYDiff);\r\n\r\n\t\t\t\t// If we have no zooming or dragging left, end the zoom animate.\r\n\t\t\t\tif (this.g_oCanvas.g_iZoomDiff == 0 && this.g_oCanvas.g_iDragXDiff == 0 && this.g_oCanvas.g_iDragYDiff == 0) {\r\n\t\t\t\t\tthis.endZoomAnimate();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t// End the zoom animate.\r\n\t\telse {\r\n\t\t\tthis.endZoomAnimate();\r\n\t\t}\r\n\r\n\t\t// Update the zoom slider.\r\n\t\tif (this.g_oCanvas.g_bMainCanvas) {\r\n\t\t\tthis.updateZoomSlider();\r\n\t\t}\r\n\r\n\t\t// Redraw the canvas.\r\n\t\tthis.g_oCanvas.redraw(true);\r\n\t}\r\n\r\n\t/**\r\n\t * Ends a zoom animation.\r\n\t */\r\n\tCanvasZoom.prototype.endZoomAnimate = function () {\r\n\r\n\t\t// End the zoom animate.\r\n\t\tthis.g_oCanvas.g_iDragOffset_x = this.g_oCanvas.g_iTempDragOffset_x;\r\n\t\tthis.g_oCanvas.g_iDragOffset_y = this.g_oCanvas.g_iTempDragOffset_y;\r\n\t\tthis.g_oCanvas.g_iZoomLevel = this.g_oCanvas.g_iTempZoomLevel;\r\n\t\tthis.g_oCanvas.g_iDragXDiff = 0;\r\n\t\tthis.g_oCanvas.g_iDragYDiff = 0;\r\n\t\tthis.g_oCanvas.g_iZoomDiff = 0;\r\n\t\tthis.g_oCanvas.g_bIsAnimating = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Performs a scroll zoom.\r\n\t * @param {object} event - The scroll event.\r\n\t * @param {array} oSyncCanvas - The sync canvas.\r\n\t * @param {eWheelZoomType} scrollType - The scroll type.\r\n\t */\r\n\tCanvasZoom.prototype.scrollZoom = function (event, oSyncCanvas, scrollType) {\r\n\r\n\t\t// Check we can zoom in.\r\n\t\tif (!this.canZoomIn()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Determine the scroll type.\r\n\t\tswitch (scrollType) {\r\n\r\n\t\t\t// Static zoom.\r\n\t\t\tcase eWheelZoomType.Static:\r\n\r\n\t\t\t\t// Zoom in each sync canvas.\r\n\t\t\t\tfor (var i = 0; i < oSyncCanvas.length; i++) {\r\n\t\t\t\t\toSyncCanvas[i].g_bIsDragging = false;\r\n\t\t\t\t\toSyncCanvas[i].g_oCanvasZoom.zoomIn();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Zoom in this canvas.\r\n\t\t\t\tthis.zoomIn();\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t// Marquee based zooms.\r\n\t\t\tcase eWheelZoomType.Centered:\r\n\t\t\tcase eWheelZoomType.Smart:\r\n\r\n\t\t\t\t// Initiate the marque based zoom.\r\n\t\t\t\tg_oMarquee.initiateMarqueeWheelZoom(event, this.g_oCanvas.g_oAnnotationCanvas, this.g_oCanvas, oSyncCanvas, this.scrollZoomInCallback, scrollType);\r\n\t\t\t\tbreak;\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Performs a scroll zoom out.\r\n\t * @param {object} event - The scroll event.\r\n\t * @param {array} oSyncCanvas - The sync canvas.\r\n\t * @param {eWheelZoomType} scrollType - The scroll type.\r\n\t */\r\n\tCanvasZoom.prototype.scrollZoomOut = function (event, oSyncCanvas, scrollType) {\r\n\r\n\t\t// Check we can zoom out.\r\n\t\tif (!this.canZoomOut()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Determine the scroll type.\r\n\t\tswitch (scrollType) {\r\n\r\n\t\t\t// Static zoom.\r\n\t\t\tcase eWheelZoomType.Static:\r\n\r\n\t\t\t\t// Zoom out each sync canvas.\r\n\t\t\t\tfor (var i = 0; i < oSyncCanvas.length; i++) {\r\n\t\t\t\t\toSyncCanvas[i].g_bIsDragging = false;\r\n\t\t\t\t\toSyncCanvas[i].g_oCanvasZoom.zoomOut();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Zoom out this canvas.\r\n\t\t\t\tthis.zoomOut();\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t// Marquee based zooms.\r\n\t\t\tcase eWheelZoomType.Centered:\r\n\t\t\tcase eWheelZoomType.Smart:\r\n\r\n\t\t\t\t// Initiate the marque based zoom out.\r\n\t\t\t\tg_oMarquee.initiateMarqueeWheelZoomOut(event, this.g_oCanvas.g_oAnnotationCanvas, this.g_oCanvas, oSyncCanvas, scrollType == eWheelZoomType.Centered ? this.scrollZoomOutCenteredCallback : this.scrollZoomOutCallback, scrollType);\r\n\t\t\t\tbreak;\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * The callback for a scroll zoom in event.\r\n\t * @param {object} event - The event.\r\n\t * @param {object} oArtworkViewer - The artwork viewer.\r\n\t * @param {array} oSyncCanvas - Any sync canvas.\r\n\t * @param {int} iBeginPoint_x - The start x point.\r\n\t * @param {int} iBeginPoint_y - The start y point.\r\n\t * @param {int} iEndPoint_x - The end x point.\r\n\t * @param {int} iEndPoint_y - The end y point.\r\n\t */\r\n\tCanvasZoom.prototype.scrollZoomInCallback = function (event, oArtworkViewer, oSyncCanvas, iBeginPoint_x, iBeginPoint_y, iEndPoint_x, iEndPoint_y) {\r\n\r\n\t\t// Calculate the zoom amount.\r\n\t\toArtworkViewer.g_iTempZoomLevel = oArtworkViewer.g_iZoomLevel * oArtworkViewer.g_oCanvasZoom.g_iZoomMultiplier;\r\n\r\n\t\t// If we are over our maximum zoom level, set this to the maximum.\r\n\t\tif (oArtworkViewer.g_iTempZoomLevel > oArtworkViewer.g_oCanvasZoom.c_iMaximumZoomLevel) {\r\n\t\t\toArtworkViewer.g_iTempZoomLevel = oArtworkViewer.g_oCanvasZoom.c_iMaximumZoomLevel;\r\n\t\t}\r\n\r\n\t\t// Find the centre of the area in px.\r\n\t\tvar centrePoint_x = (iEndPoint_x - iBeginPoint_x) / 2 + iBeginPoint_x;\r\n\t\tvar centerPoint_y = (iEndPoint_y - iBeginPoint_y) / 2 + iBeginPoint_y;\r\n\r\n\t\t// Find the offset amount in px from centre.\r\n\t\toArtworkViewer.g_iTempDragOffset_x += centrePoint_x - ((oArtworkViewer.g_oCanvas.width / 2) - oArtworkViewer.g_iDragOffset_x);\r\n\t\toArtworkViewer.g_iTempDragOffset_y += centerPoint_y - ((oArtworkViewer.g_oCanvas.height / 2) - oArtworkViewer.g_iDragOffset_y);\r\n\r\n\t\t// Ensure the scroll will be in the bounds of the image.\r\n\t\toArtworkViewer.g_iTempDragOffset_x = oArtworkViewer.g_iTempDragOffset_x > oArtworkViewer.g_iCompareImage_x / 2 ? oArtworkViewer.g_iCompareImage_x / 2 : oArtworkViewer.g_iTempDragOffset_x;\r\n\t\toArtworkViewer.g_iTempDragOffset_x = oArtworkViewer.g_iTempDragOffset_x < -oArtworkViewer.g_iCompareImage_x / 2 ? -oArtworkViewer.g_iCompareImage_x / 2 : oArtworkViewer.g_iTempDragOffset_x;\r\n\t\toArtworkViewer.g_iTempDragOffset_y = oArtworkViewer.g_iTempDragOffset_y > oArtworkViewer.g_iCompareImage_y / 2 ? oArtworkViewer.g_iCompareImage_y / 2 : oArtworkViewer.g_iTempDragOffset_y;\r\n\t\toArtworkViewer.g_iTempDragOffset_y = oArtworkViewer.g_iTempDragOffset_y < -oArtworkViewer.g_iCompareImage_y / 2 ? -oArtworkViewer.g_iCompareImage_y / 2 : oArtworkViewer.g_iTempDragOffset_y;\r\n\r\n\t\t// Modify the offset by the zoom amount.\r\n\t\tvar iZoomAmount = (oArtworkViewer.g_iTempZoomLevel / oArtworkViewer.g_iZoomLevel);\r\n\t\toArtworkViewer.g_iTempDragOffset_x *= iZoomAmount;\r\n\t\toArtworkViewer.g_iTempDragOffset_y *= iZoomAmount;\r\n\r\n\t\t// Calculate the zoom and drag offset difference by frame.\r\n\t\toArtworkViewer.g_iZoomDiff = (oArtworkViewer.g_iTempZoomLevel - oArtworkViewer.g_iZoomLevel) / oArtworkViewer.g_iAnimateFrames;\r\n\t\toArtworkViewer.g_iDragXDiff = (oArtworkViewer.g_iTempDragOffset_x - oArtworkViewer.g_iDragOffset_x) / oArtworkViewer.g_iAnimateFrames;\r\n\t\toArtworkViewer.g_iDragYDiff = (oArtworkViewer.g_iTempDragOffset_y - oArtworkViewer.g_iDragOffset_y) / oArtworkViewer.g_iAnimateFrames;\r\n\r\n\t\t// If we are syncing the zoom across other canvas.\r\n\t\tfor (var i = 0; i < oSyncCanvas.length; i++) {\r\n\t\t\tif (oSyncCanvas[i].g_szCanvasId != oArtworkViewer.g_szCanvasId) {\r\n\t\t\t\toSyncCanvas[i].synchroniseZoomPanProperties(oArtworkViewer);\r\n\t\t\t\toSyncCanvas[i].g_oCanvasZoom.startZoomAnimate();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Zoom the canvas.\r\n\t\toArtworkViewer.g_oCanvasZoom.startZoomAnimate();\r\n\t};\r\n\r\n\t/**\r\n\t * The callback for a scroll zoom out event.\r\n\t * @param {object} event - The event.\r\n\t * @param {object} oArtworkViewer - The artwork viewer.\r\n\t * @param {array} oSyncCanvas - Any sync canvas.\r\n\t * @param {int} iBeginPoint_x - The start x point.\r\n\t * @param {int} iBeginPoint_y - The start y point.\r\n\t * @param {int} iEndPoint_x - The end x point.\r\n\t * @param {int} iEndPoint_y - The end y point.\r\n\t */\r\n\tCanvasZoom.prototype.scrollZoomOutCallback = function (event, oArtworkViewer, oSyncCanvas, iBeginPoint_x, iBeginPoint_y, iEndPoint_x, iEndPoint_y) {\r\n\r\n\t\t// Calculate the zoom amount.\r\n\t\toArtworkViewer.g_iTempZoomLevel = oArtworkViewer.g_iZoomLevel / oArtworkViewer.g_oCanvasZoom.g_iZoomMultiplier;\r\n\r\n\t\t// If we are over our minimum zoom level, set this to the minimum.\r\n\t\tif (oArtworkViewer.g_iTempZoomLevel < oArtworkViewer.g_oCanvasZoom.c_iMinimumZoomLevel) {\r\n\t\t\toArtworkViewer.g_iTempZoomLevel = oArtworkViewer.g_oCanvasZoom.c_iMinimumZoomLevel;\r\n\t\t}\r\n\r\n\t\t// Find the centre of the area in px.\r\n\t\tvar centrePoint_x = (iEndPoint_x - iBeginPoint_x) / 2 + iBeginPoint_x;\r\n\t\tvar centerPoint_y = (iEndPoint_y - iBeginPoint_y) / 2 + iBeginPoint_y;\r\n\r\n\t\t// Find the offset amount in px from centre.\r\n\t\toArtworkViewer.g_iTempDragOffset_x += centrePoint_x - ((oArtworkViewer.g_oCanvas.width / 2) - oArtworkViewer.g_iDragOffset_x);\r\n\t\toArtworkViewer.g_iTempDragOffset_y += centerPoint_y - ((oArtworkViewer.g_oCanvas.height / 2) - oArtworkViewer.g_iDragOffset_y);\r\n\r\n\t\t// Ensure the scroll will be in the bounds of the image.\r\n\t\toArtworkViewer.g_iTempDragOffset_x = oArtworkViewer.g_iTempDragOffset_x > oArtworkViewer.g_iCompareImage_x / 2 ? oArtworkViewer.g_iCompareImage_x / 2 : oArtworkViewer.g_iTempDragOffset_x;\r\n\t\toArtworkViewer.g_iTempDragOffset_x = oArtworkViewer.g_iTempDragOffset_x < -oArtworkViewer.g_iCompareImage_x / 2 ? -oArtworkViewer.g_iCompareImage_x / 2 : oArtworkViewer.g_iTempDragOffset_x;\r\n\t\toArtworkViewer.g_iTempDragOffset_y = oArtworkViewer.g_iTempDragOffset_y > oArtworkViewer.g_iCompareImage_y / 2 ? oArtworkViewer.g_iCompareImage_y / 2 : oArtworkViewer.g_iTempDragOffset_y;\r\n\t\toArtworkViewer.g_iTempDragOffset_y = oArtworkViewer.g_iTempDragOffset_y < -oArtworkViewer.g_iCompareImage_y / 2 ? -oArtworkViewer.g_iCompareImage_y / 2 : oArtworkViewer.g_iTempDragOffset_y;\r\n\r\n\t\t// Modify the offset by the zoom amount.\r\n\t\tvar iZoomAmount = (oArtworkViewer.g_iTempZoomLevel / oArtworkViewer.g_iZoomLevel);\r\n\t\toArtworkViewer.g_iTempDragOffset_x *= iZoomAmount;\r\n\t\toArtworkViewer.g_iTempDragOffset_y *= iZoomAmount;\r\n\r\n\t\t// Calculate the zoom and drag offset difference by frame.\r\n\t\toArtworkViewer.g_iZoomDiff = Math.abs((oArtworkViewer.g_iTempZoomLevel - oArtworkViewer.g_iZoomLevel)) / oArtworkViewer.g_iAnimateFrames;\r\n\t\toArtworkViewer.g_iDragXDiff = 0 - ((oArtworkViewer.g_iTempDragOffset_x - oArtworkViewer.g_iDragOffset_x)) / oArtworkViewer.g_iAnimateFrames;\r\n\t\toArtworkViewer.g_iDragYDiff = 0 - ((oArtworkViewer.g_iTempDragOffset_y - oArtworkViewer.g_iDragOffset_y)) / oArtworkViewer.g_iAnimateFrames;\r\n\r\n\t\t// If we are syncing the zoom across other canvas.\r\n\t\tfor (var i = 0; i < oSyncCanvas.length; i++) {\r\n\t\t\tif (oSyncCanvas[i].g_szCanvasId != oArtworkViewer.g_szCanvasId) {\r\n\t\t\t\toSyncCanvas[i].synchroniseZoomPanProperties(oArtworkViewer);\r\n\t\t\t\toSyncCanvas[i].g_oCanvasZoom.startZoomAnimate();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Zoom the canvas.\r\n\t\toArtworkViewer.g_oCanvasZoom.startZoomAnimate();\r\n\t};\r\n\r\n\t/**\r\n\t * The callback for a scroll zoom out centered event.\r\n\t * @param {object} event - The event.\r\n\t * @param {object} oArtworkViewer - The artwork viewer.\r\n\t * @param {array} oSyncCanvas - Any sync canvas.\r\n\t * @param {int} iBeginPoint_x - The start x point.\r\n\t * @param {int} iBeginPoint_y - The start y point.\r\n\t * @param {int} iEndPoint_x - The end x point.\r\n\t * @param {int} iEndPoint_y - The end y point.\r\n\t */\r\n\tCanvasZoom.prototype.scrollZoomOutCenteredCallback = function (event, oArtworkViewer, oSyncCanvas, iBeginPoint_x, iBeginPoint_y, iEndPoint_x, iEndPoint_y) {\r\n\r\n\t\t// Calculate the zoom amount.\r\n\t\toArtworkViewer.g_iTempZoomLevel = oArtworkViewer.g_iZoomLevel / oArtworkViewer.g_oCanvasZoom.g_iZoomMultiplier;\r\n\r\n\t\t// If we are over our minimum zoom level, set this to the minimum.\r\n\t\tif (oArtworkViewer.g_iTempZoomLevel < oArtworkViewer.g_oCanvasZoom.c_iMinimumZoomLevel) {\r\n\t\t\toArtworkViewer.g_iTempZoomLevel = oArtworkViewer.g_oCanvasZoom.c_iMinimumZoomLevel;\r\n\t\t}\r\n\r\n\t\t// If we are now fully zoomed out.\r\n\t\tif (oArtworkViewer.g_iTempZoomLevel == 1) {\r\n\r\n\t\t\t// Set the drag offset to the center.\r\n\t\t\toArtworkViewer.g_iTempDragOffset_x = 0;\r\n\t\t\toArtworkViewer.g_iTempDragOffset_y = 0;\r\n\t\t}\r\n\t\t// If we are not fully zoomed out.\r\n\t\telse {\r\n\r\n\t\t\t// Divide the drag offset by the zoom multiplier to keep the offset the same place.\r\n\t\t\toArtworkViewer.g_iTempDragOffset_x = (oArtworkViewer.g_iDragOffset_x / oArtworkViewer.g_oCanvasZoom.g_iZoomMultiplier);\r\n\t\t\toArtworkViewer.g_iTempDragOffset_y = (oArtworkViewer.g_iDragOffset_y / oArtworkViewer.g_oCanvasZoom.g_iZoomMultiplier);\r\n\r\n\t\t\t// Move the drag offset towards the cente based on the zoom level.\r\n\t\t\toArtworkViewer.g_iTempDragOffset_x -= oArtworkViewer.g_iTempDragOffset_x / oArtworkViewer.g_iZoomLevel;\r\n\t\t\toArtworkViewer.g_iTempDragOffset_y -= oArtworkViewer.g_iTempDragOffset_y / oArtworkViewer.g_iZoomLevel;\r\n\t\t}\r\n\r\n\t\t// Calculate the zoom and drag offset difference by frame.\r\n\t\toArtworkViewer.g_iZoomDiff = Math.abs((oArtworkViewer.g_iTempZoomLevel - oArtworkViewer.g_iZoomLevel)) / oArtworkViewer.g_iAnimateFrames;\r\n\t\toArtworkViewer.g_iDragXDiff = 0 - ((oArtworkViewer.g_iTempDragOffset_x - oArtworkViewer.g_iDragOffset_x)) / oArtworkViewer.g_iAnimateFrames;\r\n\t\toArtworkViewer.g_iDragYDiff = 0 - ((oArtworkViewer.g_iTempDragOffset_y - oArtworkViewer.g_iDragOffset_y)) / oArtworkViewer.g_iAnimateFrames;\r\n\r\n\t\t// If we are syncing the zoom across other canvas.\r\n\t\tfor (var i = 0; i < oSyncCanvas.length; i++) {\r\n\t\t\tif (oSyncCanvas[i].g_szCanvasId != oArtworkViewer.g_szCanvasId) {\r\n\t\t\t\toSyncCanvas[i].synchroniseZoomPanProperties(oArtworkViewer);\r\n\t\t\t\toSyncCanvas[i].g_oCanvasZoom.startZoomAnimate();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Zoom the canvas.\r\n\t\toArtworkViewer.g_oCanvasZoom.startZoomAnimate();\r\n\t};\r\n\r\n\t// Add the canvas zoom object to the window.\r\n\twindow.CanvasZoom = CanvasZoom;\r\n\r\n}());"]}