(function(define, undefined) { 'use strict'; define(['jquery', 'underscore', 'annotator_1.2.9'], function($, _, Annotator) { /** * Adds the Scroller Plugin which scrolls to a note with a certain id and * opens it. **/ Annotator.Plugin.Scroller = function() { // Call the Annotator.Plugin constructor this sets up the element and // options properties. Annotator.Plugin.apply(this, arguments); }; $.extend(Annotator.Plugin.Scroller.prototype, new Annotator.Plugin(), { getIdFromLocationHash: function() { return window.location.hash.substr(1); }, pluginInit: function() { _.bindAll(this, 'onNotesLoaded'); // If the page URL contains a hash, we could be coming from a click // on an anchor in the notes page. In that case, the hash is the id // of the note that has to be scrolled to and opened. if (this.getIdFromLocationHash()) { this.annotator.subscribe('annotationsLoaded', this.onNotesLoaded); } }, destroy: function() { this.annotator.unsubscribe('annotationsLoaded', this.onNotesLoaded); }, onNotesLoaded: function(notes) { var hash = this.getIdFromLocationHash(); this.annotator.logger.log('Scroller', { 'notes:': notes, 'hash': hash }); _.each(notes, function(note) { var highlight, offset; if (note.id === hash && note.highlights.length) { // Clear the page URL hash, it won't be needed once we've // scrolled and opened the relevant note. And it would // unnecessarily repeat the steps below if we come from // another sequential. window.location.hash = ''; highlight = $(note.highlights[0]); offset = highlight.position(); // Open the note this.annotator.showFrozenViewer([note], { top: offset.top + 0.5 * highlight.height(), left: offset.left + 0.5 * highlight.width() }); // Freeze the viewer this.annotator.freezeAll(); // Scroll to highlight this.scrollIntoView(highlight); } }, this); }, scrollIntoView: function(highlight) { highlight.focus(); } }); }); }).call(this, define || RequireJS.define);