diff --git a/js/org/gigapan/timelapse/crossdomain_api.js b/js/org/gigapan/timelapse/crossdomain_api.js index 2f494a99..2af1584e 100644 --- a/js/org/gigapan/timelapse/crossdomain_api.js +++ b/js/org/gigapan/timelapse/crossdomain_api.js @@ -52,31 +52,37 @@ function setupPostMessageHandlers() { // Handles the cross-domain iframe request to start playing a time machine. pm.bind("timemachine-play", function() { - if (timelapse) - timelapse.play(); + if (timelapse && timelapse.isPaused()) + timelapse.handlePlayPause(); }); // Handles the cross-domain iframe request to pause a time machine. pm.bind("timemachine-pause", function() { - if (timelapse) - timelapse.pause(); + if (timelapse && !timelapse.isPaused()) + timelapse.handlePlayPause(); }); // Handles the cross-domain iframe request to seek a time machine to the specified time. pm.bind("timemachine-seek", function(unsafe_data) { - if (unsafe_data && typeof (unsafe_data) !== 'undefined' && timelapse) - timelapse.seek(unsafe_data); + if (unsafe_data && typeof (unsafe_data) !== 'undefined' && timelapse) { + var time = parseFloat(unsafe_data); + timelapse.seek(time); + } }); // Handles the cross-domain iframe request to change the view of a time machine. pm.bind("timemachine-set-view", function(unsafe_data) { if (unsafe_data && typeof (unsafe_data) !== 'undefined' && timelapse) { + // Before we change the view, cancel any tours that may be playing. + var snaplapseTour = timelapse.getSnaplapseForSharedTour(); + if (snaplapseTour) + snaplapseTour.clearSnaplapse(); + // Sanitize data - var safe_data = {}; - safe_data.view = timelapse.unsafeViewToView(unsafe_data.view); - safe_data.doWarp = !!unsafe_data.doWarp; - safe_data.doPlay = !!unsafe_data.doPlay; - timelapse.setNewView(safe_data.view, safe_data.doWarp, safe_data.doPlay); + var view = timelapse.unsafeViewToView(unsafe_data.view); + var doWarp = !!unsafe_data.doWarp; + var doPlay = !!unsafe_data.doPlay; + timelapse.setNewView(view, doWarp, doPlay); } }); @@ -92,9 +98,10 @@ function setupPostMessageHandlers() { unsafe_data = org.gigapan.Util.unpackVars(unsafe_data); } + // Before we change the view, cancel any tours that may be playing. var snaplapseTour = timelapse.getSnaplapseForSharedTour(); if (snaplapseTour) - snaplapseTour.clearSnaplapse() + snaplapseTour.clearSnaplapse(); if (unsafe_data.v) { var newView = timelapse.unsafeViewToView(unsafe_data.v.split(",")); diff --git a/js/org/gigapan/timelapse/timelapse.js b/js/org/gigapan/timelapse/timelapse.js index 8521a681..0ca4b281 100644 --- a/js/org/gigapan/timelapse/timelapse.js +++ b/js/org/gigapan/timelapse/timelapse.js @@ -1003,31 +1003,33 @@ if (!window['$']) { }; this.getShareView = getShareView; - // Extract a safe view object from an unsafe view string. - var unsafeViewToView = function(viewParam) { + // Extract a safe view from either a view object (i.e. {center:{x:val, y:val}, zoom:val}) or + // from an array of strings (i.e. a share URL, such as #v=44.96185,59.06233,4.5,latLng&t=0.10, + // that has been unpacked). + var unsafeViewToView = function(unsafe_viewParam) { var view = null; - if (!viewParam) - return view; + if (!unsafe_viewParam) + return null; - // If the view is not a string (i.e an object) then we need to break it up into one - // so that we can sanitize it below. - if (viewParam.center || viewParam.bbox) { + // If we have a view object and not an array of strings (i.e. an unpacked share URL) then we need to unpack + // the view object into an array of strings so that it can be properly sanitized further down. + if (unsafe_viewParam.center || unsafe_viewParam.bbox) { var tmpViewParam = []; - if (viewParam.center) { + if (unsafe_viewParam.center) { var isLatLng = false; - var centerView = viewParam.center; + var centerView = unsafe_viewParam.center; for (var key in centerView) { tmpViewParam.push(centerView[key]); if (key == "lat") isLatLng = true; } - tmpViewParam.push(viewParam.zoom); + tmpViewParam.push(unsafe_viewParam.zoom); isLatLng ? tmpViewParam.push("latLng") : tmpViewParam.push("pts"); - viewParam = tmpViewParam; - } else if (viewParam.bbox) { + unsafe_viewParam = tmpViewParam; + } else if (unsafe_viewParam.bbox) { var isLatLng = false; - var bboxView = viewParam.bbox; + var bboxView = unsafe_viewParam.bbox; for (var key in bboxView) { if (key == "ne" || key == "sw") { isLatLng = true; @@ -1038,48 +1040,48 @@ if (!window['$']) { } } isLatLng ? tmpViewParam.push("latLng") : tmpViewParam.push("pts"); - viewParam = tmpViewParam; + unsafe_viewParam = tmpViewParam; } } - if (viewParam.indexOf("latLng") != -1) { - if (viewParam.length == 4) + if (unsafe_viewParam.indexOf("latLng") != -1) { + if (unsafe_viewParam.length == 4) view = { center: { - "lat": parseFloat(viewParam[0]), - "lng": parseFloat(viewParam[1]) + "lat": parseFloat(unsafe_viewParam[0]), + "lng": parseFloat(unsafe_viewParam[1]) }, - "zoom": parseFloat(viewParam[2]) + "zoom": parseFloat(unsafe_viewParam[2]) }; - else if (viewParam.length == 5) + else if (unsafe_viewParam.length == 5) view = { bbox: { "ne": { - "lat": parseFloat(viewParam[0]), - "lng": parseFloat(viewParam[1]) + "lat": parseFloat(unsafe_viewParam[0]), + "lng": parseFloat(unsafe_viewParam[1]) }, "sw": { - "lat": parseFloat(viewParam[2]), - "lng": parseFloat(viewParam[3]) + "lat": parseFloat(unsafe_viewParam[2]), + "lng": parseFloat(unsafe_viewParam[3]) } } }; } else {// Assume points if the user did not specify latLng. Also allow for the omission of 'pts' param for backwards compatibility - if ((viewParam.indexOf("pts") == -1 && viewParam.length == 3) || viewParam.length == 4) + if ((unsafe_viewParam.indexOf("pts") == -1 && unsafe_viewParam.length == 3) || unsafe_viewParam.length == 4) view = { center: { - "x": parseFloat(viewParam[0]), - "y": parseFloat(viewParam[1]) + "x": parseFloat(unsafe_viewParam[0]), + "y": parseFloat(unsafe_viewParam[1]) }, - "zoom": parseFloat(viewParam[2]) + "zoom": parseFloat(unsafe_viewParam[2]) }; - else if ((viewParam.indexOf("pts") == -1 && viewParam.length == 4) || viewParam.length == 5) + else if ((unsafe_viewParam.indexOf("pts") == -1 && unsafe_viewParam.length == 4) || unsafe_viewParam.length == 5) view = { bbox: { - "xmin": parseFloat(viewParam[0]), - "xmax": parseFloat(viewParam[1]), - "ymin": parseFloat(viewParam[2]), - "ymax": parseFloat(viewParam[3]) + "xmin": parseFloat(unsafe_viewParam[0]), + "xmax": parseFloat(unsafe_viewParam[1]), + "ymin": parseFloat(unsafe_viewParam[2]), + "ymax": parseFloat(unsafe_viewParam[3]) } }; }