Skip to content

Instantly share code, notes, and snippets.

@randito
Created July 17, 2012 21:04
Show Gist options
  • Save randito/3132063 to your computer and use it in GitHub Desktop.
Save randito/3132063 to your computer and use it in GitHub Desktop.
Google Art Project: Backbone js code. Beautified via http://jsbeautifier.org/
ap.globals.MainBaseView = Backbone.View.extend({
el: $("body"),
elements: {
$header: $("#header"),
$footer: $("#footer"),
$secondaryNav: $("nav.secondary"),
$pageContent: $(".content-wrapper"),
$mainContent: $(".main-content")
},
options: {
visibleButtons: [".plusone", ".discover", ".share", ".add-to-collection", ".slideshow", ".streetview"]
},
router: null,
sidebar: null,
jScrollPaneApi: null,
minHeight: 560,
streetview: null,
initialize: function () {
var a = this;
_.bindAll(this, "renderSidebar", "resizeContentArea", "setupSearch", "render", "langSelector");
if (_.isUndefined(a.options.useSidebar)) {
a.options.useSidebar = true
}
if (a.options.useSidebar) {
$(window).smartresize(this.resizeContentArea)
}
if ($("#header-nav-user-template").length) {
a.userHeaderNavTpl = _.template($("#header-nav-user-template").html())
}
a.initSidebar(a.options);
$("#secondary-prop .artwork-title .pegman").click(function (b) {
b.preventDefault();
$("#sidebar .toolbar-actions-container .streetview").trigger("click")
});
if (a.options.dontFetchUserData !== true) {
ap.getCurrentUser(function () {
a.sidebar.trigger("userDataLoaded");
a.trigger("userDataLoaded")
})
}
a.elements.$header.on("click", "a", ap.clearCurrentArtworkCollectionState);
a.elements.$header.on("click", ".sign-in-out.in .username", a.toggleSignOut);
return a
},
initSidebar: function (a) {
this.sidebar = new ap.sidebar.MainView(a);
this.sidebar.parentView = this
},
showMuseumView: function () {
window.app.sidebar.showMuseumView()
},
renderSidebar: function () {
this.sidebar.render();
this.resizeContentArea()
},
resizeContentArea: function () {
var k = $(window).height();
var a = this.elements.$header.outerHeight(true);
var f = (!ap.isMobile) ? 70 : 46;
var j = this.elements.$secondaryNav.outerHeight(true);
var c = k - (a + j + f);
this.elements.$pageContent.height(c - 1);
var d = $(window).width();
var e = this.sidebar.closedWidth + this.sidebar.el.position().left;
var b = d - e;
$(".content-with-sidebar").css({
marginLeft: e,
width: b + "px"
});
if (this.jScrollPaneApi !== null) {
this.jScrollPaneApi.reinitialise()
}
if (this.sidebar && this.sidebar.discover) {
this.sidebar.discover.trigger("contentAreaResized")
}
this.trigger("contentAreaResized");
if (this.streetview) {
this.streetview.updateStreetview();
if (this.streetview.thumbnailStrip) {
this.streetview.thumbnailStrip.resize(b)
}
}
},
render: function () {
if (this.options.useSidebar) {
this.renderSidebar()
}
this.langSelector()
},
setupSearch: function () {
var a = new ap.search.AutosuggestSearchView({
$input: $("#input-header-search"),
$wrapper: $("#search-autosuggest-wrapper")
});
a.render()
},
langSelector: function () {
$("#current-lang a").click(function () {
$langselector = $("#lang-selector");
var b = $("#current-lang").offset();
var a = b.left;
var c = b.top;
var d = $langselector.height();
lang_selector_top = c - d - 16;
lang_selector_left = a - 30;
$langselector.css("left", lang_selector_left);
$langselector.css("top", lang_selector_top);
if ($langselector.is(":visible")) {
$langselector.hide("slide", {
direction: "down"
})
} else {
$langselector.show("slide", {
direction: "down"
})
}
return false
})
},
toggleSignOut: function () {
var a = $("#profile-navigation .sign-in-out.in");
if (a.hasClass("active")) {
a.removeClass("active")
} else {
a.addClass("active")
}
return false
}
});
ap.globals.MainCollectionView = ap.globals.MainBaseView.extend({
events: {
currentCollectionChange: "currentCollectionChange"
},
options: {
aggregationConfig: {
artworkDimensions: {
height: null,
width: null
},
aggregationType: null,
collectionOptions: {},
modelViewType: null,
useDynamicRows: true,
viewType: null
}
},
initialPreloader: null,
addToExistingPreloader: null,
mainScrollingView: null,
preloaderview: null,
addToExistingPreloader: null,
pagingProcessManager: null,
loadedViewArray: [],
fullViewArray: [],
defaultQueryStringParams: {
offset: 0,
limit: 30
},
currentCollection: {},
initialize: function (d) {
var c = this,
a, b, f;
_.bindAll(c, "filterCurrentCollection", "addAll", "addOne", "addNewlyLoaded", "render", "onSidebarResize", "closeSidebar", "closeTopFilter", "clearCollectionElements");
ap.globals.MainBaseView.prototype.initialize.apply(c, [d]);
b = c.options.aggregationConfig;
c.pagingProcessManager = new ap.system.ProcessManager("paging");
if (b.aggregationBodyType && b.aggregationBodyType !== "artworks") {
ap.clearCurrentArtworkCollectionState()
}
if (c.sidebar && c.sidebar.discover) {
var e = c.sidebar.discover.get_restrict_next_by(true);
if (e) {
$.extend(c.defaultQueryStringParams, e)
}
}
a = ap.buildApiUrl(c.options.urlParts, $.extend(c.defaultQueryStringParams, c.options.qs_params));
f = $.extend({}, {
url: a,
activeFilters: c.options.qs_params
}, b.collectionInitOptions);
c.currentCollection = new ap[b.aggregationType](null, f);
c.currentCollection.bind("reset", c.addAll);
c.currentCollection.bind("addNewlyLoaded", c.addNewlyLoaded);
if (c.currentCollection.filterTypes && !$.isEmptyObject(c.currentCollection.filterTypes)) {
if (!ap.isMobile) {
c.topFiltersView = new ap.aggregation.layout.TopFiltersView({
filtersToInit: c.currentCollection.filterTypes,
parentView: c,
isOpen: (["collection", "artist"].indexOf(c.currentCollection.collectionType) !== -1)
})
} else {
c.topFiltersView = new ap.mobile.aggregation.TopFiltersView({
filtersToInit: c.currentCollection.filterTypes,
parentView: c,
isOpen: (["collection", "artist"].indexOf(c.currentCollection.collectionType) !== -1)
})
}
}
c.bind("filterCurrentCollection", c.filterCurrentCollection);
c.bind("topFilterOpening", c.closeSidebar);
c.bind("sidebarOpening", c.closeTopFilter);
if (c.rowsView) {
ap.aggregation.layout.Global.currentRowView = ap.aggregation.layout.Config["rowView" + b.rowId]
}
if (b.preloadImages) {
c.initialPreloader = new ap.system.imagePreload("initial", {
imageLoaded: c.imageLoadedCallback,
imageLoadError: c.imageLoadErrorCallback,
batchLoaded: c.initialBatchLoadedCallback
});
c.addToExistingPreloader = new ap.system.imagePreload("addToExisting", {
imageLoaded: c.imageLoadedCallback,
imageLoadError: c.imageLoadErrorCallback,
batchLoaded: c.addToExistingBatchLoadedCallback
})
}
return c
},
closeTopFilter: function () {
if (this.topFiltersView) {
this.topFiltersView.closeFilter()
}
},
filterCurrentCollection: function (b, d, c) {
var a = {
offset: 0,
limit: 30
};
if (b) {
if (d) {
this.currentCollection.setFilter(b, d)
} else {
this.currentCollection.removeFilter(b)
}
}
if (c && c.silent === true) {
return
}
this.currentCollectionChange()
},
currentCollectionChange: function (a, c) {
var b = this;
if (b.currentXHR) {
b.currentXHR.abort()
}
b.clearCollectionElements();
b.jScrollPaneApi.scrollToX(0, false);
ap.aggregation.layout.RowFormat.resetRowWidth();
b.jScrollPaneApi.reinitialise();
if (b.pagingProcessManager) {
b.pagingProcessManager.reset();
b.pagingProcessManager.start()
}
b.fullViewArray = [];
b.loadedViewArray = [];
ap.aggregation.layout.Global.numberOfImages = 0;
if (c) {
b.currentCollection = c;
if (b.rowsView) {
b.rowsView.collection = b.currentCollection;
b.rowsView.infiniteScrollingView.collection = b.currentCollection
}
b.currentCollection.bind("reset", b.addAll);
b.currentCollection.bind("addNewlyLoaded", b.addNewlyLoaded)
}
if (b.rowsView) {
ap.aggregation.layout.Global.lastRow = 0
}
b.currentXHR = b.currentCollection.fetch()
},
closeSidebar: function () {
if (this.sidebar && this.sidebar.open) {
this.sidebar.closeSidebar();
if ($("#streetview").is(":visible")) {
this.sidebar.killMuseumView();
this.sidebar.el.find(".toolbar-actions-container .streetview").trigger("click")
}
if (this.museumDetails) {
this.museumDetails.togglePopup("up")
}
} else {
if (ap.isMobile) {
if ($("#streetview").is(":visible")) {
this.sidebar.killMuseumView();
this.sidebar.el.find(".toolbar-actions-container .streetview").trigger("click")
}
}
}
},
clearCollectionElements: function () {
$(".row").empty()
},
updateCounts: function () {
var a = JSON.parse(this.currentXHR.responseText);
$("#secondary-prop h2.artwork-artist .count").text(a.meta.total_count)
},
addAll: function () {
var a = this;
this.updateCounts();
if (this.sidebar) {
this.sidebar.config.aggregation = this.currentCollection;
this.sidebar.config.aggregation_view = this;
this.sidebar.disableButton(".slideshow")
}
a.clearCollectionElements();
a.fullViewArray = [];
a.loadedViewArray = [];
ap.aggregation.layout.Global.numberOfImages = 0;
a.currentCollection.each(function (b) {
a.addOne(b, a.initialPreloader)
});
if (a.options.aggregationConfig.preloadImages) {
ap.log("preloading...");
a.initialPreloader.load()
} else {
ap.log("skipping preloading...");
a.initialBatchLoadedCallback.call(a)
}
},
addNewlyLoaded: function () {
ap.log("addNewlyLoaded...");
var a = this;
$.each(a.currentCollection.newlyAdded,
function (c, b) {
ap.aggregation.layout.Global.numberOfImages++;
a.addOne(b, a.addToExistingPreloader, true)
});
if (a.options.aggregationConfig.preloadImages) {
a.addToExistingPreloader.load()
} else {
a.addToExistingBatchLoadedCallback.call(a)
}
},
addOne: function (c, d, k) {
var l = this;
var f = l.options.aggregationConfig;
if (ap.isMobile && f.modelViewType == "ArtworkView") {
var j = new ap.mobile.aggregation[f.modelViewType]({
model: c,
isAppendToExisting: k,
imageSize: f.artworkDimensions,
addExtraOptions: true,
parentView: l
})
} else {
var j = new ap.aggregation.layout[f.modelViewType]({
model: c,
isAppendToExisting: k,
imageSize: f.artworkDimensions,
addExtraOptions: true,
parentView: l
})
}
l.loadedViewArray.push(j);
ap.aggregation.layout.Global.numberOfImages++;
var e = c.viewOrder - 1;
if (!e) {
l.fullViewArray.push(j)
} else {
l.fullViewArray[e] = j
}
if (j.model.attributes.primary_image != null && j.model.attributes.cached_artwork_primary_image_full_url != null) {
var b = {
self: l,
view: j
};
var a = ap.aggregation.layout.Global.currentRowView.image;
d.addToQueue(j.model.image(ap.aggregation.layout.Global.currentRowView.image.height), b)
}
return j
},
onSidebarResize: function () {
this.jScrollPaneApi.reinitialise()
},
render: function () {
ap.globals.MainBaseView.prototype.render.apply(this, [this.options]);
this.preloaderview = new ap.aggregation.layout.PreloaderView();
this.preloaderview.render();
if (this.topFiltersView) {
this.topFiltersView.render()
}
this.mainScrollingView = new ap.aggregation.layout.MainScrollingView({
el: this.el
});
this.jScrollPaneApi = this.mainScrollingView.render();
this.infiniteScrollingView = new ap.aggregation.layout.InfiniteScrollingView({
el: this.el,
jScrollPaneApi: this.jScrollPaneApi,
collection: this.currentCollection,
selector: ".column:last-child"
});
$(this.sidebar.el.selector).on("resize", this.sidebar.el.selector, this.onSidebarResize);
this.pagingProcessManager.start();
this.currentXHR = this.currentCollection.fetch()
}
});
ap.globals.MainNameListView = ap.globals.MainCollectionView.extend({
el: $(".content-with-sidebar"),
defaultQueryStringParams: {
offset: 0,
limit: 30
},
currentLetter: null,
currentColumn: null,
maxItemsInColumn: 0,
options: {
disabledButtons: [".add-to-collection"],
visibleButtons: [".plusone", ".discover", ".share", ".add-to-collection", ".slideshow"],
},
columns: [],
columnsCount: 0,
itemHeight: 44,
initialize: function () {
var a = this;
_.bindAll(this, "render", "filterCurrentCollection", "addAll", "addNewlyLoaded", "reorganiseColumns", "setMaxWidth", "addToColumn", "needToLoadMore", "clearCollectionElements");
ap.globals.MainCollectionView.prototype.initialize.apply(a, [a.options])
},
clearCollectionElements: function () {
this.currentColumn = null;
this.columnsCount = 0;
this.container.empty();
this.container.width(0)
},
addAll: function () {
var a = this;
this.updateCounts();
a.pagingProcessManager.end();
ap.log("addAll started", "info");
a.clearCollectionElements();
a.calculateMaxHeight();
ap.log("started adding", "warn");
a.currentCollection.each(function (c) {
a.addOne(c)
});
ap.log("ended adding", "warn");
var b = a.setMaxWidth();
ap.log("set max width", "warn");
a.jScrollPaneApi.reinitialise({
contentWidth: b
});
ap.log("jsp reinitialised", "warn");
a.pagingProcessManager.end();
ap.log("addAll finished", "info");
if (a.needToLoadMore()) {
a.currentXHR = a.currentCollection.nextPage();
if (a.currentXHR === false) {
a.currentLetter = null
}
}
},
addNewlyLoaded: function () {
var a = this;
$.each(a.currentCollection.newlyAdded,
function (c, d) {
a.addOne(d)
});
var b = a.setMaxWidth();
a.jScrollPaneApi.reinitialise({
contentWidth: b
});
a.pagingProcessManager.end();
if (a.needToLoadMore()) {
a.currentXHR = a.currentCollection.nextPage();
if (a.currentXHR === false) {
a.currentLetter = null
}
}
},
onSidebarResize: function () {
this.jScrollPaneApi.reinitialise()
},
createNewColumn: function () {
var a = this;
a.currentColumn = new ap.artist.layout.ColumnView();
a.columns.push[a.currentColumn];
a.columnsCount++;
a.container.append(a.currentColumn.el);
return $(a.currentColumn.el)
},
addToColumn: function (d) {
if (!this.currentColumn) {
this.createNewColumn()
}
var b = this.currentColumn.itemCount;
var a = (b == this.maxItemsInColumn);
var c = false;
if ($(d).hasClass("letter") && (b + 1 == this.maxItemsInColumn)) {
c = true
}
if (this.maxItemsInColumn && (c || a)) {
this.createNewColumn()
}
$(this.currentColumn.el).append($(d));
this.currentColumn.itemCount++
},
setMaxWidth: function () {
var b = 320;
var a = this.columnsCount * b;
this.container.width(a);
this.calculateMaxHeight();
return a
},
needToLoadMore: function () {
return this.container.width() < $(this.el).width()
},
calculateMaxHeight: function () {
var a = this;
var c = (!ap.isMobile) ? 120 : 180;
var b = $(a.el).height() - c;
var d = Math.floor(b / a.itemHeight);
a.maxItemsInColumn = d
},
reorganiseColumns: function (e) {
var d = this;
ap.log("Starting reorder", "warn");
d.calculateMaxHeight();
var b = $(d.container);
var c = b.find(".column").not(".dontTouchMe").find(".item");
d.currentColumn = null;
d.columnsCount = 1;
var a = 0;
b.find(".column").not(".dontTouchMe").addClass("removeme");
$.each(c,
function (f, j) {
d.addToColumn(j)
});
$(".removeme").remove();
d.setMaxWidth();
d.jScrollPaneApi.reinitialise({
contentWidth: b.width()
});
d.pagingProcessManager.end();
if (d.currentXHR && d.currentXHR.status == 0) {} else {
if (e !== false && d.needToLoadMore()) {
d.currentXHR = d.currentCollection.nextPage();
if (d.currentXHR === false) {
d.currentLetter = null
}
}
}
ap.log("Finished reorder", "warn")
}
});
ap.globals.AudioPlayerView = Backbone.View.extend({
el: $(".audioplayer"),
events: {
mouseenter: "growProgressbar",
mouseleave: "setShrinkTimeout"
},
template: null,
jqueryPlayerTemplate: '<div id="jquery_jplayer_<%= artwork_id %>" class="jp-jplayer"></div>',
context: null,
player: null,
playlistItems: [],
swfPath: null,
progressBar: null,
defaultProgressbarHeight: null,
shrinkTimeout: null,
shrinkProgressbarDelay: 2000,
scrollDurationPer100px: 3500,
scrollDirection: -1,
scrollDelayDuration: 1000,
playlistOptions: {
autoPlay: false,
loopOnPrevious: false,
shuffleOnLoop: false,
enableRemoveControls: false,
displayTime: "slow",
addTime: "fast",
removeTime: "fast",
shuffleTime: "slow"
},
initialize: function () {
_.bindAll(this, "render", "growProgressbar", "setShrinkTimeout", "shrinkProgressbar", "scrollTitle", "setupTitleScroller", "play");
this.playlistItems = this.options.playlistItems;
this.context = {
artwork_id: $(this.el).data("artwork-id")
}
},
growProgressbar: function () {
clearTimeout(this.shrinkTimeout);
var a = this;
a.progressBar.animate({
height: 10
})
},
setShrinkTimeout: function () {
this.shrinkTimeout = setTimeout(this.shrinkProgressbar, this.shrinkProgressbarDelay)
},
shrinkProgressbar: function () {
var a = this;
a.progressBar.animate({
height: a.defaultProgressbarHeight
})
},
setupTitleScroller: function () {
var d = this;
var b = d.el.find(".jp-title").eq(0);
var e = b.width();
var f = b.find("li").eq(0);
f.stop().css("margin-left", 0);
var j = f.outerWidth();
var c = j - e;
var a = c * d.scrollDurationPer100px / 100;
d.scrollParams = {
titleContainer: b,
titleContainerWidth: e,
title: f,
titleWidth: j,
amountToAnimate: c,
durationToAnimate: a,
scrollDirection: d.scrollDirection
}
},
play: function () {
this.player.jPlayer("play", 0)
},
scrollTitle: function () {
var a = this;
if (a.scrollParams.amountToAnimate > 0) {
a.scrollParams.title.animate({
marginLeft: a.scrollParams.scrollDirection * a.scrollParams.amountToAnimate
}, {
duration: a.scrollParams.durationToAnimate,
easing: "linear",
complete: function () {
if (a.scrollParams.scrollDirection == 0) {
a.scrollParams.scrollDirection = -1
} else {
a.scrollParams.scrollDirection = 0
}
setTimeout(function () {
a.scrollTitle()
}, a.scrollDelayDuration)
}
})
}
},
initPlayer: function () {
var a = this;
a.player = new jPlayerPlaylist({
jPlayer: "#jquery_jplayer_" + a.context.artwork_id,
cssSelectorAncestor: $(a.el).selector
}, a.playlistItems, {
playlistOptions: a.playlistOptions,
swfPath: a.swfPath,
supplied: "mp3",
ready: function () {
a.player.select(0);
a.setupTitleScroller();
a.scrollTitle()
}
})
},
render: function () {
var a = this;
a.template = _.template($("#audio_player-template").html(), a.context);
a.el.append(a.template);
a.progressBar = a.el.find(".jp-progress").eq(0);
a.defaultProgressbarHeight = a.progressBar.height();
a.swfPath = $(a.el).find(".audioplayer").data("swf-url");
a.jqueryPlayerTemplate = _.template(a.jqueryPlayerTemplate, a.context);
$(a.jqueryPlayerTemplate).insertBefore($(a.el));
a.initPlayer()
}
});
ap.globals.InlineRename = Backbone.View.extend({
events: {
"click .edit-inline": "replace_with_input",
"keypress #rename-input": "key_handler",
"blur #rename-input": "blur_rename",
"blur #rename-textarea": "blur_rename"
},
template: '<div class="rename-cont"><input type="text" name="rename-input" id="rename-input" /></div>',
textareaTemplate: '<div class="rename-cont"><textarea cols="10" rows="8" name="rename-textarea" id="rename-textarea"></textarea></div>',
current_heading: "",
initialize: function () {
var a = this
},
addEditClass: function () {
var b = this;
var c = $(b.el).find(b.options.target_element);
var a = !_.isUndefined(b.options.auto_edit) && b.options.auto_edit;
_.each(c,
function (e) {
var d = $(e);
if ($.trim(d.text()) === b.options.target_default) {
d.addClass("edit-inline")
}
if (a) {
d.click()
}
})
},
key_handler: function (b) {
var a = this;
if (b.keyCode === 13) {
if (_.isUndefined(a.options.textarea) || !a.options.textarea) {
b.preventDefault();
a.save_rename(b, $("#rename-input"))
}
} else {
if (b.keyCode === 27) {
a.cancel_rename()
}
}
},
save_rename: function (d, c) {
d.preventDefault();
d.stopPropagation();
var a = this;
var e = c.val();
var b = {};
if (e === "" || e === undefined || e === a.options.target_default) {
a.cancel_rename()
} else {
b[a.options.replace] = e;
if (typeof (a.model.get("artwork")) === "object") {
b.artwork = a.model.get("artwork").resource_uri;
b.bookmark_group = a.model.get("bookmark_group").resource_uri
}
a.model.set(b);
if ($("#rename-input").parent().parent().is("a")) {
$("#rename-input").parent().parent().attr("href", ap.slugify(a.model.get("id")) + "/update/")
}
if (!_.isUndefined(a.options.saveCallback)) {
$(a.el).find(".rename-cont").after('<span class="spinner"></span>');
a.model.save({}, {
success: function (j, f) {
var k = a.options.saveCallback(j, f);
$(a.el).find(".user-content").replaceWith(k)
},
error: function (j, f) {
a.cancel_rename(d);
alert('"' + j.get("youtube_id") + '" ' + TRANSLATIONS.invalid_youtube_link)
}
})
} else {
a.current_heading.text(a.model.get(a.options.replace));
$(a.el).find(".rename-cont").replaceWith(a.current_heading);
$(a.el).find(a.options.target_element).removeClass("edit-inline");
a.model.save()
}
return false
}
},
blur_rename: function (b) {
var a = this;
return a.save_rename(b, $(b.currentTarget))
},
cancel_rename: function (c) {
var a = this;
$(a.el).find(".spinner").remove();
if (_.isUndefined(a.options.textarea) || !a.options.textarea) {
var b = $("#rename-input");
if (!_.isUndefined(a.options.replace_parent) && a.options.replace_parent) {
b.parent().replaceWith(a.current_heading)
} else {
b.replaceWith(a.current_heading)
}
} else {
$("#rename-input, .spinner").replaceWith(a.current_heading).find(".video").hide()
}
},
replace_with_input: function (c) {
var a = this;
var b = $(c.target);
c.preventDefault();
if (b.parent().is("a")) {
a.current_heading = b.parent()
} else {
a.current_heading = b
}
if (_.isUndefined(a.options.textarea) || !a.options.textarea) {
$(a.el).find(a.options.target_element).replaceWith(a.template)
} else {
$(a.el).find(a.options.target_element).replaceWith(a.textareaTemplate)
}
$("#rename-input, #rename-textarea").val(a.options.target_default).focus().select()
}
});
ap.namespace("ap.aggregation.layout").Global = {
currentRowView: {},
lastRow: 0,
numberOfImages: 0
};
ap.namespace("ap.aggregation.layout").Config = {
rowViewOne: {
image: {
height: 470,
padding: 9
},
zoom: {
size: 100,
image: {
height: 800
}
},
minHeight: 106,
maxHeight: 212,
hasVariableNumberOfRows: false,
numberOfRows: 1,
artworkInfo: "fixed",
title: "One"
},
rowViewTwo: {
image: {
height: 190,
padding: 9
},
zoom: {
size: 50,
image: {
height: 402
}
},
minHeight: 232,
maxHeight: 512,
hasVariableNumberOfRows: false,
numberOfRows: 2,
artworkInfo: "popup",
title: "Two"
},
rowViewMulti: {
image: {
height: 106,
padding: 9
},
zoom: {
size: 25,
image: {
height: 232
}
},
minHeight: 106,
maxHeight: 232,
hasVariableNumberOfRows: true,
numberOfRows: 4,
artworkInfo: "popup",
title: "Multi"
},
singleArtworkView: {
zoom: {
size: 70,
useAnchorPosition: true,
image: {
height: 300
}
}
},
rowViewBookmarks: {
image: {
height: 106,
padding: 9
},
zoom: {
size: 25,
image: {
height: 232
}
},
minHeight: 106,
maxHeight: 106,
hasVariableNumberOfRows: true,
numberOfRows: 4,
artworkInfo: "popup",
title: "Bookmarks"
},
};
ap.bookmarks.CreateBookmark = Backbone.View.extend({
el: $(".add-to-collection-content"),
events: {
"submit #add-bookmark": "createNewBookmark",
"click a.create-new": "createNewGroupSidebar"
},
getTpl: function (a) {
return _.template($(a).html())
},
jScrollPane: null,
initialize: function (b) {
var a = this;
_.bindAll(this, "getGroupById", "reinitialiseScrollPane", "applyTpl", "setupJScrollPane", "addNewlyLoaded");
a.bookmarkGroups = new ap.UserBookmarkGroupList();
a.bookmarkGroups.bind("addNewlyLoaded", a.addNewlyLoaded);
a.$scrollPane = $(a.el).find(".scroll-pane");
a.setupJScrollPane();
$(window).smartresize(a.reinitialiseScrollPane);
a.options.sidebar.el.bind("resize", a.reinitialiseScrollPane);
$(a.el).on("change", "input:radio",
function (c) {
$(a.el).find("li").removeClass("selected");
$(c.target).closest("li").addClass("selected")
});
a.bookmarkGroups.fetchBunch()
},
addNewlyLoaded: function () {
var a = this,
c = a.el.find("ul.collections"),
d = c.children(".loading-more"),
b = a.getTpl("#sidebar_new_bookmark_group-template");
_.each(a.bookmarkGroups.newlyAdded,
function (f, e) {
d.before(b({
bookmark_group: f.attributes
}))
});
if (!a.bookmarkGroups.nextUrl) {
d.remove()
}
a.calculateHeights();
a.reinitialiseScrollPane();
a.bookmarkGroups.nextPage()
},
getGroupById: function (a) {
var b = this;
var c = _.filter(b.bookmarkGroups.models,
function (d) {
return d.get("id") == a
});
return c[0]
},
createNewGroupSidebar: function (d) {
d.preventDefault();
var a = this;
var e = new ap.UserBookmarkGroup();
this.bookmarkGroups.add(e);
var c = $(d.currentTarget).parent();
var b = c.find(".spinner");
if (!b.size() > 0) {
c.append('<span class="spinner"></span>')
} else {
b.fadeIn("fast")
}
e.save({
is_public: false
}, {
success: function (j, f) {
a.applyTpl(j);
c.find(".spinner").fadeOut("fast")
},
error: function (j, f) {
ap.log("bookmark group creation error");
c.find(".spinner").fadeOut("fast")
}
})
},
applyTpl: function (f) {
var b = this,
c = this.getTpl("#sidebar_new_bookmark_group-template"),
d = this.getTpl("#sidebar_edit_bookmark_group-template");
var e = $(c({
bookmark_group: f.attributes
}));
$("ul.collections li.unassigned").after(e);
$(b.el).find("li").removeClass("selected");
e.addClass("selected").find('input[type="radio"]').attr("checked", true);
if (!$(".edit-prompt").length) {
$(".bookmark-collections").append(d({
bookmarkDashboardUrl: $("#my-galleries-toplink").attr("href")
})).show()
}
var a = new ap.globals.InlineRename({
el: e,
model: f,
target_element: "span",
replace: "name",
target_default: TRANSLATIONS.untitled_set,
auto_edit: true,
replace_parent: true
});
a.addEditClass();
b.reinitialiseScrollPane()
},
createNewBookmark: function (e) {
ap.log("Saving");
e.preventDefault();
var c = this;
var d = $("form#add-bookmark input:checked").val();
var b = d != "" ? this.getGroupById(d) : false;
this.options.sidebar.closeSidebar();
var a = c.addBookmark(b)
},
addBookmark: function (b) {
var e = (app.microscope && app.microscope.microscope) ? app.microscope.microscope.GetState() : $(".add-to-collection-content").data("zoomState");
var d = {
artwork: ap.buildApiUrl(["artwork", $("body").data("artwork-id")], false, false, true),
part_x: e.x,
part_y: e.y,
part_zoom: e.z
};
if (b !== false) {
d.bookmark_group = b.get("resource_uri");
d.weight = 1024 * (b.get("list_length") + 1)
}
var c = $("#bookmark-comment").val();
if (c.match(/^[ \t]*$/) ? false : true) {
d.comment = c
}
var a = new ap.UserBookmark(d);
a.save({}, {
success: function (j, f) {
ap.log("saved!");
ap.trackAddToGallery({
aw_slug: $("body").data("artwork-slug"),
aw_id: $("body").data("artwork-id"),
source: "sidebar"
}, ap.getMuseumAnalyticsId());
if (b === false) {
ap.bookmarks.updateUnassignedCount(1)
}
$("#bookmark-comment").val("");
return a
},
error: function (j, f) {
ap.log("Could not save new bookmark");
return
},
noGet: true
})
},
calculateHeights: function () {
var b = $(this.el);
var c = b.find(".bookmarks-wrapper");
var a = b.find(".existing-groups-outer-wrapper");
a.hide();
var d = b.outerHeight(true) - c.outerHeight(true);
a.css({
height: d + "px"
});
a.show()
},
reinitialiseScrollPane: function () {
ap.log("Logging!");
this.calculateHeights();
this.jScrollPane.reinitialise()
},
setupJScrollPane: function () {
this.calculateHeights();
this.$scrollPane.pScrollPane();
this.jScrollPane = this.$scrollPane.data("jsp")
}
});
var g = !0,
h = null,
i = !1;
ap.e = function (b, d) {
this.u = 1 === (new Int8Array((new Int32Array([1])).buffer))[0];
this.h = new Uint8Array(8);
this.buffer = b;
this.f = d || 0;
this.length = this.buffer.byteLength - this.f;
if (0 > this.f || 0 > this.length || this.f + this.length > this.buffer.byteLength) {
throw Error("Illegal offset and/or length")
}
Object.defineProperties(this, {
buffer: {
value: this.buffer,
enumerable: i,
writable: i,
configurable: i
},
byteOffset: {
value: this.f,
enumerable: i,
writable: i,
configurable: i
},
byteLength: {
value: this.length,
enumerable: i,
writable: i,
configurable: i
},
m: {
value: new Uint8Array(this.buffer, this.f, this.length),
enumerable: i,
writable: i,
configurable: i
}
});
return this
};
ap.e.prototype.get = function (j, m, l, f, k) {
if (void 0 === f) {
throw Error("Missing required offset argument")
}
if (0 > f || f + l > j.byteLength) {
throw Error("Invalid index: " + f)
}
if (1 === l || !! k === this.u) {
if (0 === (j.byteOffset + f) % l) {
return (new m(j.buffer, j.byteOffset + f, 1))[0]
}
for (k = 0; k < l; k++) {
this.h[k] = j.m[f + k]
}
return (new m(this.h.buffer))[0]
}
for (k = 0; k < l; k++) {
this.h[l - k - 1] = j.m[f + k]
}
return (new m(this.h.buffer))[0]
};
ap.e.prototype.getUint8 = function (b) {
return this.get(this, Uint8Array, 1, b, h)
};
ap.e.prototype.getUint16 = function (b, d) {
return this.get(this, Uint16Array, 2, b, d)
};
ap.e.prototype.getFloat32 = function (b, d) {
return this.get(this, Float32Array, 4, b, d)
};
ap.l = function (b, d) {
this.r = b / (2 * Math.PI);
this.s = 1 / this.r;
this.z = d / Math.PI;
this.A = 1 / this.z;
this.g = {};
return this
};
ap.l.prototype.i = function (k, o) {
var n = (o + 0.5) * this.A,
j = Math.sin(n),
n = Math.cos(n),
m = 1.5 * Math.PI - k * this.s,
l = Math.sin(m);
this.g.x = j * Math.cos(m);
this.g.y = j * l;
this.g.B = n;
return this.g
};
ap.b = function () {
this.d = this.c = 0;
this.k = this.a = this.j = h;
return this
};
ap.b.C = 256;
ap.b.prototype.w = function (u) {
u = new ap.e(u.buffer, 0);
if (8 != u.getUint8(0)) {
return i
}
var s = u.getUint16(1, g),
r = u.getUint16(3, g),
t = u.getUint16(5, g);
if (this.c != r || this.d != t) {
this.c = r, this.d = t, this.j = new Uint8Array(r * t), this.k = new ap.l(r, t)
}
if ((this.a ? this.a.length / 4 : 0) != s) {
this.a = 0 < s ? new Float32Array(4 * s) : h
}
var q = u.getUint8(7);
if (8 != q) {
return i
}
for (var p = this.c * this.d, r = 0, t = q; r < p; ++r, ++t) {
this.j[r] = u.getUint8(t)
}
r = 0;
for (t = q + p; r < s; r++) {
var q = u.getFloat32(t, g),
t = t + 4,
o = u.getFloat32(t, g),
t = t + 4,
n = u.getFloat32(t, g),
t = t + 4,
m = u.getFloat32(t, g),
t = t + 4;
p = r;
if (!(p >= (this.a ? this.a.length / 4 : 0))) {
p *= 4, this.a[p++] = q, this.a[p++] = o, this.a[p++] = n, this.a[p++] = m
}
}
return g
};
ap.b.prototype.n = function (b, f, e) {
b = Math.floor(b + 0.5);
f = Math.floor(f + 0.5);
b >= this.c ? b -= this.c : 0 > b && (b += this.c);
f >= this.d ? f -= this.d : 0 > f && (f += this.d);
e && (e[0] = b, e[1] = f);
return this.j[f * this.c + b]
};
ap.b.prototype.p = function (l, q, p) {
var k = this.n(l, q, h);
if (0 == k) {
return 0
}
var k = 4 * k,
o = this.a[k++],
n = this.a[k++],
m = this.a[k++],
k = this.a[k++];
p && (p[0] = o, p[1] = n, p[2] = m);
l = this.k.i(l, q);
return k / (l.x * o + l.y * n + l.B * m)
};
ap.b.prototype.i = function (b, d) {
return this.k.i(b, d)
};
ap.b.D = function () {
for (var f = new Uint8Array(768), k = 0, j = 0; 256 > j; j++) {
var e = j / 255,
e = ap.b.t(0 * (1 - e) + 240 * e);
f[k++] = e.v;
f[k++] = e.q;
f[k++] = e.o
}
return f
};
ap.b.t = function (k) {
var o = k / 60,
k = Math.floor(o),
n = o - k,
o = 1 * (1 - 1 * n),
n = 1 * (1 - 1 * (1 - n)),
j, m, l;
switch (k % 6) {
case 0:
j = 1;
m = n;
l = 0;
break;
case 1:
j = o;
m = 1;
l = 0;
break;
case 2:
j = 0;
m = 1;
l = n;
break;
case 3:
j = 0;
m = o;
l = 1;
break;
case 4:
j = n;
m = 0;
l = 1;
break;
case 5:
j = 1, m = 0, l = o
}
return {
v: Math.round(255 * j),
q: Math.round(255 * m),
o: Math.round(255 * l)
}
};
ap.DepthMap = ap.b;
ap.DepthMap.prototype.computeDepthAndNormal = ap.DepthMap.prototype.p;
ap.DepthMap.prototype.readBinaryData = ap.DepthMap.prototype.w;
ap.DepthMap.prototype.getPlaneIndex = ap.DepthMap.prototype.n;
ap.namespace("ap.streetview").Annotation = Backbone.View.extend({
template: '<a id="<%=iconId%>" href="<%=url%>" title="<%=title%>" class="<%=className%>"><span></span><%=title%></a>',
events: {
click: "trackClickEvent"
},
relativePosition: {},
distance: 0,
shape: null,
initialize: function () {
_.bindAll(this, "render", "trackClickEvent", "isVisible", "setSizeAndLocation");
this.panoid = this.options.pano;
this.level = this.options.level;
this.lat = this.options.lat;
this.lng = this.options.lng;
this.elevation = this.options.height - 2.1435;
this.direction = this.options.dir;
this.artwork_id = this.options.artwork_id;
this.url = ap.getLocaleUrl(this.options.url) + "#ref=annotation";
this.title = this.options.title;
this.iconId = this.id = "infoPoint_" + this.options.id;
this.className = "point" + (this.options.gigaPixel ? " giga" : "");
return this
},
withinRoom: function () {
if (this.level != app.streetview.currentLevel) {
return false
}
var a = app.streetview.floorPlan.roomLookup[this.panoid];
if (a && a == app.streetview.floorPlan.currentRoom()) {
return true
} else {
return false
}
},
withinDistance: function () {
if (this.distance > 15) {
return false
}
var a = app.streetview.calculateDepth(this.relativePosition.yaw, this.relativePosition.pitch);
if (a == 0) {
return true
}
if (this.distance < a + 0.3) {
return true
} else {
return false
}
},
withinAngle: function () {
if (this.direction == 0) {
return true
}
var a = this.relativePosition.yaw - this.direction;
while (a < -180) {
a += 360
}
while (a > 180) {
a -= 360
}
if (Math.abs(a) < 80) {
return true
} else {
return false
}
},
isVisible: function () {
return this.withinRoom() && this.withinAngle() && this.withinDistance()
},
setSizeAndLocation: function () {
var a = app.streetview.pano.getScreenPoint(this.relativePosition);
var b = 16 - Math.ceil(this.distance);
if (!a) {
a = {
x: 0,
y: 0
};
b = 0
}
this.el.css({
left: a.x,
top: a.y,
width: b,
height: b
}).stop().show();
this.el.find("span").css({
width: b,
height: b
})
},
hide: function (a) {
if (_.isUndefined(a)) {
a = false
}
if (a) {
this.el.stop().fadeOut("slow")
} else {
this.el.stop().hide()
}
},
show: function (a) {
if (_.isUndefined(a)) {
a = false
}
if (a) {
this.el.stop().fadeIn("slow")
} else {
this.el.stop().show()
}
},
setRelativePosition: function (a) {
this.distance = ap.geo_distance(this.lat, this.lng, a.lat(), a.lng());
this.relativePosition = {
yaw: ap.geo_bearing(this.lat, this.lng, a.lat(), a.lng()) - 180,
pitch: -Math.atan2(this.elevation, this.distance) * (180 / Math.PI)
}
},
trackClickEvent: function (a) {
var b = this;
a.preventDefault();
window.app.streetview.updateCookies(function () {
setTimeout('document.location = "' + b.url + '"', 200)
})
},
render: function () {
var a = {
iconId: this.iconId,
url: this.url,
title: this.title,
className: this.className
};
this.el = $(_.template(this.template, a));
this.el.click(this.trackClickEvent);
return this
}
});
ap.namespace("ap.streetview").FloorPlan = Backbone.View.extend({
el: $("#sidebar .floorplan-content"),
events: {
"click a.level": "changeLevel"
},
title: null,
map: null,
mapContainer: $("#floorplan"),
mapsLoaded: false,
mapOptions: {
zoom: 20,
mapTypeId: "roadmap",
mapTypeControl: false,
streetViewControl: false,
panControl: false,
disableDoubleClickZoom: true,
styles: [{
stylers: [{
lightness: -100
}, {
hue: "#000000"
}]
}]
},
roomStates: {
normal: {
fillColor: "#2f2f2f"
},
interactive: {
fillColor: "#666"
},
selected: {
fillColor: "#ebb52d"
},
hover: {
fillColor: "#c6a34f"
}
},
polygonOptions: {
strokeColor: "#000",
strokeOpacity: 0.8,
strokeWeight: 1,
fillColor: "#2f2f2f",
fillOpacity: 1,
},
circleOptions: {
fillColor: "#ebb52d",
fillOpacity: 1,
strokeColor: "#ebb52d",
strokeWeight: 1,
radius: 3
},
pointsUrlBase: "/levels/%s/panoramas.json",
floorplanUrlBase: "/levels/%s/floorplan.json",
levels: {},
rooms: [],
allRooms: [],
coordinates: [],
currentSelectedRoom: null,
latLngArray: [],
rendered: false,
alwaysFitToBounds: true,
currentKml: null,
currentRef: null,
currentPointCircle: null,
currentPointMarker: null,
usePositionCircle: false,
usePositionMarker: true,
roomsCleared: false,
firstTime: true,
comingFromLevelButton: false,
roomLookup: {},
initialize: function () {
_.bindAll(this, "render", "loadKML", "parseKML", "changeLevel", "levelChanged", "drawShape", "loadPoints", "loadFloorPlan", "checkBounds");
this.streetview = this.options.streetview;
this.title = $(this.el).find("h2").eq(0);
window.ap.events.bind("pano:changed", this.panoChanged, this);
window.ap.events.bind("pano:levelChanged", this.levelChanged, this)
},
getFloorplanUrl: function () {
return this.floorplanUrlBase.replace("%s", this.currentRef)
},
getPointsUrl: function () {
return this.pointsUrlBase.replace("%s", this.currentRef)
},
drawShape: function (f) {
var b = this;
var e = [];
var j, d, c;
_.each(f,
function (k) {
j = k[1];
d = k[0];
c = new google.maps.LatLng(j, d);
e.push(c);
b.activeLevel.latLngArray.push(c)
});
var a = new google.maps.Polygon(b.polygonOptions);
a.setOptions({
paths: e,
zIndex: 4
});
a.setMap(b.map);
return a
},
createMap: function () {
var a = this;
a.map = new google.maps.Map(a.mapContainer.get(0), a.mapOptions);
google.maps.event.addListener(a.map, "dragend", a.checkBounds)
},
checkBounds: function () {
if (!this.shapeBounds.contains(this.map.getCenter())) {
if (this.usePositionCircle) {
this.map.setCenter(this.currentPointCircle.getCenter())
} else {
if (this.usePositionMarker) {
this.map.setCenter(this.currentPointMarker.getPosition())
} else {
this.map.setCenter(this.shapeBounds.getCenter())
}
}
}
},
levelChanged: function (a) {
ap.log("levelChanged");
this.currentRef = a.currentLevel;
$(this.el).find("a.level.active").removeClass("active");
var b = $("#level" + this.currentRef);
b.addClass("active");
if (!this.comingFromLevelButton) {
this.title.addClass("loading")
}
this.comingFromLevelButton = false;
this.render()
},
changeLevel: function (a) {
ap.log("changeLevel");
var b = this;
if (b.rendered) {
b.title.addClass("loading");
b.comingFromLevelButton = true;
b.rendered = false;
b.roomsCleared = false;
var c = $(a.currentTarget);
b.currentRef = c.data("level-id");
$(b.el).find("a.level.active").removeClass("active");
c.addClass("active");
b.streetview.moveToPano(c.data("pano-id"));
b.loadKML()
} else {
ap.log("Can't change, I'm busy!")
}
return false
},
getMarkerImage: function (a, b, c) {
if (_.isUndefined(c)) {
c = 0
}
return new google.maps.MarkerImage(a, new google.maps.Size(b, b), new google.maps.Point(b * c, 0), new google.maps.Point((b - 1) / 2, (b - 1) / 2))
},
angleToOffset: function (d, c) {
if (_.isUndefined(c)) {
c = 5
}
var a = 360 / c;
var b = Math.round(d / c) % a;
return b
},
createMarker: function (a, d) {
var c = this.getMarkerImage("/skip_media_generator/radar_sprite.png", 57, this.angleToOffset(d) + 1);
var b = new google.maps.Marker({
position: new google.maps.LatLng(a.lat(), a.lng()),
icon: c,
clickable: true,
zIndex: 5
});
return b
},
position Circle: function (b) {
var a = this;
if (a.currentPointCircle) {
a.currentPointCircle.setMap(null)
}
a.currentPointCircle = new google.maps.Circle(a.circleOptions);
a.currentPointCircle.setMap(a.map);
a.currentPointCircle.setCenter(b)
},
positionMarker: function (c, d) {
var a = this;
if (a.currentPointMarker) {
var b = a.getMarkerImage("/skip_media_generator/radar_sprite.png", 57, this.angleToOffset(d));
a.currentPointMarker.setIcon(b)
} else {
a.currentPointMarker = this.createMarker(c, d)
}
if (!a.currentPointMarker.map) {
a.currentPointMarker.setMap(a.map)
}
a.currentPointMarker.setPosition(c)
},
panoChanged: function () {
var b = this;
if (!b.map) {
return
}
var c = b.currentLatLng();
if (b.usePositionCircle) {
b.positionCircle(c)
} else {
if (b.usePositionMarker) {
b.positionMarker(c, b.streetview.pano.getPOV().yaw)
} else {
var a = false;
_.each(b.activeLevel.interactiveRooms,
function (e, d) {
var f = e.SignedDistanceTo(c);
if (f < 0.1) {
a = true;
b.changeRoom(e);
return false
}
})
}
}
},
changeRoom: function (b) {
var a = this;
if (!a.usePositionCircle && !a.usePositionMarker) {
if (a.currentSelectedRoom && a.currentSelectedRoom !== b) {
a.dehighlightRoom(a.currentSelectedRoom, true);
a.currentSelectedRoom.selected = false
}
b.setOptions(a.roomStates.selected);
b.selected = true;
a.currentSelectedRoom = b
}
},
currentRoom: function () {
return this.roomLookup[app.streetview.currentPano]
},
clickRoom: function (c) {
var b = this;
var a = {};
var d = null;
$.each(b.activeLevel.points,
function (f, e) {
a[f] = c.SignedDistanceTo(new google.maps.LatLng(e.lat, e.lng));
if (!d || a[f] < a[d]) {
d = f
}
});
b.streetview.moveToPano(d)
},
highlightRoom: function (a, b) {
if (b || !a.selected) {
a.setOptions(this.roomStates.hover)
}
},
dehighlightRoom: function (b, a) {
if (a || !b.selected) {
if (b.interactive) {
b.setOptions(this.roomStates.interactive)
} else {
b.setOptions(this.roomStates.normal)
}
}
},
clearRooms: function () {
var a = this;
if (a.currentPointCircle) {
a.currentPointCircle.setMap(null)
}
if (a.activeLevel) {
$.each(a.activeLevel.rooms,
function (b, c) {
c.setMap(null);
google.maps.event.clearListeners(c, "click");
google.maps.event.clearListeners(c, "mouseover");
google.maps.event.clearListeners(c, "mouseout")
});
a.roomsCleared = true
}
},
createNewLevel: function (a) {
return {
levelId: a,
rooms: [],
interactiveRooms: [],
points: null,
latLngArray: [],
floorPlan: [],
coordinates: []
}
},
loadFloorPlan: function () {
var a = this;
$.ajax({
url: a.getFloorplanUrl(),
success: function (b) {
a.activeLevel.floorPlan = b;
a.parseKML()
}
})
},
loadPoints: function () {
var a = this;
$.ajax({
url: a.getPointsUrl(),
dataType: "json",
success: function (b) {
a.activeLevel.points = b;
a.loadFloorPlan()
}
})
},
loadKML: function () {
var a = this;
app.streetview.floorplanReady = false;
a.clearRooms();
if (!a.currentRef) {
a.currentRef = a.streetview.currentLevel
}
if (_.isUndefined(a.levels[a.currentRef])) {
a.levels[a.currentRef] = a.createNewLevel(a.currentRef)
}
a.activeLevel = a.levels[a.currentRef];
if (!a.activeLevel.points) {
a.loadPoints()
} else {
a.parseKML()
}
},
currentLatLng: function () {
var a = this.activeLevel.points[app.streetview.currentPano];
return new google.maps.LatLng(a.lat, a.lng)
},
parseKML: function () {
var a = this;
if (!a.map) {
a.createMap()
}
if (!a.activeLevel) {
return
}
a.shapeBounds = null;
if (a.activeLevel.coordinates.length) {
ap.log("skipping parse")
} else {
$.each(a.activeLevel.floorPlan,
function (b, c) {
if (c.length > 0) {
a.activeLevel.coordinates.push(c)
}
})
}
if (a.activeLevel.rooms.length) {
ap.log("skipping room generation");
_.each(a.activeLevel.rooms,
function (b) {
b.setOptions(a.roomStates.normal);
b.setMap(a.map);
if (b.interactive) {
b.setOptions(a.roomStates.interactive);
google.maps.event.addListener(b, "mouseover",
function () {
a.highlightRoom(b)
});
google.maps.event.addListener(b, "mouseout",
function () {
a.dehighlightRoom(b)
});
google.maps.event.addListener(b, "click",
function () {
a.clickRoom(b)
})
}
})
} else {
_.each(a.activeLevel.coordinates,
function (c, b) {
var d = a.drawShape(c);
d.setOptions(a.roomStates.normal);
a.activeLevel.rooms.push(d);
if (a.checkInteractivity(d)) {
a.activeLevel.interactiveRooms.push(d);
d.setOptions(a.roomStates.interactive);
d.interactive = true;
google.maps.event.addListener(d, "mouseover",
function () {
a.highlightRoom(d)
});
google.maps.event.addListener(d, "mouseout",
function () {
a.dehighlightRoom(d)
});
google.maps.event.addListener(d, "click",
function () {
a.clickRoom(d)
})
}
})
}
a.panoChanged();
if (a.alwaysFitToBounds) {
a.fitToView()
}
a.rendered = true;
a.title.removeClass("loading");
app.streetview.floorplanReady = true;
app.streetview.loadAnnotations()
},
checkInteractivity: function (c) {
var b = this;
var a = false;
if (this.activeLevel.points) {
c.points = [];
$.each(this.activeLevel.points,
function (e, d) {
var f = new google.maps.LatLng(d.lat, d.lng);
if (c.getPath()) {
if (c.SignedDistanceTo(f) < 0.1) {
c.points.push(f);
b.roomLookup[e] = c;
a = true
}
}
})
}
return a
},
fitToView: function () {
var a = this;
a.shapeBounds = new google.maps.LatLngBounds();
_.each(a.activeLevel.latLngArray,
function (b, c) {
a.shapeBounds.extend(b)
});
a.map.fitBounds(a.shapeBounds);
a.map.setCenter(a.shapeBounds.getCenter())
},
loadMapsAPI: function () {
callbackName = "app.streetview.floorPlan.mapsLoadCallback";
if (_.isUndefined(window.google.maps) || _.isUndefined(window.google.maps.Geocoder)) {
var b = ap.getMapsApiKey();
var a = "//maps.googleapis.com/maps/api/js?key=" + b + "&sensor=false&callback=" + callbackName;
$('<script src="' + a + '">').appendTo($("body"))
} else {
this.mapsLoadCallback()
}
},
mapsLoadCallback: function () {
var a = this;
$.ajax({
url: "/skip_media_generator/google.maps.Polygon.js",
dataType: "script",
cache: true,
success: function () {
a.mapsLoaded = true;
a.render()
}
})
},
render: function () {
var a = this;
if (this.mapsLoaded) {
if (this.streetview.currentLevel) {
if (!this.activeLevel || this.streetview.currentLevel != this.activeLevel.levelId) {
this.loadKML()
}
} else {
ap.log("streetview.currentLevel does NOT exists");
if (ap.debugMode) {
this.loadKML()
}
}
} else {
this.loadMapsAPI()
}
}
});
ap.namespace("ap.streetview").MainView = Backbone.View.extend({
el: $("#streetview"),
events: {
mousemove: "setAnnotationFadeoutTimer",
keypress: "setAnnotationFadeoutTimer",
"click .navigate_floorplan": "toggleSidebar"
},
addNavigateFloorplanButtonTemplate: '<a href="#" class="navigate_floorplan"><%=TRANSLATIONS.close_floorplan%></a>',
initialized: false,
readyToLoad: false,
room: null,
annotationsById: {},
annotations: [],
visibleAnnotations: [],
panoramaOptions: {
povUpdateFreq: 0.2,
features: {
streetView: true,
userPhotos: false
},
enableFullScreen: false
},
POV: {
yaw: 0,
pitch: 0,
},
depthMap: null,
floorPlan: null,
updateTimer: null,
updateDelay: 400,
annotationFadeoutTimer: null,
annotationFadeoutDelay: 1000,
disableAnnotationFadeout: false,
currentUrl: null,
locationData: null,
initialize: function () {
_.bindAll(this, "render", "changedPano", "updateStreetview", "updateCookies", "streetviewUpdated", "setAnnotationFadeoutTimer", "toggleSidebar");
this.sidebar = this.options.sidebar;
this.floorPlan = new ap.streetview.FloorPlan({
streetview: this
});
if (this.options.encodedLocation) {
this.locationData = $.base64.decode(this.options.encodedLocation).split("|")
}
return this
},
createResponseForPanoId: function (a) {
return {
code: GStreetviewClient.ReturnValues.SUCCESS,
Location: {
panoId: a
}
}
},
handleNoFlash: function (a) {
if (a == FLASH_UNAVAILABLE) {
return
}
},
calculateDepth: function (e, d) {
var a = this;
e += 180 - a.offset;
while (e < 0) {
e += 360
}
while (e >= 360) {
e -= 360
}
d *= -1;
d += 90;
var c = 512 * e / 360;
var b = 256 * d / 180;
return a.depthMap.computeDepthAndNormal(c, b)
},
constructDepthPolygon: function () {
var m = this;
var a = [];
var j = m.currentLatLng.lat() * Math.PI / 180;
var k = m.currentLatLng.lng() * Math.PI / 180;
for (i = 0; i < 360; i++) {
var b = m.calculateDepth(i, 0);
if (b == 0) {
b = m.calculateDepth(i, - 5)
}
if (b == 0) {
b = m.calculateDepth(i, 5)
}
if (b == 0) {
b = 15
}
var c = b / 6371000;
var l = i * Math.PI / 180;
var e = Math.asin(Math.sin(j) * Math.cos(c) + Math.cos(j) * Math.sin(c) * Math.cos(l));
var f = k + Math.atan2(Math.sin(l) * Math.sin(c) * Math.cos(j), Math.cos(c) - Math.sin(j) * Math.sin(e));
a.push(new google.maps.LatLng(e * 180 / Math.PI, f * 180 / Math.PI))
}
if (!m.depthShape) {
m.depthShape = new google.maps.Polygon({
strokeColor: "#F00",
strokeOpacity: 0.8,
strokeWeight: 1,
fillColor: "#FF0000",
fillOpacity: 0.5,
zIndex: 1001
})
}
m.depthShape.setPath(a);
m.depthShape.setMap(m.floorPlan.map)
},
changedPano: function (f) {
var l = this;
l.readyToLoad = false;
l.depthmapReady = false;
l.currentPano = f.panoId;
l.currentLatLng = new GLatLng(f.lat, f.lng);
l.hideVisibleAnnotations();
l.visibleAnnotations = [];
if (!l.initialized && !l.fromCookies) {
var d = l.el.data("yaw");
var a = l.el.data("pitch");
var e = l.el.data("zoom");
if (d || a || e) {
l.POV = {
yaw: parseFloat(d),
pitch: parseFloat(a),
zoom: parseFloat(e)
}
} else {
var j = l.el.data("lat") || 0;
var k = l.el.data("lng") || 0;
var b = l.el.data("height") || 2.1435;
b -= 2.1435;
var c = ap.geo_distance(j, k, l.currentLatLng.lat(), l.currentLatLng.lng());
l.POV = {
yaw: ap.geo_bearing(j, k, l.currentLatLng.lat(), l.currentLatLng.lng()) - 180,
pitch: -Math.atan2(b, c) * (180 / Math.PI)
}
}
l.pano.setPOV(l.POV);
l.initialized = true;
window.ap.events.trigger("pano:init", l)
}
$.getJSON("/pano/?panoid=" + l.currentPano).success(function (p, n, o) {
var m = o.getResponseHeader("Level");
if (m && m != l.currentLevel) {
l.currentLevel = m;
window.ap.events.trigger("pano:levelChanged", l)
} else {
window.ap.events.trigger("pano:changed", l)
}
if (!p || p.length < 10) {
return
}
l.offset = o.getResponseHeader("Offset") || 0;
var q = new Uint8Array(p);
l.depthMap.readBinaryData(q);
l.depthmapReady = true;
l.loadAnnotations()
});
l.updateStreetview()
},
loadAnnotations: function () {
var b = this;
if (!b.depthmapReady || !b.floorplanReady) {
return
}
if (ap.streetview_annotations) {
var c;
$.each(ap.streetview_annotations,
function (f, e) {
c = b.annotationsById[e.id];
if (_.isUndefined(c)) {
c = new ap.streetview.Annotation(e);
c.render();
b.el.append(c.el);
b.annotationsById[e.id] = c;
b.annotations.push(c)
}
c.setRelativePosition(b.currentLatLng)
});
var b = this;
var d = ["artwork", "set"];
var a = [];
$.each(b.annotations,
function (f, e) {
if (e.isVisible()) {
b.visibleAnnotations.push(e);
a.push(e.artwork_id)
}
});
if (b.visibleAnnotations.length) {
d.push(a.join(";"));
apiUrl = ap.buildApiUrl(d);
b.updateThumbnailStrip(apiUrl)
}
} else {
ap.log("No annotation data")
}
b.readyToLoad = true;
b.updateStreetview()
},
updateThumbnailStrip: function (b) {
var a = new ap.ArtworkList(null, {
url: b
});
if (!this.thumbnailStrip) {
this.thumbnailStrip = new ap.thumbnailstrip.layout.Main({
id: "museumview-thumbnail-strip",
container: this.el,
parentView: this,
settings: {
showPivots: false,
collectionToUse: a
}
})
} else {
if (this.thumbnailStrip.artworkList.url != b) {
this.thumbnailStrip.el.trigger("artworkListChange", [a]);
this.thumbnailStrip.processManager.reset();
this.thumbnailStrip.processManager.start();
this.thumbnailStrip.artworkList.fetch()
} else {
ap.log("Thumbnailstrip: No need to fetch. Collection urls are the same.")
}
}
},
hideVisibleAnnotations: function (b) {
var a = this;
if (_.isUndefined(b)) {
b = false
}
$.each(a.visibleAnnotations,
function (d, c) {
c.hide(b)
})
},
showHiddenVisibleAnnotations: function () {
var a = this;
$.each(a.visibleAnnotations,
function (c, b) {
b.show(true)
})
},
updateStreetview: function () {
var a = this;
a.pano.checkResize();
if (a.readyToLoad) {
_.each(a.visibleAnnotations,
function (b) {
b.setSizeAndLocation()
})
}
a.disableAnnotationFadeout = false;
a.setAnnotationFadeoutTimer()
},
updateCookies: function (e) {
var a = this;
var c = a.pano.getPOV();
var b = [];
b.push(a.currentPano);
b.push(c.zoom);
b.push(c.yaw);
b.push(c.pitch);
var d = $.base64.encode(b.join("|"));
ap.log(a.currentUrl + d);
a.sidebar.parentView.router.navigate(a.currentUrl + d, false);
if (e) {
e()
}
},
streetviewUpdated: function () {
var a = this;
if (a.updateTimer) {
clearTimeout(a.updateTimer);
a.hideVisibleAnnotations()
}
if (a.annotationFadeoutTimer) {
clearTimeout(a.annotationFadeoutTimer)
}
a.disableAnnotationFadeout = true;
a.updateTimer = setTimeout(a.updateStreetview, a.updateDelay);
if (a.floorPlan.usePositionMarker) {
a.floorPlan.positionMarker(a.pano.getLatLng(), a.pano.getPOV().yaw)
}
},
setAnnotationFadeoutTimer: function () {
var a = this;
if (a.annotationFadeoutTimer) {
clearTimeout(a.annotationFadeoutTimer);
if (!a.disableAnnotationFadeout) {
a.showHiddenVisibleAnnotations()
}
}
if (!a.disableAnnotationFadeout) {
a.annotationFadeoutTimer = setTimeout(function () {
if (!a.disableAnnotationFadeout) {
a.hideVisibleAnnotations(true)
}
}, a.annotationFadeoutDelay)
}
},
moveToPano: function (c, b) {
var a = this;
if (a.pano) {
a.currentPano = c;
a.pano.show();
a.pano.setLocationAndPOVFromServerResponse(a.createResponseForPanoId(c), b || a.POV);
return a
}
},
show: function () {
var a = this;
a.el && a.el.show().addClass("active")
},
hide: function () {
var a = this;
a.el && a.el.hide().removeClass("active")
},
addNavigateFloorplanButton: function () {
this.el.append(_.template(this.addNavigateFloorplanButtonTemplate));
this.navigateFloorplanButton = $(".navigate_floorplan").eq(0)
},
toggleSidebar: function (a) {
if (this.navigateFloorplanButton.text() == TRANSLATIONS.close_floorplan) {
this.navigateFloorplanButton.text(TRANSLATIONS.navigate_floorplan)
} else {
this.navigateFloorplanButton.text(TRANSLATIONS.close_floorplan)
}
app.sidebar.toggleSidebar()
},
render: function () {
var a = this;
a.currentUrl = window.location.pathname.replace("/", "");
a.currentPano = (typeof a.currentPano === "undefined" || a.currentPano === "undefined") ? a.el.data("panoid") : a.currentPano;
a.depthMap = new ap.DepthMap();
a.initialized = false;
a.pano = new GStreetviewPanorama(a.el.get(0), a.panoramaOptions);
GEvent.addListener(a.pano, "error", a.handleNoFlash);
GEvent.addListener(a.pano, "initialized", a.changedPano);
GEvent.addListener(a.pano, "yawchanged", a.streetviewUpdated);
GEvent.addListener(a.pano, "pitchchanged", a.streetviewUpdated);
GEvent.addListener(a.pano, "zoomchanged", a.streetviewUpdated);
if (a.locationData) {
a.currentPano = a.locationData[0];
a.POV = {
zoom: a.locationData[1],
yaw: a.locationData[2],
pitch: a.locationData[3]
};
a.fromCookies = true;
a.initialized = true;
a.currentUrl = a.currentUrl.replace(this.options.encodedLocation, "")
}
a.pano.setLocationAndPOVFromServerResponse(a.createResponseForPanoId(a.currentPano), a.POV);
$(document.body).bind("streetview:move",
function (c, b) {
a.streetviewUpdated();
a.moveToPano(b.panoId, b.pov)
});
$(document.body).bind("layout:changed", a.updateStreetview);
a.addNavigateFloorplanButton()
}
});
ap.globals.Discover = Backbone.View.extend({
filter_sets: $(".filter-sets"),
discover_content: $(".discover-content"),
isAnimating: false,
sidebar: null,
scrollables: [],
el: $(".sb-content.discover-content"),
bladeEls: null,
alphabet: ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"],
blades: ["collection", "artist"],
bladeCollections: {
collection: new ap.CollectionBlade(),
artist: new ap.ArtistBlade()
},
current_blade_requests: {
collection: null,
artist: null
},
current_blade_selection: {
collection: null,
artist: null
},
offsetLoading: {
collection: false,
artist: false
},
limit_increment: 30,
date_filter_white_list: [8, 9, 13, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 109, 189],
whiteListedKeys: [8, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90],
unwanted_params: ["open", "filter"],
retried: 0,
retries: 5,
total_range: {
from: -500000,
to: 2012
},
default_params: {
limit: 60,
artist_limit: 60,
offset: 0
},
offsets: {
collection: "collection_offset",
artist: "artist_offset"
},
alphabet_queries: {
collection: "name__firstletter",
artist: "last_name__firstletter"
},
breadcrumbs: {
collection: null,
artist: null,
date: null
},
blade_request: null,
alphabet_request: null,
aggregation_test: null,
search_request: null,
search_interval: null,
events: {
"click li.blade.closed": "toggle_blades",
"click li.blade.open .heading": "handle_close_blade",
"click .remove-percent-filtered": "remove_filter",
"click .filtered-list li a": "update_filter",
"click .filtered-list li span.show-decades": "toggle_decades",
"click .button": "date_filter",
"click .all-dates": "show_all_dates",
"click .ad-bc": "ad_bc",
"keypress .control-set.from input": "detect_dates",
"keypress .control-set.to input": "detect_dates",
"click .alphabet-filter li a": "alphabet_query",
"click .alphabet-filter li.reset a.all": "alphabet_query",
"jsp-arrow-change .blade .scroll-pane": "offset_load",
"focus .blade input.blade-filter": "text_search",
"blur .blade input.blade-filter": "cancel_search_interval",
"submit .blade form.input-filter": "cancel_submit"
},
templates: {
filter_set: '<ul class="filtered-list"></ul>',
percent_filter: '<div class="percent-filtered"></div>',
remove_button: '<a class="remove-percent-filtered" title="Remove" href="#"><span>Remove</span></a>'
},
initialize: function () {
var a = this;
_.bindAll(this, "set_blade_data", "get_blade_data", "render", "remove_filter", "onContentAreaResized");
a.initial_data();
a.sidebar = a.options.sidebar;
return a
},
render: function () {
var b = this,
a = ap.getCurrentArtworkCollectionState();
b.breadcrumb_holder = $(".collection-mutators");
b.breadcrumb_holder.on("click", ".clear-blade-filter", b.remove_filter);
b.bladeEls = b.el.find(".filter-sets > .blade");
b.bladeEls.each(function () {
$(this).append($(b.templates.remove_button).addClass("hide"))
});
_.each(a,
function (d, c) {
var e = c == "canonical_artist" ? "artist" : c;
_.each(b.bladeCollections,
function (f, j) {
if (f.getCollectionFilterType() === c) {
b.setFilter(e, d.value, d.text, true)
}
if (c === f.collectionUrlPart) {
b.bladeEls.filter("." + j).find(".remove-percent-filtered").removeClass("hide")
}
})
});
b.bind("contentAreaResized", b.onContentAreaResized);
b.initial_collapse();
$(".loader").addClass("hidden");
$(b.el).off("click", "li.blade.open .heading");
$(b.el).on("click", "li.blade.open .heading", false, "handle_close_blade");
_.each(b.blades,
function (c) {
b.updateBlade(c)
})
},
get_blade_data: function () {
var a = {
artist: null,
artist_offset: null,
collection: null,
collection_offset: null,
f: null,
filter: null,
latest_date__gte: null,
latest_date__lte: null,
open: null,
t: null
};
return JSON.parse(localStorage.getItem("blade")) || a
},
set_blade_data: function (c) {
var a = this,
b;
var d = a.get_blade_data("blade");
if (d !== null || d !== undefined) {
b = JSON.stringify($.extend(true, d, c))
} else {
b = JSON.stringify(c)
}
localStorage.setItem("blade", b)
},
initial_data: function () {
var a = this,
b = a.get_restrict_next_by();
if (!a.get_blade_data()) {
a.set_blade_data({
collection: null,
artist: null,
collection_offset: null,
artist_offset: null
})
} else {
if (a.get_blade_data().length <= 1) {
a.set_blade_data({
collection: null,
artist: null,
collection_offset: null,
artist_offset: null
})
} else {
if (!b) {
a.set_blade_data({
collection: null,
artist: null,
collection_offset: null,
artist_offset: null
})
}
}
}
},
get_current_offset: function (c) {
var b = this;
var a = $("." + c).find(".filtered-list li").length
},
set_restrict_next_by: function (b, a) {
var c = {};
c[b] = a;
this.set_blade_data({
restrict_next_by: c
})
},
get_restrict_next_by: function (b) {
var c = this.get_blade_data(),
a = c.restrict_next_by || false;
if (a && b) {
this.set_blade_data({
restrict_next_by: null
})
}
return a
},
updateBlade: function (f, c) {
var e = this,
b = e.bladeEls.filter("." + f),
j = e.bladeCollections[f],
a = b.find(".loader"),
d = b.find(".scroll-pane").data("jsp");
if (!c) {
b.find(".filtered-list").empty();
if (d) {
d.reinitialise()
}
j.resetCount()
}
if (!j.moreToLoad) {
return
}
a.removeClass("hidden").removeClass("error");
if (e.current_blade_requests[f] !== null) {
e.current_blade_requests[f].abort()
}
e.current_blade_requests[f] = j.fetch({
success: function (l, m) {
var k = b.find(".scroll-pane").data("jsp");
a.addClass("hidden"), e.offsetLoading[f] = false;
e.update_filtered_list(b, m.objects, f);
if (k) {
k.reinitialise();
if (b.hasClass("open") && !k.getIsScrollableV() && j.moreToLoad) {
e.updateBlade(f, true)
}
}
}
})
},
alphabet_query: function (k) {
k.preventDefault();
var b = this,
c = $(k.currentTarget),
f = $(k.currentTarget).parent("li");
if (f.hasClass("selected")) {
return
}
var j = c.parents(".blade"),
a = j.data("type"),
d = c.attr("class");
j.find(".alphabet-filter li").removeClass("selected");
j.find("input.blade-filter").val("");
f.addClass("selected");
if (c.hasClass("all")) {
b.bladeCollections[a].filterAlpha()
} else {
b.bladeCollections[a].filterAlpha(d)
}
b.updateBlade(a)
},
date_filter: function (d) {
var b = this;
var a = {
from: $("#from").val(),
to: $("#to").val()
};
$.each(a,
function (f, e) {
if (e === "") {
a[f] = b.total_range[f]
}
if (a[f].substr(0, 1) != "-") {
a[f] = parseInt(a[f], 10)
}
if ($("#" + f).siblings("a").hasClass("selected")) {
if (typeof (a[f]) == "string") {
if (a[f].substr(0, 1) != "-") {
a[f] = a[f] / -1
}
} else {
a[f] = a[f] / -1
}
}
});
b.date_validate(a);
var c = {
latest_date__gte: a.from,
latest_date__lte: a.to
};
b.set_blade_data(c);
b.aggregation_loader();
b.show_all_dates(false);
$.each($("a.century"),
function () {
var f, e;
f = parseInt($(this).data("date").from, 10);
e = parseInt($(this).data("date").to, 10);
if (f > a.to) {
$(this).parent("li").addClass("hidden")
}
if (e < a.from) {
$(this).parent("li").addClass("hidden")
}
if ($(this).is(":visible")) {
$.each($(this).parent("li").find(".decades li a"),
function () {
var k = parseInt($(this).data("date").from, 10);
var j = parseInt($(this).data("date").to, 10);
if (k > a.to) {
$(this).parent("li").addClass("hidden")
}
if (j < a.from) {
$(this).parent("li").addClass("hidden")
}
})
}
})
},
ad_bc: function (b) {
var a = $(b.currentTarget);
if (a.hasClass("selected")) {
a.text("AD");
a.removeClass("selected")
} else {
a.text("BC");
a.addClass("selected")
}
},
detect_dates: function (c) {
var b = this;
if ($.inArray(c.which, b.date_filter_white_list) != -1 && c.which != 13) {
var a = $(c.currentTarget).val();
if (a.substr(0, 1) == "-" || a == "-") {
$(c.currentTarget).siblings("a").addClass("selected").text("BC")
} else {
$(c.currentTarget).siblings("a").removeClass("selected").text("AD")
}
} else {
if (c.which == 13) {
if ($("#from").val() != "" || $("#to").val() != "") {
b.date_filter(c)
}
} else {
return false
}
}
},
validate_bc: function (a) {
if (a.val().substr(0, 1) == "-" || a.val() == "-") {
a.siblings("a").addClass("selected").text("BC")
} else {
a.siblings("a").removeClass("selected").text("AD")
}
if (parseInt(a.val(), 10) >= 0) {
a.siblings("a").removeClass("selected").text("AD")
}
},
show_all_dates: function (b) {
var a = this;
$(".centuries li").removeClass("hidden").find(".decades li").removeClass("hidden");
if (b == true) {
$("#from").val("");
$("#to").val("")
}
a.set_blade_data({
latest_date__gte: null,
latest_date__lte: null,
f: null,
t: null
});
a.attach_scrolling($(".blade.date"))
},
date_validate: function (d) {
var c = this;
if (d.from <= c.total_range.from && d.from >= c.total_range.from) {
d.from = c.total_range.from
}
if (d.to <= c.total_range.to && d.to >= c.total_range.to) {
d.to = c.total_range.to
}
if (parseInt(d.from, 10) > parseInt(d.to, 10)) {
$("#from").val(d.to);
$("#to").val(d.from);
var a = d.from;
var b = d.to;
d.from = b;
d.to = a
}
c.validate_bc($("#from"));
c.validate_bc($("#to"));
return d
},
hide_unmatched_dates: function (b, c) {
var a = this;
a.show_all_dates(true);
$.each(b.find(".filtered-list li a.century"),
function () {
var f = parseInt($(this).data("date").from, 10);
if ($.inArray(f, c.centuries) == -1) {
$(this).parent("li").addClass("hidden")
} else {
$(this).parent("li").removeClass("hidden");
var e = $(this).parent("li").find("ul.decades li a");
if (e.length > 0) {
var d = false;
$.each(e,
function (k, j) {
var l = parseInt($(j).data("date").from, 10);
if ($.inArray(l, c.decades) !== -1) {
d = true;
$(j).parent().removeClass("hidden")
} else {
$(j).parent().addClass("hidden")
}
});
if (d) {
$(this).parent("li").removeClass("hidden")
} else {
$(this).parent("li").addClass("hidden")
}
}
}
})
},
update_filtered_list: function (j, f, d, e) {
var a = this;
var c = 0;
if (e) {
j.find(".filtered-list").empty()
}
var b = j.find(".filtered-list");
if (d == "collection") {
$.each(f,
function (l, k) {
if (a.current_blade_selection.collection == k.id) {
j.find(".alphabet-filter li").removeClass("selected");
b.append('<li class="' + k.slug + '"><a class="filter-result-selected" type="' + d + '" href="/collection/' + k.slug + '" data-id="' + k.id + '">' + k.name + "</a></li>");
a.breadcrumbs.collection = k.name
} else {
b.append('<li class="' + k.slug + '"><a type="' + d + '" href="/collection/' + k.slug + '" data-id="' + k.id + '">' + k.name + "</a></li>")
}
})
} else {
if (d == "artist") {
$.each(f,
function (n, l) {
var m = "";
m = l.display_name;
var k = m ? ap.slugify(m) : "";
if (m) {
if (a.current_blade_selection.artist == l.id) {
j.find(".alphabet-filter li").removeClass("filter-select");
b.append('<li class="' + k + '"><a class="filter-result-selected" type="' + d + '" href="/artist/' + k + "/" + l.id + '" data-id="' + l.id + '">' + m + "</a></li>");
a.breadcrumbs.artist = m
} else {
b.append('<li class="' + k + '"><a type="' + d + '" href="/artist/' + k + "/" + l.id + '" data-id="' + l.id + '">' + m + "</a></li>")
}
}
})
}
}
a.render_breadcrumbs();
a.attach_scrolling(j);
a.get_current_offset(d)
},
render_breadcrumbs: function () {
var b = this;
var a = "";
$.each(b.breadcrumbs,
function (e, d) {
if (d != null) {
var c = ' <span class="blade blade-breadcrumb" data-type="' + e + '">' + d + ' <span class="remove clear-mutator clear-blade-filter"></span></span>';
a += c
}
});
b.breadcrumb_holder.children(".blade-breadcrumb").remove();
b.breadcrumb_holder.append(a)
},
offset_load: function (d, j, c, f, e) {
var b = this;
var a = $(d.currentTarget).parents(".blade").data("type");
if (a != "date") {
if (c == true && b.offsetLoading[a] == false) {
b.offsetLoading[a] = true;
b.updateBlade(a, true)
}
}
},
text_search: function (f) {
var b = this;
var d = $(f.currentTarget).val();
var c = $(f.currentTarget).parents(".blade");
var a = c.data("type");
b.search_interval = setInterval(function () {
if (d != $(f.currentTarget).val()) {
d = $(f.currentTarget).val();
if (d != "") {
c.find(".alphabet-filter li").removeClass("selected");
b.bladeCollections[a].filterText(d);
b.updateBlade(a)
} else {
b.bladeCollections[a].filterText();
b.updateBlade(a);
c.find(".alphabet-filter li a.all").parent("li").addClass("selected")
}
}
}, 100)
},
cancel_search_interval: function (c) {
var b = this;
var a = $(c.currentTarget).closest(".blade").data("type");
if (b.search_interval != null) {
clearInterval(b.search_interval)
}
},
cancel_submit: function (a) {
$(a.currentTarget).children("input.blade-filter").blur();
return false
},
update_filter: function (j) {
j.preventDefault();
var a = this;
var f = ["open", "filter", "f", "t", "offset", "limit"];
var d = {};
var b = $(j.currentTarget);
var c = b.parents(".blade.open");
var k = c.data("type");
var l = [];
if (b.hasClass("filter-result-selected")) {
if (b.hasClass("reset")) {
return
} else {
c.find(".remove-percent-filtered").addClass("hide");
return a.remove_filter(j)
}
}
c.find(".remove-percent-filtered").removeClass("hide");
c.find("a.filter-result-selected").removeClass("filter-result-selected");
b.addClass("filter-result-selected");
a.setFilter(k, b.data("id"), b.text());
a.aggregation_loader()
},
setFilter: function (d, c, e, f) {
var b = this,
a = [];
b.breadcrumbs[d] = e;
b.render_breadcrumbs();
b.current_blade_selection[d] = c;
$.each(b.blades,
function (k, j) {
var l = {};
if (j != d) {
b.bladeCollections[j].filterCollection(c);
l = b.bladeCollections[j].getCollectionFilter();
l.filterText = e;
a.push(l);
b.bladeEls.filter("." + j).find(".current-selection").addClass("show").children(".item").text(e);
b.updateBlade(j)
}
});
if (!f) {
ap.setCurrentArtworkCollectionState(a)
}
},
aggregation_loader: function () {
var b = this;
var e = $.extend({}, b.current_blade_selection);
var c = b.sidebar.parentView;
var a = c && c.currentCollection || false;
var d = a ? a : new ap.ArtworkList();
if (a && c.topFiltersView) {
c.topFiltersView.removeAllFilters(true)
}
if (e.hasOwnProperty("artist")) {
e.canonical_artist = e.artist;
delete e.artist
}
$.each(e,
function (j, f) {
if (f !== null) {
d.setFilter(j, f)
} else {
d.removeFilter(j)
}
});
d.setFilter("api", true);
if (a) {
c.el.trigger("currentCollectionChange")
} else {
c.el.trigger("currentCollectionChange", [d])
}
},
remove_filter: function (j) {
j.preventDefault();
j.stopPropagation();
var b = this;
var f = $(j.currentTarget).parents(".blade").data("type");
var a;
$.each(b.blades,
function (k, e) {
if (e != f) {
a = e
}
});
var d = b.bladeEls.filter("." + f);
var c = b.bladeEls.filter("." + a);
d.find(".remove-percent-filtered").addClass("hide");
c.find(".current-selection").removeClass("show").children(".item").text("");
b.breadcrumbs[f] = null;
b.render_breadcrumbs();
b.el.find(".filtered-list." + f + " .filter-result-selected").removeClass("filter-result-selected");
b.bladeCollections[a].filterCollection();
ap.setCurrentArtworkCollectionState([{
filterType: b.bladeCollections[a].getCollectionFilterType(),
filterValue: false
}]);
b.updateBlade(a);
b.current_blade_selection[f] = null;
b.aggregation_loader()
},
attach_scrolling: function (b) {
var a = this;
if (b.find(".scroll-pane").data("jsp")) {
b.find(".scroll-pane").data("jsp").reinitialise()
} else {
b.find(".scroll-pane").pScrollPane()
}
b.find(".scroll-pane").data("jsp").reinitialise()
},
initial_collapse: function () {
var a = this;
a.filter_sets.find("li").not(".open").find(".contents").hide();
a.filter_sets.find("li.open").find(".filters-selected").hide()
},
collapse_others: function () {
var a = this;
var b = a.filter_sets.find("li.blade.open");
a.filter_sets.find("li.blade.open").find("h3").addClass("rotated");
a.filter_sets.find("li.blade.open").removeClass("display-open").animate({
width: 60
},
function () {
$(this).removeClass("open").addClass("closed")
}).find(".contents").fadeOut(function () {
$(this).parent("li").find(".filters-selected").fadeIn()
})
},
handle_close_blade: function (c) {
var a = this;
var b = $(c.currentTarget).parents(".blade");
if (!a.isAnimating) {
a.close_blade(b)
}
},
close_blade: function (b) {
var a = this;
$blade = $(b);
a.isAnimating = true;
$blade.find("h3").addClass("rotated");
$blade.removeClass("display-open").animate({
width: 60
},
function () {
$(this).addClass("closed").removeClass("open")
}).find(".contents").fadeOut().end().find(".filters-selected").fadeOut(function () {
$(this).parent("li").find(".filters-selected").fadeIn()
});
a.sidebar.resize(120);
a.discover_content.animate({
width: 120
},
function () {
a.isAnimating = false
})
},
toggle_blades: function (b) {
var a = this;
b = $(b.currentTarget);
if (a.bladeEls.filter(":animated").length !== 0 || a.discover_content.is(":animated")) {
return
}
a.el.undelegate("li.blade.closed", "click");
a.el.undelegate("li.blade.open .heading", "click");
if (a.filter_sets.find(".open").length === 0) {
a.sidebar.resize(320);
a.discover_content.animate({
width: 320
})
}
if (b.hasClass("closed")) {
a.collapse_others();
b.find("h3").removeClass("rotated");
b.find(".percent-filtered").slideUp(function () {
$(this).remove()
});
b.addClass("display-open").animate({
width: 260
}).addClass("open").removeClass("closed").find(".filters-selected").fadeOut(function () {
b.find(".contents").fadeIn().slideDown(function () {
var c = b.find(".scroll-pane").data("jsp"),
d = b.data("type");
a.delegateEvents();
$.each(a.scrollables,
function (f, e) {
e.reinitialise({
verticalGutter: 4
})
});
a.attach_scrolling(b);
if (c && !c.getIsScrollableV() && a.bladeCollections[d].moreToLoad) {
a.updateBlade(d, true)
}
})
})
}
},
toggle_decades: function (a) {
$(".century").not($(a.currentTarget).parent(".century")).removeClass("open").end().find($("ul.decades")).not($(a.currentTarget).next("ul.decades")).slideUp();
$(a.currentTarget).parent(".century").addClass("open");
$(a.currentTarget).next("ul.decades").slideToggle("fast")
},
filter_count: function (b) {
var k = this;
if (!b.hasClass("open")) {
b.find(".remove-percent-filtered").remove();
b.find(".percent-filtered").slideUp(function () {
$(this).remove()
});
if (k.get_blade_data().filter) {
var f = 800;
var d = b.find(".filtered-list li:not(ul.decades li)").length;
var l;
if (d == 0) {
l = 100 * (f / f)
} else {
l = 100 * (d / f)
}
var e = "400";
var a = (l / 100) * e;
var c = $(k.templates.percent_filter);
var j = $(k.templates.remove_button);
b.append(c);
b.append(j);
c.animate({
height: a
})
}
}
},
onContentAreaResized: function () {
var b = this,
e = this.bladeEls.eq(0),
c = 102,
f = ap.isMobile ? 52 : 29,
j = ap.isMobile ? 147 : 104,
d = this.el.outerHeight(true) - (c + f + j + 45),
a = this.el.find(".scroll-pane");
a.each(function () {
var n = $(this),
k = n.height(d).data("jsp"),
l = n.closest(".blade"),
m = l.data("type"),
o = b.bladeCollections[m];
if (k) {
k.reinitialise();
if (l.hasClass("open") && !k.getIsScrollableV() && o.moreToLoad) {
b.updateBlade(m, true)
}
}
})
}
});
ap.globals.Bookmarks = Backbone.View.extend({
el: $("#sidebar"),
events: {
"click #sidebar-content button.cancel": "closeBookmarkPanel"
},
closeBookmarkPanel: function () {
this.sidebar.closeSidebar()
},
initialize: function () {
this.sidebar = this.options.sidebar;
_.bindAll(this, "postHandler");
this.postHandler()
},
postHandler: function () {
this.createNewBookmarkView = new ap.bookmarks.CreateBookmark({
sidebar: this.sidebar
})
}
});
ap.globals.Share = Backbone.View.extend({
el: $("#sidebar"),
events: {
"click .share-content li a": "trackShareAction",
"focus #short-url": "autoSelectShareURL"
},
initialize: function () {
_.bindAll(this, "trackShareAction", "autoSelectShareURL");
this.$el = $(this.el);
this.sidebar = this.options.sidebar;
this.setupShortUrl();
this.setupGPlusShare();
this.setupTweet();
$(".content-with-sidebar").bind("content-change", this.setupShortUrl)
},
autoSelectShareURL: function (b) {
var a = $(b.target).get(0);
this.setSelection(a, 0, a.value.length);
this.trackShareAction(b)
},
setupShortUrl: function () {
var a = this.options.shareUrl ? window.location.origin + this.options.shareUrl : window.location;
$("#short-url").val("");
url = "/shorturl/?url=" + a;
$.get(url,
function (b) {
$("#short-url").val(b);
$(".plusone a, .twitter a, .facebook a").each(function () {
$this = $(this);
href = $this.attr("href");
$this.attr("href", href + b)
});
$(".email a").each(function () {
$this = $(this);
href = $this.attr("href");
$this.attr("href", href + "&body=" + b)
})
})
},
setupGPlusShare: function () {
$(".plusone a").click(function () {
window.open($(this).attr("href"), "ap-gplus-share", "width=640,height=300");
return false
})
},
setupTweet: function () {
$(".twitter a").click(function () {
window.open($(this).attr("href"), "ap-tweet-share", "width=550,height=420");
return false
})
},
setSelection: function (b, a, d) {
if (b.createTextRange) {
var c = b.createTextRange();
c.collapse(true);
c.moveStart("character", a);
c.moveEnd("character", a + d);
c.select()
} else {
if (b.selectionEnd) {
b.selectionStart = a;
b.selectionEnd = a + d
}
}
},
trackShareAction: function (c) {
var a = $(c.target);
var b = a.data("service-name");
ap.trackShareAction(b, ap.getMuseumAnalyticsId())
}
});
ap.namespace("ap.sidebar").MainView = Backbone.View.extend({
el: $("#sidebar"),
events: {
"click a.disabled": "disabledButton_Click",
"click a.enabled.has_section": "hasSection_Click",
"mouseenter .tb-action-link": "showLabel",
"mouseleave .tb-action-link": "hideLabel",
"click a.enabled.add-to-collection": "initBookmarks",
"click a.enabled.share": "initShare",
"click a.enabled.discover": "initDiscover",
"click a.enabled.slideshow": "startSlideShow",
"click a.streetview": "toggleStreetview",
},
closedWidth: 50,
config: {
aggregation: null,
aggregation_view: null
},
options: {
plusoneOptions: {
size: "small",
annotation: "none"
},
visibleButtons: [".plusone", ".discover", ".share", ".add-to-collection", ".slideshow", ".streetview"],
disabledButtons: [],
shareUrl: null
},
open: false,
streetview: null,
lastPanel: null,
initialize: function () {
var a = this;
_.bindAll(a, "render", "hasSection_Click", "onResizeComplete", "resize", "killMuseumView");
a.bind("userDataLoaded",
function () {
ap.log("userDataLoaded callback init in sidebar/MainView.js");
if (a.buttonShouldBeEnabled(".add-to-collection")) {
a.enableButton(".add-to-collection");
this.bookmarks = new ap.globals.Bookmarks({
sidebar: this
})
}
if (a.buttonShouldBeEnabled(".slideshow")) {
a.enableButton(".slideshow")
}
});
$.each(a.options.visibleButtons,
function (b, c) {
var d = a.el.find(c);
d.removeClass("hidden");
if ((c !== ".add-to-collection" && c !== ".slideshow") && a.buttonShouldBeEnabled(c)) {
d.removeClass("disabled");
d.addClass("enabled")
}
});
a.initDiscover();
if (this.discover.get_blade_data()) {
if (this.discover.get_blade_data().open == true) {
a.openSidebar($("a.tb-action-link.discover"))
}
}
if ($("body").data("museumId")) {
this.discover.set_blade_data({
collection: $("body").data("museumId"),
artist: null
})
} else {
if ($("body").data("artistId")) {
this.discover.set_blade_data({
collection: null,
artist: $("body").data("artistId")
})
}
}
if (ap.isMobile) {
this.closedWidth = 60
}
a.el.find(".hidden").parent().remove()
},
buttonShouldBeEnabled: function (a) {
if (!_.include(this.options.disabledButtons, a)) {
return true
}
return false
},
showLabel: function (a) {
var b = $(a.currentTarget);
if (!b.hasClass("disabled")) {
var c = b.find(".tb-action-label");
if (!$(c).is(":visible")) {
$(c).stop().fadeIn()
}
if (!$(a.currentTarget).hasClass("selected")) {}
}
return false
},
hideLabel: function (a) {
var b = $(a.currentTarget);
if (!b.hasClass("disabled")) {
var c = b.find(".tb-action-label");
if ($(c).is(":visible")) {
$(c).stop().fadeOut()
}
}
return false
},
initDiscover: function () {
if (_.isUndefined(this.discover)) {
this.discover = new ap.globals.Discover({
sidebar: this
})
}
},
initBookmarks: function (a) {
$(".add-to-collection-content").data("zoomState", this.parentView.microscope.getCurrentState())
},
initShare: function (b) {
var a = this;
if (_.isUndefined(this.share)) {
this.share = new ap.globals.Share({
sidebar: this,
shareUrl: a.options.shareUrl
})
}
},
startSlideShow: function () {
var b = this;
var c = $(".artwork").first().data("model");
var k = 0;
var a = "UNKNOWN_COLLECTION";
var e = ap.getMuseumAnalyticsId();
var j = $("body").data("museum-id");
var f = $("body").data("group-id");
if (_.isUndefined(c)) {
k = $("#artwork-wrapper").data("artworkId");
k = "/api/int/gap2/artwork/" + k + "/";
a = $("body").data("museum-url")
} else {
k = c.id;
a = c.get("collection_detail_url")
}
if (j) {
ap.trackOpenSlideshow("sidebar", {
"collection-slug": a
}, e)
} else {
if (f) {
ap.trackOpenSlideshow("sidebar", {
bookmarkgroup: "bookmarkgroup",
bookmarkgroup_id: f
})
} else {
ap.trackOpenSlideshow("sidebar", {})
}
}
var d = new ap.slideshow.layout.MainView({
sidebar: this
});
d.render(k)
},
remoteStartSlideshow: function (a) {
ap.trackOpenSlideshow("artwork_icon", {
aw_slug: a.get("slug"),
aw_id: a.get("id"),
"collection-slug": a.get("collection_detail_url")
}, ap.getMuseumAnalyticsId());
var b = new ap.slideshow.layout.MainView({
sidebar: this
});
var c = a.id;
b.render(c)
},
openCloseAnimation: function (d, b) {
var a = this,
e = $(".main-content"),
c = $(".content-with-sidebar");
a.el.animate({
left: d
}, {
queue: false,
complete: a.onResizeComplete,
step: function (f) {
if (a.parentView && a.parentView.preloaderview) {
a.parentView.preloaderview.positionPreloader({
"margin-left": f
}, true)
}
e.css({
width: b - (f + 50) + "px"
});
c.css({
marginLeft: f + 50,
width: b - (f + 50) + "px"
})
}
})
},
resizeAnimation: function (d, b) {
var a = this,
e = $(".main-content"),
c = $(".content-with-sidebar");
a.el.animate({
left: d
}, {
queue: false
});
c.animate({
marginLeft: d + 50,
width: b - (d + 50) + "px"
}, {
queue: false
});
e.animate({
width: b - (d + 50) + "px"
}, {
queue: false,
step: (a.parentView && a.parentView.preloaderview) ? function (f) {
a.parentView.preloaderview.positionPreloader({
"margin-left": b - f - 50
}, true)
} : function () {},
complete: a.onResizeComplete
})
},
closeSidebar: function () {
var a = this;
this.onBeforeResize();
var b = $(window).width();
a.openCloseAnimation(0, b);
this.el.find(".tb-action-link").not(".streetview").removeClass("selected");
a.open = false
},
toggleSidebar: function () {
if (this.open) {
this.closeSidebar()
} else {
this.openSidebar(this.lastPanel)
}
},
openSidebar: function (j) {
var c = this,
f = $("body"),
b = {};
c.lastPanel = j;
if (j.data("container") == "discover") {
if (f.data("artworks") == undefined) {
if (f.attr("id") == "museum") {
b.filterType = "collection";
b.filterValue = f.data("museum-id");
b.filterText = f.data("museum-title")
} else {
if (f.attr("id") == "artist") {
b.filterType = "canonical_artist";
b.filterValue = f.data("artist-id");
b.filterText = f.data("artist-name")
}
}
ap.clearCurrentArtworkCollectionState();
ap.setCurrentArtworkCollectionState([b]);
ap.redirectTo("/artworks/");
return false
} else {
this.discover.set_blade_data({
open: false
})
}
}
this.onBeforeResize();
if (this.parentView) {
this.parentView.trigger("sidebarOpening")
}
this.el.find(".tb-action-link").not(".streetview").removeClass("selected");
j.addClass("selected");
var a = $("." + j.data("container") + "-content");
$(".sb-content").hide();
a.show();
var d = $(window).width();
var e = a.width();
c.openCloseAnimation(e, d);
this.open = true
},
resize: function (c) {
var a = this;
var b = $(window).width();
a.resizeAnimation(c, b)
},
onBeforeResize: function (a) {
var b = this;
b.el.trigger("beforeResize")
},
onResizeComplete: function (a) {
var b = this;
b.el.trigger("resize")
},
needsClosing: function (a) {
return this.el.find(".tb-action-link.selected").data("container") == a.data("container") ? true : false
},
hasSection_Click: function (a) {
var b = this;
var d = $(a.currentTarget);
var c = b.needsClosing(d);
if (d.hasClass("add-to-collection") && !ap.userIsAuthenticated) {
return true
}
b.killMuseumView();
if (c) {
b.closeSidebar()
} else {
b.openSidebar(d)
}
if (d.hasClass("streetview") && b.parentView.router) {}
return false
},
disabledButton_Click: function (a) {
return false
},
toggleStreetview: function (a) {
var b = $(a.currentTarget);
this.parentView.router.navigate(b.attr("href").replace("/", ""), true);
return false
},
showMuseumView: function (b, a) {
var c = this;
if ($("#streetview").length) {
var d;
if (!b) {
d = $(c.el).find("a.streetview").eq(0)
} else {
d = $(b.currentTarget)
}
d.attr("href", d.data("real-url"));
if (ap.isMobile) {
c.parentView.trigger("sidebarOpening")
} else {
c.openSidebar(d)
}
if (c.parentView.artworkDetailView) {
c.parentView.showArtwork()
}
if (c.parentView.museumDetails) {
c.parentView.museumDetails.togglePopup("up")
}
$("#streetview").css({
"z-index": 1009
});
$("#streetview").show();
$(c.el).find("a.streetview").addClass("selected");
if (!c.parentView.streetview) {
if (!ap.isMobile) {
c.parentView.streetview = new ap.streetview.MainView({
sidebar: this,
encodedLocation: a
})
} else {
c.parentView.streetview = new ap.mobile.streetview.MainView({
sidebar: this,
encodedLocation: a
})
}
c.parentView.streetview.render()
}
} else {
ap.log("no streetview")
}
},
hideMuseumView: function () {
var a = $(this.el).find("a.streetview").eq(0);
a.attr("href", a.data("museumview-url"));
this.killMuseumView();
this.closeSidebar()
},
killMuseumView: function (a) {
var b = this;
if (b.parentView.streetview && b.parentView.streetview.initialized) {
$("#streetview").css({
"z-index": -10000
});
$(this.el).find("a.streetview").removeClass("selected").addClass("unselected");
$("#streetview").hide()
}
},
disableButton: function (a) {
$(this.el).find("a.tb-action-link").filter(a).removeClass("enabled").addClass("disabled")
},
enableButton: function (b, a) {
$(this.el).find("a.tb-action-link").filter(b).removeClass("disabled").addClass("enabled")
},
render: function () {
if ($("body").data("artworks")) {
this.discover.render();
this.openSidebar($("a.tb-action-link.discover"))
}
return this
}
});
ap.namespace("ap.system").ProcessManager = function (c) {
var d = "default";
var b = function (e) {
this.processName = e;
this.isTerminated = false;
this.isBusy = false;
this.ownerDocument = document;
this.start = function (j) {
if (!this.isTerminated) {
f(this, j, "processStarted", true)
} else {
ap.log("I can't start my work because I'm terminated", "warn")
}
};
this.end = function (j) {
if (!this.isTerminated) {
f(this, j, "processEnded", false)
} else {
ap.log("I can't end my work because I'm terminated", "warn")
}
};
this.terminate = function (j) {
this.isTerminated = true;
this.isBusy = false;
f(this, j, "processTerminated", false)
};
this.reset = function (j) {
this.isTerminated = false;
this.isBusy = false;
f(this, j, "processReset", false)
};
function f(l, n, k, m) {
var j = l.processName != d ? "_" + l.processName : "";
l.isBusy = m;
$(ap.system.ProcessManager.Singleton[l.processName]).trigger(k + j, n)
}
};
var a = c || d;
return ap.system.ProcessManager.Singleton[a] || (ap.system.ProcessManager.Singleton[a] = new b(a))
};
ap.namespace("ap.system.ProcessManager").Singleton = {
"default": null
};
ap.namespace("ap.system").imagePreload = function (d, b) {
var a = "default";
var e = function (n, l) {
this.queueName = n;
var p = {
items: [],
loadedItems: [],
abort: false,
imageLoaded: null,
imageLoadError: null,
batchLoaded: null
};
var m = $.extend(p, l);
this.addToQueue = function (r, q) {
m.abort = false;
m.items.push({
imageSrc: r,
preLoadData: q
})
};
this.abort = function () {
m.abort = true;
m.items = [];
m.loadedItems = []
};
this.reset = function () {
m.abort = false
};
function k(r, q, s) {
if (!m.abort) {
m.loadedItems.push(s);
if (m.imageLoaded != null) {
m.imageLoaded(r, q)
}
if (o()) {
f(true)
}
}
}
function o() {
if (m.loadedItems.length == m.items.length) {
return true
}
return false
}
function j(q) {
m.loadedItems.push(q);
if (m.imageLoadError != null) {
m.imageLoadError(q.imageSrc, q.preLoadData)
}
if (o()) {
f(false)
}
}
function f(q) {
m.items = [];
m.loadedItems = [];
if (!m.abort && m.batchLoaded != null) {
m.batchLoaded(q)
}
m.abort = false
}
this.load = function () {
if (!m.abort) {
if (!m.items.length) {
f(false)
} else {
if (Image.prototype == undefined) {
Image.prototype = {}
}
Image.prototype.preLoadData = {};
for (var r in m.items) {
q(m.items[r])
}
}
}
function q(t) {
var s = new Image();
s.preLoadData = t.preLoadData;
s.onload = function () {
k(s, s.preLoadData, t)
};
s.onabort = function () {
j(t)
};
s.onerror = function () {
j(t)
};
s.src = t.imageSrc
}
}
};
var c = d || a;
return ap.system.imagePreload.Singleton[c] || (ap.system.imagePreload.Singleton[c] = new e(c, b))
};
ap.namespace("ap.system.imagePreload").Singleton = {
"default": null
};
ap.namespace("ap.slideshow.layout").MicroscropeSlideView = Backbone.View.extend({
tagName: "div",
className: "slide",
microscope: null,
currentState: null,
state: null,
events: {},
initialize: function () {
_.bindAll(this, "render", "update", "show", "hide", "addMicroscope");
this.state = this.options.state
},
update: function (e, f) {
var m = this,
b = m.model,
a = b.get("artwork"),
c = 0,
d = b && b.cid === e.cid;
if (d) {
return
}
m.hide();
m.model = e;
if (!m.microscope) {
m.addMicroscope()
}
if (!d && a && ((typeof (a) === "string" && a === m.model.get("artwork")) || (a.id === m.model.get("artwork").id))) {
f = false;
c = 1500
}
if (e.artworkModel) {
var l = e.attributes.part_x;
var k = e.attributes.part_y;
var j = e.attributes.part_zoom;
m.currentState = new MicroscopeState(l, k, j)
} else {
m.currentState = null
}
if (_.isUndefined(f) || f == true) {
m.microscope.microscope.LoadImage(this.model.attributes.cached_artwork_primary_image_full_url, m.currentState)
} else {
m.microscope.animate(m.currentState, c)
}
m.show()
},
show: function (b) {
var a = this;
a.state = "current";
$(a.el).addClass("current")
},
hide: function (b) {
var a = this;
a.state = null;
$(a.el).removeClass("current")
},
addMicroscope: function () {
var a = this,
b = {
container: $(a.el),
imageUrl: a.model.attributes.cached_artwork_primary_image_full_url,
aspectRatio: a.model.attributes.primary_image_aspect_ratio,
dontAnimate: true
},
c = {};
if (a.model.artworkModel) {
c.x = a.model.get("part_x");
c.y = a.model.get("part_y");
c.z = a.model.get("part_zoom");
b.microscopeState = new MicroscopeState(c.x, c.y, c.z)
}
a.microscope = new ap.microscope.layout.Main(b)
},
render: function () {
var a = this;
if (a.options.model) {
a.addMicroscope();
a.update(a.options.model, true)
}
$(a.options.parentView.el).append(this.el);
return a
}
});
ap.namespace("ap.slideshow.layout").ImageSlideView = Backbone.View.extend({
tagName: "div",
className: "slide",
imageWrapper: null,
image: null,
cropWrapper: null,
state: null,
model: null,
events: {},
initialize: function () {
var a = this;
_.bindAll(a, "render", "update", "center", "show", "hide", "addBookmarkCrop");
a.state = a.options.state;
$(window).on("resize", a.center)
},
update: function (b) {
var a = this;
a.model = b.artworkModel || b;
var d = a.model.calculateImageSizeForAPI({
width: $(window).width(),
height: $(window).height()
});
var c = '<div class="image-slide-wrapper"><img class="image-slide" src="' + a.model.image(d) + '" alt="' + b.attributes.title + '" /><span class="crop-wrapper"></span></div>';
$(this.el).empty().append(c);
a.imageWrapper = $(this.el).find(".image-slide-wrapper");
a.image = $(this.el).find(".image-slide");
a.cropWrapper = $(this.el).find(".crop-wrapper");
a.image.one("load", a.center);
if (b.artworkModel) {
a.addBookmarkCrop(b)
}
},
addBookmarkCrop: function (b) {
var a = this;
ap.drawCrop(a.image, a.cropWrapper, b.get("part_x"), b.get("part_y"), b.get("part_zoom"))
},
center: function (f) {
var c = this;
if (c.image && c.image.length) {
var d = $(window).width();
var l = $(window).height();
var b = c.image.width();
var a = c.image.height();
var k = Math.round((d * 0.5) - (b * 0.5));
var j = Math.round((l * 0.5) - (a * 0.5));
if (a > l) {
c.image.css("height", l)
}
c.imageWrapper.css({
top: j,
left: k
})
}
},
show: function (b) {
var a = this;
a.center();
a.state = "current";
$(a.el).addClass("current");
a.center()
},
hide: function (b) {
var a = this;
a.state = null;
$(a.el).removeClass("current")
},
render: function () {
var a = this;
if (a.options.model) {
a.update(a.options.model)
}
$(a.options.parentView.el).append(this.el);
a.center();
return a
}
});
ap.namespace("ap.slideshow.layout").BaseSlideManager = Backbone.View.extend({
tagName: "div",
className: "slideMover",
currentDataIndex: -1,
collection: null,
initialize: function (a) {
_.bindAll(this, "render", "change");
this.collection = this.options.parentView.collection
},
getItemIndexFromModel: function (c) {
var b = this.collection._byId[c];
var a = _.indexOf(this.collection.models, b);
return a
},
getItemFromCollection: function (a) {
return this.collection.at(a)
},
goToItem: function (b, d, c) {
var a = this;
var b = b;
if (b === null || b < 0) {
b = a.getItemIndexFromModel(d)
}
a.render(b, c)
},
change: function (b) {
var a = this;
if (a.currentDataIndex < a.collection.models.length - 1) {
$(a.el).trigger("more", ["next"])
}
if (a.currentDataIndex > 0) {
$(a.el).trigger("more", ["prev"])
}
if (a.currentDataIndex == a.collection.models.length - 1) {
$(a.el).trigger("nomore", ["next"])
}
if (a.currentDataIndex == 0) {
$(a.el).trigger("nomore", ["prev"])
}
},
render: function (a, b) {},
go: function () {}
});
ap.namespace("ap.slideshow.layout").StandardSlideManager = ap.slideshow.layout.BaseSlideManager.extend({
currentSlideIndex: -1,
slides: [],
initialize: function () {
ap.slideshow.layout.BaseSlideManager.prototype.initialize.call(this, [this.options]);
_.bind(this, "recycle")
},
change: function (c) {
var a = this;
if (c == "next" && a.currentDataIndex < a.collection.models.length - 1) {
var b = a.currentSlideIndex + 1;
a.showHideSlides(b);
a.currentDataIndex++;
a.recycle(c)
} else {
if (c == "next" && a.currentDataIndex == a.collection.models.length - 1) {
a.goToItem(0, null, true)
} else {
if (c == "prev" && a.currentDataIndex > 0) {
var b = a.currentSlideIndex - 1;
a.showHideSlides(b);
a.currentDataIndex--;
a.recycle(c)
}
}
}
if (a.currentDataIndex < a.collection.models.length - 1) {
$(a.el).trigger("more", ["next"])
}
if (a.currentDataIndex > 0) {
$(a.el).trigger("more", ["prev"])
}
if (a.currentDataIndex == a.collection.models.length - 1) {
$(a.el).trigger("nomore", ["next"])
}
if (a.currentDataIndex == 0) {
$(a.el).trigger("nomore", ["prev"])
}
},
showHideSlides: function (b) {
var a = this;
if (a.currentSlideIndex > -1) {
a.slides[a.currentSlideIndex].hide()
}
a.slides[b].show();
$(a.el).trigger("changed", [a.slides[b].model, a.currentDataIndex]);
a.currentSlideIndex = b
},
recycle: function (e) {
var c = this;
var d = $(c.slides[c.currentSlideIndex].el);
var a = d.index();
if (a >= 3 && e == "next" && c.currentDataIndex + 2 < c.collection.models.length) {
var b = c.getItemFromCollection(c.currentDataIndex + 2);
var f = c.slides.shift();
f.update(b);
c.slides.push(f);
c.currentSlideIndex--;
$(c.el).append($(".slide").first())
} else {
if (a <= 2 && e == "prev" && c.currentDataIndex - 2 > -1) {
var b = c.getItemFromCollection(c.currentDataIndex - 2);
var f = c.slides.pop();
f.update(b);
c.slides.unshift(f);
c.currentSlideIndex++;
$(c.el).prepend($(".slide").last())
}
}
},
render: function (c, j) {
ap.slideshow.layout.BaseSlideManager.prototype.render.call(this, []);
var b = this;
$(".slide").remove();
b.slides = [];
if (c < 0) {
c = 0
}
if (c > 0) {
c--
}
var e = (b.collection.models.length >= 5) ? 5 : b.collection.models.length;
for (var d = 0; d < e; d++) {
var f = b.getItemFromCollection(c + d);
var a = new ap.slideshow.layout.ImageSlideView({
parentView: b,
model: f
});
$(a.el).addClass("s" + d);
a.render();
b.slides.push(a)
}
$(b.options.parentView.el).append(b.el);
b.currentDataIndex = c;
b.currentSlideIndex = (c > 0) ? 1 : 0;
if (j) {
b.go()
}
},
go: function () {
var a = this;
a.slides[a.currentSlideIndex].show();
if (a.currentDataIndex == 0) {
$(a.el).trigger("nomore", ["prev"])
}
$(a.el).trigger("changed", [a.slides[a.currentSlideIndex].model, a.currentDataIndex])
}
});
ap.namespace("ap.slideshow.layout").timeout = [];
ap.namespace("ap.slideshow.layout").MicroscopeSlideManager = ap.slideshow.layout.BaseSlideManager.extend({
slide: null,
currentModel: null,
initialize: function () {
ap.slideshow.layout.BaseSlideManager.prototype.initialize.call(this, [this.options])
},
change: function (b) {
var a = this;
if (b == "next" && a.currentDataIndex < a.collection.models.length - 1) {
a.currentDataIndex++;
a.updateSlide()
} else {
if (b == "next" && a.currentDataIndex == a.collection.models.length - 1) {
a.slide.hide();
a.goToItem(0, null, true)
} else {
if (b == "prev" && a.currentDataIndex > 0) {
a.currentDataIndex--;
a.updateSlide()
}
}
}
ap.slideshow.layout.BaseSlideManager.prototype.change.call(this, [])
},
updateSlide: function () {
var b = this;
var c = b.getItemFromCollection(b.currentDataIndex);
var a = b.currentModel;
var d = c;
var e = (a.id == d.id) ? false : true;
b.slide.update(c, e);
b.currentModel = c;
$(b.el).trigger("changed", [c, b.currentDataIndex])
},
render: function (b, d) {
ap.slideshow.layout.BaseSlideManager.prototype.render.call(this, []);
var a = this;
if (b < 0) {
b = 0
}
var c = a.getItemFromCollection(b);
if (!a.slide) {
a.slide = new ap.slideshow.layout.MicroscropeSlideView({
parentView: a,
model: c
});
a.slide.render();
$(a.options.parentView.el).append(a.el)
} else {
a.slide.update(c, true)
}
a.currentModel = c;
a.currentDataIndex = b;
a.currentSlideIndex = (b > 0) ? 1 : 0;
if (d) {
a.go()
}
},
go: function () {
var a = this;
a.slide.show();
if (a.currentDataIndex == 0) {
$(a.el).trigger("nomore", ["prev"])
}
$(a.el).trigger("changed", [a.getItemFromCollection(a.currentDataIndex), a.currentDataIndex])
}
});
ap.namespace("ap.slideshow.layout").ControlsView = Backbone.View.extend({
tagName: "div",
className: "controls",
timer: "",
templates: {
control_template: '<div class="controller"><div class="mover previous" direction="prev" title="' + TRANSLATIONS.previous + '"></div><div class="pp pause" title="' + TRANSLATIONS.pause + '"></div><div class="mover next" direction="next" title="' + TRANSLATIONS.next + '"></div></div>',
duration_template: '<div class="duration"><div class="label">' + TRANSLATIONS.duration + '</div><div class="minus" title="-"></div><input type="text" class="number" name="number" /><div class="plus" title="+"></div></div>',
close_template: '<div class="close" title="' + TRANSLATIONS.close + '" href="javascript:void(0)"></div>'
},
mobileTemplates: {
control_template: '<div class="controller"><div class="mover previous" direction="prev" title="' + TRANSLATIONS.previous + '"><span class="sprite"></span></div><div class="pp pause" title="' + TRANSLATIONS.pause + '"><span class="sprite"></span></div><div class="mover next" direction="next" title="' + TRANSLATIONS.next + '"><span class="sprite"></span></div></div>',
duration_template: '<div class="duration"><div class="label">' + TRANSLATIONS.duration + '</div><div class="minus" title="-"><span class="sprite"></span></div><input type="text" class="number" name="number" /><div class="plus" title="+"><span class="sprite"></span></div></div>',
close_template: '<div class="close" title="' + TRANSLATIONS.close + '" href="javascript:void(0)"><span class="sprite"></span></div>'
},
events: {
"click .close": "close",
"click .previous": "previous_next",
"click .pause": "play_pause",
"click .play": "play_pause",
"click .next": "previous_next",
"click .minus": "minus",
"click .plus": "plus",
"change .number": "change_timer"
},
initialize: function () {
var a = this;
_.bindAll(a, "render");
a.collection = a.options.mainView.artworkList;
if (ap.isMobile) {
a.events = {
"touchend .close": "close",
"touchend .previous": "previous_next",
"touchend .pause": "play_pause",
"touchend .play": "play_pause",
"touchend .next": "previous_next",
"touchend .minus": "minus",
"touchend .plus": "plus",
"change .number": "change_timer"
}
}
},
previous_next: function (c) {
var a = this;
var b = $(c.currentTarget);
var d = b.attr("direction");
$(a.el).trigger("seek", [d])
},
hide_control: function (b) {
var a = this;
$(a.el).find("div." + b).fadeOut()
},
show_control: function (b) {
var a = this;
$(a.el).find("div." + b).fadeIn()
},
show_controls: function () {
var b = this;
var a = $(b.el).find("div.mover");
if (a.is(":hidden")) {
a.fadeIn()
}
},
play_pause: function (b) {
var a = this;
if (a.options.mainView.isPlaying) {
$(a.el).trigger("playpause", ["pause"])
} else {
$(a.el).trigger("playpause", ["play"])
}
return false
},
updateState: function (b) {
var a = this;
if (b == "play") {
a.showPauseButton()
} else {
if (b == "pause") {
a.showPlayButton()
}
}
},
showPauseButton: function () {
$(".pp").removeClass("play").addClass("pause").attr("title", TRANSLATIONS.pause)
},
showPlayButton: function () {
$(".pp").removeClass("pause").addClass("play").attr("title", TRANSLATIONS.play)
},
minus: function () {
var c = this;
var b = $(".number");
var a = b.val();
if (--a <= 2) {
b.val(2)
} else {
b.val(--a)
}
c.change_timer(null)
},
plus: function () {
var c = this;
var b = $(".number");
var a = b.val();
b.val(++a);
c.change_timer(null)
},
change_timer: function (c) {
var b = this;
if (c === null) {
var a = $(".number")
} else {
var a = $(c.currentTarget)
}
if (+a.val() != NaN) {
$(b.el).trigger("changetimer", [a.val()])
}
},
close: function () {
var a = this;
$(a.el).trigger("exit")
},
render: function () {
var a = this;
var b = (ap.isMobile) ? a.mobileTemplates : a.templates;
$(a.el).append(b.duration_template);
$(a.el).append(b.control_template);
$(a.el).append(b.close_template);
$(a.el).find(".number").val(a.options.initialDuration);
$(a.options.mainView.el).prepend(a.el)
}
});
ap.slideshow.layout.MainView = Backbone.View.extend({
tagName: "div",
id: "slideshow",
hudView: null,
slideManager: null,
events: {
mousedown: "handleMouseDown",
mousemove: "handleMouseMove",
mouseup: "handleMouseUp",
"mouseenter .controls": "handleMouseEnter",
"mouseenter #thumbnail-strip": "handleMouseEnter",
"mouseleave .controls": "handleMouseLeave",
"mouseleave #thumbnail-strip": "handleMouseLeave",
"playpause .controls": "playPauseSlideshow",
"seek .controls": "prevNextSlide",
"changetimer .controls": "changeDuration",
"exit .controls": "exitSlideshow",
"more .slideMover": "handleMoreSlides",
"nomore .slideMover": "handleNoMoreSlides",
"changed .slideMover": "handleSlideChange"
},
isPlaying: false,
mouseIsDown: false,
mouseIsDragging: false,
mouseIsOver: false,
drag: null,
timer: null,
timerDuration: 4,
isFirstTime: true,
closerTemplate: '<div id="close-slideshow-esc"><p>' + TRANSLATIONS.press_esc + "</p></div>",
initialize: function () {
_.bindAll(this, "render", "startSlideShow", "handleMouseDown", "handleMouseMove", "handleMouseUp", "handleMouseEnter", "handleMouseLeave", "playPauseSlideshow", "runTimer", "prevNextSlide", "changeDuration", "exitSlideshow", "handleMoreSlides", "handleNoMoreSlides", "handleSlideChange", "handleThumbnailClick", "handleInfoClick");
var a = this.options.sidebar.parentView.currentCollection || this.options.sidebar.parentView.thumbnailStrip.artworkList;
this.collection = $.extend(true, {}, a);
this.collection.unbind()
},
render: function (a) {
if (!$("#slideshow").length) {
$("body").append(this.el)
}
this.prep(a)
},
prep: function (b) {
var a = this;
if (ap.isMobile) {
a.slideManager = new ap.slideshow.layout.StandardSlideManager({
parentView: a
})
} else {
a.slideManager = new ap.slideshow.layout.MicroscopeSlideManager({
parentView: a
})
}
a.slideManager.goToItem(null, b, false);
a.hudView = new ap.slideshow.layout.HudView({
container: $(this.el),
parentView: a,
slideManager: a.slideManager,
initialDuration: a.timerDuration
});
$(a.hudView.bottomBar).on("artworkClicked", a.handleThumbnailClick);
$(a.hudView.label.el).on("detailClicked", a.handleInfoClick);
this.startSlideShow()
},
startSlideShow: function () {
var a = this;
$(a.el).fadeIn();
a.slideManager.go();
if (!ap.isMobile) {
a.showCloser();
a.attachKeyListeners()
}
a.playPauseSlideshow(null, "play", a.hudView.TIMER_SLOW)
},
showCloser: function () {
var b = this;
$(b.el).append(b.closerTemplate);
var c = $("#close-slideshow-esc");
c.fadeIn(function a() {
var d = setTimeout(function e() {
c.fadeOut("slow",
function f() {
c.remove()
})
}, 2000)
})
},
handleSlideChange: function (d, c, b) {
var a = this;
a.hudView.label.update(c);
a.hudView.bottomBar.highlightArtwork(c.attributes.id);
a.hudView.bottomBar.scrollToCurrentArtwork()
},
handleThumbnailClick: function (d, a) {
var b = this;
var c = a.bookmarkModel || a.model;
b.slideManager.goToItem(null, c.id, true);
clearTimeout(b.timer);
b.runTimer()
},
handleInfoClick: function (b) {
var a = this;
a.exitSlideshow()
},
playPauseSlideshow: function (c, b, d) {
var a = this;
if (a.timer != null) {
clearTimeout(a.timer);
a.timer = null
}
if (!_.isUndefined(b)) {
a.hudView.topBar.updateState(b);
if (b == "pause") {
a.isPlaying = false;
a.hudView.hideHud(d)
} else {
a.isPlaying = true;
a.runTimer();
a.hudView.hideHud(d)
}
}
},
runTimer: function () {
var a = this;
var b = a.timerDuration * 1000;
if (a.timer == null && !a.isFirstTime) {
b = 1000
}
a.timer = setTimeout(function () {
a.isFirstTime = false;
if (a.collection.models.length > 1 && a.isPlaying) {
a.prevNextSlide(null, "next");
a.runTimer()
} else {
a.playPauseSlideshow(null, "pause", a.hudView.TIMER_SLOW)
}
}, b)
},
prevNextSlide: function (c, b) {
var a = this;
if (c != null) {
a.playPauseSlideshow(null, "pause", a.hudView.TIMER_SLOW)
}
switch (b) {
case "next":
a.slideManager.change("next");
break;
case "prev":
a.slideManager.change("prev");
break
}
return false
},
changeDuration: function (c, b) {
var a = this;
a.timerDuration = b;
a.isFirstTime = true;
return false
},
exitSlideshow: function (b) {
var a = this;
a.playPauseSlideshow(null, "pause", a.hudView.TIMER_SLOW);
a.isPlaying = false;
if (a.collection) {
a.collection.unbind();
a.collection = null
}
a.hudView.bottomBar.unload();
$(a.el).fadeOut(function () {
a.remove()
})
},
attachKeyListeners: function () {
var a = this;
document.addEventListener("keydown",
function (b) {
switch (b.keyCode) {
case 13:
case 27:
b.preventDefault();
a.exitSlideshow();
break
}
}, false)
},
handleMouseDown: function (b) {
var a = this;
a.mouseIsDown = true;
if (a.isPlaying) {
if (!a.hudView.visible) {
a.playPauseSlideshow(b, "pause", a.hudView.TIMER_FAST)
}
a.hudView.showHud(a.hudView.TIMER_FAST);
a.hudView.hideHud(a.hudView.TIMER_SLOW)
}
},
handleMouseMove: function (f) {
var c = this;
var a = f.pageY;
if (c.mouseIsDown) {
if (c.drag == null) {
c.drag = {
startX: f.pageX,
startY: f.pageY
}
}
var b = f.pageX;
var j = c.drag.startX - b;
var d = c.drag.startY - a;
if (j < 0) {
j = -j
}
if (d < 0) {
d = -d
}
if (j > 10 || d > 10) {
c.mouseIsDragging = true;
if (c.hudView.visible) {
c.hudView.hideHud(0)
}
}
} else {
if (a < 100) {
c.hudView.showHud(c.hudView.TIMER_FAST);
c.hudView.hideHud(c.hudView.TIMER_SLOW)
}
}
},
handleMouseUp: function (f) {
var b = this;
b.mouseIsDown = false;
b.drag = null;
var c = $(".controls").height();
var d = $(window).height() - $("#thumbnail-strip").height() - 10;
if (b.hudView.visible && f.pageY > c && f.pageY < d && !b.mouseIsOver) {
var a = $("artworkInfo a").attr("href");
if (a) {
b.exitSlideshow();
window.location = a
} else {
b.hudView.hideHud(b.hudView.TIMER_FAST)
}
} else {
if (!b.hudView.visible && !b.mouseIsDragging && !b.mouseIsOver) {
b.hudView.showHud(b.hudView.TIMER_FAST);
b.hudView.hideHud(b.hudView.TIMER_SLOW)
}
}
b.mouseIsDragging = false
},
handleMouseEnter: function (b) {
var a = this;
a.mouseIsOver = true;
a.hudView.showHud(a.hudView.TIMER_FAST)
},
handleMouseLeave: function (b) {
var a = this;
a.mouseIsOver = false;
a.hudView.hideHud(a.hudView.TIMER_SLOW)
},
handleMoreSlides: function (c, b) {
var a = this;
if (b == "next") {
a.hudView.topBar.show_control("next")
} else {
a.hudView.topBar.show_control("previous")
}
},
handleNoMoreSlides: function (c, b) {
var a = this;
if (b == "next") {
a.hudView.topBar.hide_control("next")
} else {
a.hudView.topBar.hide_control("previous")
}
},
enterFullscreen: function () {
var a = this;
var b = document.getElementById("slideshow");
ap.system.FullScreen.enterFullScreen(b);
ap.system.FullScreen.onFullScreenChange(b,
function () {
if (!ap.system.FullScreen.isFullScreen()) {
a.exitSlideshow()
}
})
},
exitFullScreen: function () {
ap.system.FullScreen.exitFullScreen()
}
});
ap.namespace("ap.system").FullScreen = {
toggle: function (a) {
if ((document.fullScreenElement && document.fullScreenElement !== null) || (!document.mozFullScreen && !document.webkitIsFullScreen)) {
this.enterFullScreen(a)
} else {
this.exitFullScreen()
}
},
isFullScreen: function () {
if (document.fullScreen || document.mozFullScreen || document.webkitIsFullScreen) {
return true
} else {
return false
}
},
enterFullScreen: function (a) {
if (a.requestFullScreen) {
a.requestFullScreen()
} else {
if (a.mozRequestFullScreen) {
a.mozRequestFullScreen()
} else {
if (a.webkitRequestFullScreen) {
a.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)
}
}
}
},
exitFullScreen: function () {
if (document.cancelFullScreen) {
document.cancelFullScreen()
} else {
if (document.mozCanceFullScreen) {
document.mozCanceFullScreen()
} else {
if (document.webkitCancelFullScreen) {
document.webkitCancelFullScreen()
}
}
}
},
onFullScreenChange: function (a, b) {
a.onwebkitfullscreenchange = b
}
};
ap.slideshow.layout.HudView = Backbone.View.extend({
topBar: null,
label: null,
bottomBar: null,
visible: true,
showTimer: null,
hideTimer: null,
TIMER_FAST: 100,
TIMER_MED: 1500,
TIMER_SLOW: 5000,
initialize: function () {
_.bindAll(this, "render");
this.render()
},
render: function () {
this.setupTopBar();
this.setupLabel();
this.setupBottomBar();
this.hideHud(this.TIMER_SLOW)
},
setupTopBar: function () {
var a = this;
a.topBar = new ap.slideshow.layout.ControlsView({
mainView: a.options.parentView,
initialDuration: a.options.initialDuration
});
a.topBar.render()
},
setupLabel: function () {
var a = this;
a.label = new ap.slideshow.layout.SlideInfoView({
mainView: a.options.parentView
});
a.label.render()
},
setupBottomBar: function () {
var b = this;
var a = {
showPivots: false,
autoHide: false,
collectionToUse: b.options.parentView.collection
};
b.bottomBar = new ap.slideshow.layout.ThumbnailStripView({
container: b.options.container,
parentView: b.options.parentView,
settings: a
})
},
showHud: function (b) {
var a = this;
$(".slideMover").css("cursor", "pointer");
if (a.showTimer) {
clearTimeout(a.showTimer)
}
if (a.hideTimer) {
clearTimeout(a.hideTimer)
}
a.showTimer = setTimeout(function () {
a.visible = true;
$(a.topBar.el).animate({
top: 0
});
$(a.label.el).fadeIn();
$(a.bottomBar.el).animate({
bottom: 0
})
}, b);
a.bottomBar.scrollToCurrentArtwork()
},
hideHud: function (b) {
var a = this;
$(".slideMover").css("cursor", "auto");
if (a.hideTimer) {
clearTimeout(a.hideTimer)
}
a.hideTimer = setTimeout(function () {
a.visible = false;
$(a.topBar.el).animate({
top: -$(a.topBar.el).height()
});
$(a.label.el).fadeOut();
$(a.bottomBar.el).animate({
bottom: -$(a.bottomBar.el).height()
})
}, b)
}
});
ap.slideshow.layout.SlideInfoView = Backbone.View.extend({
tagName: "div",
className: "artworkInfo",
template: '<a href="#"><span class="title"></span><span class="date"></span><span class="artist"></span></a>',
events: {
"click a": "handleInfoClick"
},
titleEl: null,
dateEl: null,
artistEl: null,
artworkUrl: null,
initialize: function () {
_.bindAll(this, "render", "update", "handleInfoClick");
$(self.el).addClass("active")
},
render: function () {
var a = this;
$(a.el).append(a.template);
$(a.options.mainView.el).append(a.el);
a.titleEl = $(".artworkInfo .title");
a.dateEl = $(".artworkInfo .date");
a.artistEl = $(".artworkInfo .artist")
},
update: function (c) {
var a = this;
var b = c;
$(a.el).find("a").attr("href", b.attributes.detail_url);
a.titleEl.html(b.attributes.title);
a.dateEl.html(b.attributes.pretty_display_date);
a.artistEl.html(b.attributes.artist_display_name)
},
handleInfoClick: function (b) {
var a = this;
$(a.el).trigger("detailClicked")
}
});
ap.faqs.MainView = ap.globals.MainBaseView.extend({
options: {
disabledButtons: [".add-to-collection", ".slideshow"],
},
initialize: function () {
ap.globals.MainBaseView.prototype.initialize.call(this, [this.options]);
this.render()
},
});
$(document).ready(function () {
if ($("#faqs").length) {
window.app = new ap.faqs.MainView()
}
});
ap.education.MainView = ap.globals.MainBaseView.extend({
options: {
disabledButtons: [".add-to-collection", ".slideshow"],
},
initialize: function () {
ap.globals.MainBaseView.prototype.initialize.call(this, [this.options]);
this.render()
},
});
$(document).ready(function () {
if ($("#education").length) {
window.app = new ap.education.MainView()
}
});
ap.namespace("ap.aggregation.layout").ArtworkInfoPopupView = Backbone.View.extend({
el: $("body"),
artworkInfo: {},
template: '<div style="display: none;" id="artwork-info"><h4></h4><p class="date"></p><p class="artist"></p><p class="museum"></p></div>',
events: {
"mouseenter .main-content a.artwork": "showArtworkInfo",
"mouseleave .main-content a.artwork": "hideArtworkInfo",
"jsp-scroll-x .scroll-pane": "scrollPanelXScroll"
},
initialize: function () {
_.bindAll(this, "render")
},
attach: function () {
this.render();
this.delegateEvents()
},
remove: function () {
$(this.el).unbind(".delegateEvents" + this.cid);
this.artworkInfo.remove()
},
scrollPanelXScroll: function (a, b, j, f) {
var d = $(".rows .left-c-box") || $(".rows .right-c-box");
if (d) {
var c = {
currentTarget: d
};
this.hideArtworkInfo(c)
}
},
showArtworkInfo: function (c) {
var a = $(c.currentTarget);
var b = a.find("img");
this.populateArtworkInfoPanel(a);
this.positionArtworkInfoPanel(b);
if (this.isPushRight(b)) {
a.addClass("right-c-box");
this.artworkInfo.addClass("left-c-box")
} else {
a.addClass("left-c-box");
this.artworkInfo.addClass("right-c-box")
}
this.artworkInfo.show()
},
hideArtworkInfo: function (b) {
this.artworkInfo.hide();
var a = $(b.currentTarget);
a.removeClass("right-c-box");
a.removeClass("left-c-box");
this.artworkInfo.removeClass("right-c-box");
this.artworkInfo.removeClass("left-c-box")
},
isPushRight: function (a) {
return $(a).offset().left - $(".main-content").scrollLeft() - this.artworkInfo.outerWidth(true) - parseInt($(".content-with-sidebar").css("margin-left"), 10) <= 0
},
populateArtworkInfoPanel: function (b) {
var a = b.data("model");
this.artworkInfo.find("h4").text(ap.truncatewords(a.attributes.title, 8));
if (a.attributes.pretty_display_date) {
this.artworkInfo.find(".date").html(a.attributes.pretty_display_date)
} else {
this.artworkInfo.find(".date").html("")
}
this.artworkInfo.find(".artist").html(a.artistDisplayName());
this.artworkInfo.find(".museum").html(a.attributes.collection_display_name)
},
positionArtworkInfoPanel: function (b) {
this.artworkInfo.css("top", $(b.context).offset().top);
this.artworkInfo.css("min-height", b.height());
var a = 2;
if (this.isPushRight(b)) {
this.artworkInfo.css("left", $(b).offset().left - $(".main-content").scrollLeft() + b.context.offsetWidth - a)
} else {
this.artworkInfo.css("left", $(b).offset().left - $(".main-content").scrollLeft() - this.artworkInfo.outerWidth(true) + a)
}
},
render: function () {
this.artworkInfo = $("#artwork-info");
if (!this.artworkInfo.length) {
this.el.append(this.template);
this.artworkInfo = $("#artwork-info")
}
}
});
ap.namespace("ap.aggregation.layout").ArtworkInfoFixedView = Backbone.View.extend({
el: $(".artwork-info-fixed"),
artworkInfo: [],
template: '<div class="artwork-info-fixed" style="display: none;"><h4><%= title %></h4><p class="date"><%= date %></p><p class="artist"><%= artist %></p><p class="museum"><%=collection %></p></div>',
events: {},
initialize: function () {
_.bindAll(this, "render")
},
reinitialise: function () {
$(this.artworkInfo).remove();
this.artworkInfo = []
},
showArtworkInfo: function () {
var a = this;
var b = $(".artwork").not($(".artwork-info-fixed").parent());
_.each(b,
function (c) {
var d = $(c);
d.append(a.getArtworkInfoPanel(d.data("model")))
});
this.artworkInfo = $(".artwork-info-fixed");
this.artworkInfo.show()
},
hideArtworkInfo: function () {
this.artworkInfo.hide()
},
getArtworkInfoPanel: function (a) {
var c = "";
if (a) {
var b = {
title: ap.truncatewords(a.attributes.title, 8),
date: "",
artist: a.artistDisplayName(),
collection: a.attributes.collection_display_name
};
if (a.attributes.pretty_display_date) {
b.date = a.attributes.pretty_display_date
}
c = _.template(this.template, b)
}
return c
},
render: function () {
this.showArtworkInfo()
},
remove: function () {
this.hideArtworkInfo()
}
});
ap.namespace("ap.aggregation.layout").ArtworkInfo = Backbone.View.extend({
initialize: function () {
_.bindAll(this, "render", "removeArtworkInfo", "setArtworkInfo")
},
artworkInfoPopupView: null,
artworkInfoFixedView: null,
removeArtworkInfo: function () {
this.artworkInfoPopupView.remove();
if (this.artworkInfoFixedView != null) {
this.artworkInfoFixedView.remove()
}
},
setArtworkInfo: function () {
if (ap.aggregation.layout.Global.currentRowView.artworkInfo == "popup") {
this.artworkInfoPopupView.attach()
} else {
if (ap.aggregation.layout.Global.currentRowView.artworkInfo == "fixed") {
if (this.artworkInfoFixedView == null) {
this.artworkInfoFixedView = new ap.aggregation.layout.ArtworkInfoFixedView({
collection: this.collection
})
}
this.artworkInfoFixedView.render()
}
}
},
render: function () {
if (!ap.isMobile) {
this.artworkInfoPopupView = new ap.aggregation.layout.ArtworkInfoPopupView({
collection: this.collection
})
} else {
this.artworkInfoPopupView = new ap.mobile.aggregation.ArtworkInfoPopupView({
collection: this.collection
})
}
this.artworkInfoPopupView.render()
}
});
ap.namespace("ap.artwork").OptionsView = Backbone.View.extend({
el: $("body"),
spinnerTemplate: '<span class="spinner"><span class="icon"></span></span>',
events: {
"mouseenter .main-content .artwork": "showOptions",
"mouseleave .main-content .artwork": "hideOptions"
},
initialize: function () {
ap.log("ap.artwork.OptionsView.init");
this.template = _.template($("#artwork-options-template").html(), {
anonymous_user: !ap.userIsAuthenticated
})
},
hideOptions: function (b) {
var a = $(b.currentTarget);
a.find(".artwork-options").remove()
},
showOptions: function (b) {
var a = $(b.currentTarget);
var c = a.find(".artwork-options");
if (!c.length) {
a.append(this.template)
}
a.find(".start-slideshow").css({
top: a.data("view").currentHeight - 15,
bottom: "auto"
})
}
});
ap.namespace("ap.aggregation.layout").ArtworkView = Backbone.View.extend({
tagName: "a",
className: "row-item artwork hasMagnifier",
template: '<img style="<%= style %>" src="<%= img_path %>" alt="<%= title %>" width="<%= width %>" />',
spinnerTemplate: '<span class="spinner"><span class="icon"></span></span>',
giga_pixel_template: '<span class="gpxl"></span>',
gpxl: null,
events: {
click: "clickCallback",
recalculateWidth: "recalculateWidth",
"click .add-to-collection": "addToCollection",
"click .start-slideshow": "startSlideshow",
load: "removeSpinner"
},
options: {
imageSize: 200,
addExtraOptions: false
},
currentHeight: 0,
currentWidth: 0,
initialize: function () {
_.bindAll(this, "render", "clickCallback", "startSlideshow", "addToCollectionComplete");
this.parentView = this.options.parentView
},
removeSpinner: function (a) {
return $(this.el).parent().find(".spinner").remove()
},
addToCollection: function (a) {
if (ap.userIsAvailable && ap.userIsAuthenticated) {
a.preventDefault()
}
if (!$(a.currentTarget).hasClass("done")) {
var f = $(this.el);
f.append(this.spinnerTemplate);
var c = f.find("span.add-to-collection span:first");
c.css("display", "none");
var b = this;
var e = {
artwork: ap.buildApiUrl(["artwork", this.model.attributes.id], false, false, true),
part_x: 0,
part_y: 0,
part_zoom: 1
};
var d = new ap.UserBookmark(e);
d.save({}, {
success: function (k, j) {
b.addToCollectionComplete();
ap.bookmarks.updateUnassignedCount(1)
},
noGet: true
})
}
},
addToCollectionComplete: function () {
var a = this;
ap.trackAddToGallery({
aw_slug: a.model.get("slug"),
aw_id: a.model.get("id"),
source: "aggregation"
}, a.model.get("collection_analytics_id"));
$el = $(a.el);
$addIcon = $el.find("span.add-to-collection");
var b = $addIcon.find("span:first");
b.css("display", "block");
$el.find(".spinner").addClass("done highlight");
setTimeout(function () {
$el.find(".spinner").fadeOut(500,
function () {
$(this).remove()
})
}, 1000)
},
startSlideshow: function (b) {
b.preventDefault();
var a = this.bookmarkModel || this.model;
this.parentView.sidebar.remoteStartSlideshow(a)
},
clickCallback: function (a) {
if (this.options.clickCallback) {
this.options.clickCallback(a, this);
return false
}
},
resize: function (a, f, d) {
var c = this;
if (d !== false) {
d = true
}
var b = c.model.attributes;
var j = $(c.el).find("img").eq(0);
if (a > 512) {
a = 512
}
var e = Math.round(a * b.primary_image_aspect_ratio);
if (e > 512) {
e = 512;
a = Math.round(e / b.primary_image_aspect_ratio)
}
c.currentHeight = a;
c.currentWidth = e;
if (d) {
j.animate({
height: a,
width: e
},
function () {
$(j).attr("width", e);
c.positionGigapixelIndicator()
})
} else {
j.css({
height: a,
width: e
},
function () {
$(j).attr("width", e)
});
c.positionGigapixelIndicator()
}
},
positionGigapixelIndicator: function () {
if (this.gpxl) {
this.gpxl.css({
top: this.currentHeight - 7,
bottom: "auto"
})
}
},
recalculateWidth: function (b) {
var a = $(this.el).find("img").eq(0);
var c = height;
if (this.model.attributes.primary_image_aspect_ratio < 1) {
c = Math.round(height * this.model.attributes.primary_image_aspect_ratio)
}
a.attr("width", c)
},
render: function (f, e, k) {
var c = this.model.bookmark || this.model,
a = c.artwork || c;
if (f.width && !f.height) {
if (f.width > 512) {
f.width = 512
}
f.height = Math.round(f.width / a.primary_image_aspect_ratio);
if (f.height > 512) {
f.height = 512;
f.width = Math.round(f.height * a.primary_image_aspect_ratio)
}
} else {
if (!f.width && f.height) {
if (f.height > 512) {
f.height = 512
}
f.width = Math.round(f.height * a.primary_image_aspect_ratio);
if (f.width > 512) {
f.width = 512;
f.height = Math.round(f.width / a.primary_image_aspect_ratio)
}
}
}
var j = c.calculateImageSizeForAPI(f);
var b = (k) ? "max-height: " + f.maxHeight + " px; max-width: " + f.maxWidth + "px" : "height: " + f.height + "px;";
var d = {
img_path: c.image(j),
title: a.title,
style: b,
width: f.width
};
this.currentHeight = f.height;
this.currentWidth = f.width;
if (this.options.zoomState) {
$(this.el).attr("href", ap.getLocaleUrl(c.attributes.detail_url) + "?" + $.param(this.options.zoomState))
} else {
$(this.el).attr("href", ap.getLocaleUrl(c.attributes.detail_url))
}
$(this.el).attr("data-cid", c.cid);
$(this.el).attr("data-vieworder", c.viewOrder);
$(this.el).attr("data-imageurl", c.attributes.aggregation_image_url);
$(this.el).attr("data-slug", c.attributes.slug);
$(this.el).attr("data-artwork-id", c.attributes.id);
$(this.el).data("model", c);
$(this.el).data("view", this);
if (this.options.noMagnifier === true) {
$(this.el).removeClass("hasMagnifier")
}
$(this.el).html(_.template(this.template, d));
if (c.attributes.primary_asset_is_gigapixel) {
$(this.el).append(this.giga_pixel_template);
this.gpxl = $(this.el).find(".gpxl").eq(0)
}
return this
}
});
ap.namespace("ap.aggregation.layout").ArtworkMagnifierView = Backbone.View.extend({
el: $(".main-content"),
template: '<span class="artwork-magnifier"></span>',
magnifier: null,
imageZoomRatio: null,
imageTopOffset: null,
imageLeftOffset: null,
verticalBoundry: null,
horizontalBoundry: null,
hasScrolled: false,
imagePreload: null,
events: {
"mousemove a.artwork.hasMagnifier": "moveMagnifier",
"mouseenter a.artwork.hasMagnifier": "showMagnifier",
"mouseleave a.artwork.hasMagnifier": "hideMagnifier",
"jsp-scroll-x .scroll-pane": "scrollPanelXScroll"
},
initialize: function () {
_.bindAll(this, "render", "preloadHighResolutionImage", "imagePreloaded");
this.imagePreload = new ap.system.imagePreload("magnifier", {
imageLoaded: this.imagePreloaded
})
},
scrollPanelXScroll: function () {
this.hasScrolled = true
},
showMagnifier: function (a) {
this.render();
this.updateMagnifierImage(a)
},
updateMagnifierImage: function (b) {
var a = $(b.currentTarget).find("img");
this.imagePreload.abort();
this.imageZoomRatio = a.height() / ap.aggregation.layout.Global.currentRowView.zoom.image.height;
this.setImageOffset(a);
this.setMaginifierContainer(a);
this.setMagnifiedImage(a);
this.preloadHighResolutionImage(a)
},
setImageOffset: function (b) {
var a = b.outerHeight(true) - b.height();
this.imageTopOffset = b.offset().top + a / 2 - $(window).scrollTop();
this.imageLeftOffset = b.offset().left + a / 2 - $(window).scrollLeft()
},
preloadHighResolutionImage: function (c) {
var a = c.parents("a").data("model");
var b = this;
this.imagePreload.addToQueue(a.image(a.calculateImageSizeForAPI({
height: ap.aggregation.layout.Global.currentRowView.zoom.image.height
})), b.magnifier);
this.imagePreload.load()
},
imagePreloaded: function (a, b) {
b.css("background-image", "url(" + a.src + ")")
},
setMaginifierContainer: function (b) {
this.magnifier = $(".artwork-magnifier");
var a = {
"background-image": "url(" + b.attr("src") + ")",
height: b.height() < ap.aggregation.layout.Global.currentRowView.zoom.size ? b.height() : ap.aggregation.layout.Global.currentRowView.zoom.size + "px",
left: b.position().left + b.outerWidth() - parseInt(b.css("padding-right")) - this.magnifier.outerWidth(true),
top: b.position().top + b.outerHeight() - parseInt(b.css("padding-bottom")) - this.magnifier.outerHeight(true),
width: b.width() < ap.aggregation.layout.Global.currentRowView.zoom.size ? b.width() : ap.aggregation.layout.Global.currentRowView.zoom.size + "px"
};
this.magnifier.css(a);
b.parent().append(this.magnifier);
this.magnifier.show()
},
setMagnifiedImage: function (c) {
var a = (1 + this.imageZoomRatio) * c.height();
var b = (1 + this.imageZoomRatio) * c.width();
this.verticalBoundry = a - this.magnifier.outerHeight(true);
this.horizontalBoundry = b - this.magnifier.outerWidth(true);
this.magnifier.css("background-size", b + "px " + a + "px ")
},
moveMagnifier: function (j) {
if (this.magnifier) {
var f = $(j.currentTarget).find("img");
var d = f.attr("src");
d = d.slice(0, d.lastIndexOf("=s"));
var b = this.magnifier.css("background-image");
b = b.slice(5, b.lastIndexOf("=s"));
if (b !== d) {
this.updateMagnifierImage(j)
}
if (this.hasScrolled) {
this.setImageOffset(f);
this.hasScrolled = false
}
var a = this.zoomPosition(j.clientY, this.imageTopOffset);
var c = this.zoomPosition(j.clientX, this.imageLeftOffset);
c = c >= this.horizontalBoundry ? this.horizontalBoundry : c;
a = a >= this.verticalBoundry ? this.verticalBoundry : a;
this.magnifier.css("background-position", "-" + c + "px -" + a + "px")
}
},
zoomPosition: function (d, c) {
var b = 0;
var a = (d - c - b) * (1 + this.imageZoomRatio) - ap.aggregation.layout.Global.currentRowView.zoom.size / 2;
a = a < 0 ? 0 : a;
return a
},
hideMagnifier: function (a) {
$(".artwork-magnifier").hide()
},
remove: function (a) {
$(".artwork-magnifier").remove()
},
render: function () {
if ($(".artwork-magnifier").length == 0) {
this.el.append(this.template)
}
}
});
ap.namespace("ap.aggregation.layout").BookmarkGroupView = Backbone.View.extend({
tagName: "div",
className: "gallery row-item",
template: $("#aggregation-gallery-view-template").html(),
events: {},
initialize: function () {
_.bindAll(this, "render")
},
render: function () {
var a = this.model.attributes;
if (a.name.match(/^[ \t\r\n]*$/)) {
a.isUntitled = true
}
if (a.absolute_url) {
a.absolute_url = ap.getLocaleUrl(a.absolute_url)
}
$(this.el).data("model", this.model);
var c = _.template(this.template, a);
var b = $(c);
$(this.el).html(b);
return this
}
});
ap.namespace("ap.aggregation.layout").BookmarkArtworkView = ap.aggregation.layout.ArtworkView.extend({
tagName: "a",
className: "row-item artwork hasMagnifier",
template: '<div class="artwork-wrapper"><img style="<%= style %>" class="bookmark-preview" src="<%= img_path %>" alt="<%= title %>" width="<%= width %>" /><span class="crop-wrapper"></span></div>',
artworkModel: null,
bookmarkModel: null,
initialize: function () {
this.bookmarkModel = this.model;
this.model = new ap.Artwork(this.model.get("is_public") ? this.model.get("artwork") : this.model);
this.model.attributes.detail_url = this.bookmarkModel.attributes.absolute_url;
ap.aggregation.layout.ArtworkView.prototype.initialize.apply(this, [this.options])
},
render: function (d, c, e) {
ap.aggregation.layout.ArtworkView.prototype.render.apply(this, [d, c, e]);
ap.log("Drawing box", "info");
var a = $(this.el).find(".bookmark-preview");
var b = this.bookmarkModel;
ap.drawCrop(a, $(this.el).find(".crop-wrapper"), b.get("part_x"), b.get("part_y"), b.get("part_zoom"))
},
});
ap.namespace("ap.aggregation.layout").PreloaderView = Backbone.View.extend({
el: $(".main-content.scroll-pane"),
processManager: null,
preLoaderTemplate: '<div style="display: none" class="preloader">' + TRANSLATIONS.loading + "</div>",
preloader: null,
currentCSS: {},
options: {
useDefaultPreloader: true,
},
initialize: function () {
var a = this;
_.bindAll(this, "render", "displayPreloader", "hidePreloader");
if (this.options.useDefaultPreloader) {
this.preloader = $(this.preLoaderTemplate)
}
this.processManager = new ap.system.ProcessManager("paging");
$(this.processManager).bind("processStarted_paging",
function () {
a.displayPreloader()
});
$(a.processManager).bind("processReset_paging",
function () {
a.showOnLeft = true
});
$(a.processManager).bind("processEnded_paging",
function () {
a.hidePreloader();
a.showOnLeft = false
});
$(this.processManager).bind("processTerminated_paging",
function () {
a.hidePreloader()
})
},
displayPreloader: function (a) {
if (this.options.useDefaultPreloader) {
if (a !== undefined && a === true || this.showOnLeft === true) {
this.preloader.addClass("left");
this.positionPreloader(this.currentCSS, true)
}
this.preloader.show()
}
},
hidePreloader: function () {
if (this.options.useDefaultPreloader) {
this.preloader.removeClass("left");
this.preloader.hide()
}
},
positionPreloader: function (a, b) {
this.currentCSS = $.extend({}, a);
if (this.preloader.hasClass("left")) {
if (a.right != undefined) {
delete a.right
}
if (a["margin-right"] != undefined) {
delete a["margin-right"]
}
} else {
if (a.left != undefined) {
delete a.left
}
if (a["margin-left"] != undefined) {
delete a["margin-left"]
}
}
if (!b && this.preloader.is(":visible")) {
this.preloader.animate(a, {
queue: false
})
} else {
this.preloader.css(a)
}
},
render: function () {
if (this.options.useDefaultPreloader) {
this.el.append(this.preloader)
}
}
});
ap.namespace("ap.aggregation.layout").SetupRow = function () {
var b = ap.aggregation.layout.Global.currentRowView;
var a = 75;
this.setRowconfig = function () {
if (ap.aggregation.layout.Global.currentRowView.hasVariableNumberOfRows) {
var j = c();
var k = e(j);
var f = k - (b.image.padding * 2);
if (f < b.minHeight) {
f = b.minHeight;
j = c(f);
k = f + (b.image.padding * 2)
} else {
if (f > b.maxHeight) {
f = b.maxHeight;
j = c(f);
k = f + (b.image.padding * 2)
}
}
b.image.height = f;
b.numberOfRows = j;
d(j, f)
} else {
d()
}
};
function d(j, f) {
if (_.isUndefined(j)) {
j = b.numberOfRows
}
if (_.isUndefined(f)) {
f = e() - (b.image.padding * 2);
b.image.height = f
}
var k = b.zoom.image.height / b.image.height;
b.zoom.image.height = Math.ceil(f * k)
}
function c(f) {
if (_.isUndefined(f)) {
f = b.image.height
}
var l = $(".main-content").height() - a;
var k = f + (b.image.padding * 2);
var j = Math.floor(l / k);
if (j == 0) {
j = 1
}
return j
}
function e(f) {
var k = a;
if (_.isUndefined(f)) {
f = b.numberOfRows;
if (f == 1) {
k = 170
}
}
var j = $(".main-content").height() - (k);
if (f) {
rowHeight = parseInt(j / f)
} else {
if (rowHeight > b.maxHeight) {
rowHeight = b.maxHeight
}
}
return rowHeight
}
};
ap.namespace("ap.aggregation.layout").InfiniteScrollingView = Backbone.View.extend({
processManagerPaging: null,
processManagerAggregationZoom: null,
lastXPosition: 0,
jScrollPaneApi: null,
artworkInfo: null,
scrollTriggerOffset: 150,
xScrollTriggers: {
load: 0,
triggerArtwork: null
},
events: {},
selector: ".row .row-item:last-child",
initialize: function () {
var a = this;
_.bindAll(a, "render", "setArtworkScrollTrigger", "scrollPanelXScroll", "reinitialise", "logEnded", "logStarted", "logTerminated");
if (a.options.selector) {
a.selector = a.options.selector
}
if (a.options.scrollTriggerOffset) {
a.scrollTriggerOffset = a.options.scrollTriggerOffset
}
a.jScrollPaneApi = a.options.jScrollPaneApi;
a.artworkInfo = a.options.artworkInfo;
a.processManagerPaging = new ap.system.ProcessManager("paging");
a.processManagerAggregationZoom = new ap.system.ProcessManager("aggregationZoom");
$(a.processManagerPaging).bind("processEnded_paging", a.reinitialise);
$(a.processManagerPaging).bind("processTerminated_paging", a.reinitialise);
$(a.processManagerAggregationZoom).bind("processEnded_aggregationZoom", a.reinitialise);
$(a.processManagerPaging).bind("processStarted_paging", a.logStarted);
$(a.processManagerPaging).bind("processEnded_paging", a.logEnded);
$(a.processManagerPaging).bind("processTerminated_paging", a.logTerminated);
a.xScrollTriggers.load = $(document).width() + 400;
a.setArtworkScrollTrigger()
},
logStarted: function () {
ap.log("I started my job", "info")
},
logEnded: function () {
ap.log("I finished my job", "info")
},
logTerminated: function () {
ap.log("Someone finished my job", "warn")
},
isMovingRight: function (a) {
return a > this.lastXPosition
},
scrollPanelXScroll: function (b, e, j, f) {
var a = this;
if (!a.processManagerPaging.isBusy && !a.processManagerPaging.isTerminated) {
var d = a.options.jScrollPaneApi.getContentPositionX();
if (a.isMovingRight(d) && d > a.lastXPosition + a.scrollTriggerOffset) {
var c = a.xScrollTriggers.triggerArtwork.offset().left;
if (c <= a.xScrollTriggers.load) {
a.collection.nextPage()
}
a.lastXPosition = d
}
}
},
reinitialise: function () {
var a = this;
if (a.artworkInfo) {
a.artworkInfo.setArtworkInfo()
}
a.setArtworkScrollTrigger();
a.lastXPosition = 0
},
setArtworkScrollTrigger: function () {
var a = this;
a.xScrollTriggers.triggerArtwork = null;
$(a.selector).each(function () {
a.xScrollTriggers.triggerArtwork = a.xScrollTriggers.triggerArtwork || $(this);
a.xScrollTriggers.triggerArtwork = $(this).position().left < a.xScrollTriggers.triggerArtwork.position().left ? $(this) : a.xScrollTriggers.triggerArtwork
})
},
render: function () {
var a = this;
if (ap.isMobile) {
$(".scroll-pane").on("scroll", a.scrollPanelXScroll)
} else {
$(".scroll-pane").on("jsp-scroll-x", a.scrollPanelXScroll)
}
}
});
ap.namespace("ap.aggregation.layout").RowRender = function (b) {
var c = {
isPrepend: false
};
$.extend(c, b);
var e = {};
a();
function a() {
for (var j = 1; j <= 10; j++) {
var f = $("<div></div>");
f.ownerDocument = document;
e[j] = f
}
}
var d = ap.aggregation.layout.Global.lastRow;
this.addToNextRow = function (k, l, m) {
var f = m || (d >= ap.aggregation.layout.Global.currentRowView.numberOfRows ? 1 : d + 1);
var j = e[f];
if (c.isPrepend) {
$(j).prepend(k)
} else {
$(j).append(k)
}
e[f] = $(j);
d = f
};
this.RenderRows = function (f) {
var k = e.length;
for (var l = 1; l <= ap.aggregation.layout.Global.currentRowView.numberOfRows; l++) {
var j = $(".row-" + l);
if (f) {
j.empty()
}
if (c.isPrepend) {
j.prepend($(e[l]).html())
} else {
j.append($(e[l]).html())
}
}
ap.aggregation.layout.Global.lastRow = d
}
};
ap.namespace("ap.aggregation.layout").PageLoading = {
needToLoadMore: function () {
var b = $(".content-with-sidebar").width();
var a = ap.aggregation.layout.RowFormat.rowWidths.minWidth;
if (a - 200 < b) {
var c = Math.round(b / a);
if (c > 0) {
return true
}
return false
}
return false
}
};
ap.namespace("ap.aggregation.layout").RowFormat = {
rowWidths: {
minWidth: 320000,
maxWidth: 0
},
setRowWidth: function (c) {
var b = ap.aggregation.layout.RowFormat.rowWidths;
b.minWidth = 320000;
b.maxWidth = 0;
if (c) {
var a = 200;
$("div.row:visible").each(function (o) {
var q = $(this);
var p = q.children(".row-item");
var m = p.eq(0);
var k = 0;
var r = p.size();
var l = 0 + parseInt(m.css("padding-left"), 10) + parseInt(m.css("padding-right"), 10);
var e = 0 + parseInt(m.css("border-left-width"), 10) + parseInt(m.css("border-right-width"), 10);
var s = 0;
var f = parseInt(m.css("marginLeft"), 10);
var n = parseInt(m.css("marginRight"), 10);
var j;
if (f) {
s += f
}
if (n) {
s += n
}
j = l + s + e;
for (var d = 0; d < r; d++) {
k += p.eq(d).width() + j
}
if (k > 0) {
k += a;
if (k < b.minWidth) {
b.minWidth = k
}
if (k > b.maxWidth) {
b.maxWidth = k
}
q.width(k)
} else {
if (k === 0) {
q.width(k)
}
}
});
return b
} else {
$("div.row").width(320000);
return b
}
},
resetRowWidth: function () {
$("div.row:visible").width(0)
},
renderToNextRow: function (b, d, e) {
var a = e || (ap.aggregation.layout.Global.lastRow >= ap.aggregation.layout.Global.currentRowView.numberOfRows ? 1 : ap.aggregation.layout.Global.lastRow + 1);
var c = $(".row-" + a);
if (d) {
c.prepend(b)
} else {
c.append(b)
}
ap.aggregation.layout.Global.lastRow = a
}
};
ap.namespace("ap.aggregation.layout").RowsView = Backbone.View.extend({
artworkInfoPopupView: null,
artworkInfoFixedView: null,
artworkInfoView: null,
infiniteScrollingView: null,
jScrollPaneApi: null,
magnifierView: null,
processManagerAggregationZoom: null,
firstTimeLoad: true,
currentAnchorImage: null,
parentView: null,
useRowAnimations: false,
events: {
"click .view-options a": "viewXRows"
},
initialize: function () {
_.bindAll(this, "render", "zoomChangeImageReorder", "progressiveImageShow", "formatRows", "animateRow", "viewXRows", "imageReOrderCompleted");
var a = this;
a.jScrollPaneApi = a.options.jScrollPaneApi;
a.parentView = a.options.parentView;
a.processManagerAggregationZoom = new ap.system.ProcessManager("aggregationZoom")
},
viewXRows: function (f) {
var b = this;
var d = $(f.target).data("row-id");
var k = $(".row-1");
var j = k.parent().position().left;
var a = $("#sidebar").outerWidth() + $("#sidebar").position().left;
var c = $(".row-1 a.artwork");
$.each(c,
function (l, e) {
var m = $(e).offset().left - a;
if (m >= 0) {
b.currentAnchorImage = $(e);
return false
}
});
this.rowView(d)
},
rowView: function (c) {
var b = c.toLowerCase();
var a = "view-" + b + "-rows";
$(".view-options a.current").removeClass("current");
$(".view-options .view-option-" + b).addClass("current");
if (!$("body").hasClass(a)) {
_.each($(".view-options a"),
function (d) {
$("body").removeClass("view-" + $(d).data("row-id").toLowerCase() + "-rows")
});
$("body").addClass("view-" + b + "-rows");
if (this.options.aggregationConfig.dynamicRows) {
this.aggregationZoomChange(c)
}
} else {
if (this.artworkInfo) {
this.artworkInfo.removeArtworkInfo();
this.artworkInfo.setArtworkInfo()
}
}
},
aggregationZoomChange: function (j, f) {
var c = this;
if (_.isUndefined(f)) {
f = false
}
c.processManagerAggregationZoom.start();
c.artworkInfoView.removeArtworkInfo();
var a = ap.aggregation.layout.Global.currentRowView;
var e = ap.aggregation.layout.Global.currentRowView = ap.aggregation.layout.Config["rowView" + j];
var b = a.image.height < e.image.height;
var d = new ap.aggregation.layout.SetupRow();
d.setRowconfig();
ap.aggregation.layout.Global.lastRow = 0;
ap.aggregation.layout.RowFormat.setRowWidth(true);
if (f) {
c.animationCompleted()
} else {
c.animateRow(e, b)
}
},
animationCompleted: function () {
var a = this;
a.formatRows();
a.zoomChangeImageReorder();
a.firstTimeLoad = false
},
imageReOrderCompleted: function () {
var a = this;
a.artworkInfoView.setArtworkInfo();
if (!a.firstTimeLoad) {
a.setImageResolutionForZoom()
}
ap.aggregation.layout.RowFormat.setRowWidth(true);
a.jScrollPaneApi.reinitialise();
if (!a.jScrollPaneApi.getIsScrollableH()) {
a.jScrollPaneApi.getContentPane().animate({
left: 0
})
} else {
if (a.currentAnchorImage) {
a.jScrollPaneApi.scrollToElement(a.currentAnchorImage, true)
}
}
a.processManagerAggregationZoom.end();
if (ap.aggregation.layout.PageLoading.needToLoadMore()) {
a.collection.nextPage()
}
},
setImageResolutionForZoom: function () {
var a = this;
var b = new ap.system.imagePreload("imageZoomResolution", {
imageLoaded: function (d, e) {
var c = $(e).find("img").attr("src", d.src)
},
batchLoaded: function () {
a.artworkInfoView.setArtworkInfo()
}
});
$(".rows a").each(function () {
var f = this;
var e = $(f);
var c = e.data("model");
if (c) {
var d = c.calculateImageSizeForAPI({
height: ap.aggregation.layout.Global.currentRowView.image.height
});
b.addToQueue(c.image(d), f)
}
});
b.load()
},
formatRows: function () {
for (var a = 1; a <= $("div.row").length; a++) {
if (a <= ap.aggregation.layout.Global.currentRowView.numberOfRows) {
$(".row-" + a).show()
} else {
$(".row-" + a).hide()
}
}
},
animateRow: function (c, f) {
var e = this;
var b = _.groupBy($("div.main-content .artworks img"), this.isElementInView);
var j = b[true];
var d = b[false];
if (_.isUndefined(j) || _.isNull(j)) {
return
}
if (!e.firstTimeLoad) {
$(j).attr("width", "");
$(d).attr("width", "")
}
if (!e.firstTimeLoad && !f) {
e.imagesSizeChangeNoAnimate(c, d)
}
var a = null;
$.each(j,
function (k, l) {
heightToUse = c.image.height;
a = $(l).parents("a").data("view");
if (a) {
a.resize(c.image.height, c.maxHeight, e.useRowAnimations)
}
});
if (e.useRowAnimations) {
setTimeout(function () {
if (f) {
e.imagesSizeChangeNoAnimate(c, d)
}
e.animationCompleted()
}, 500)
} else {
if (f) {
e.imagesSizeChangeNoAnimate(c, d)
}
e.animationCompleted()
}
e.firstTimeLoad = false
},
imagesSizeChangeNoAnimate: function (a, b) {
if (b) {
$.each(b,
function (c, d) {
view = $(d).parents("a").data("view");
if (view) {
view.resize(a.image.height, a.maxHeight, false)
}
})
}
},
isElementInView: function (c) {
var e = $(window).scrollLeft();
var d = e + $(window).width();
var b = $(c).offset().left;
var a = b + $(c).width();
return ((a >= e) && (b <= d))
},
zoomChangeImageReorder: function () {
var a = null;
for (var b = 1; b <= ap.aggregation.layout.Global.numberOfImages; b++) {
a = this.parentView.fullViewArray[b - 1];
if (a) {
ap.aggregation.layout.RowFormat.renderToNextRow(a.el)
}
}
setTimeout(this.imageReOrderCompleted, 200)
},
progressiveImageShow: function (f) {
var c = 0;
var e = _.sortBy($("div.main-content .artworks img"),
function (k) {
return $(k).parent().data("vieworder")
});
var b = _.groupBy($(e), this.isElementInView);
var j = b[true];
var d = b[false];
if (j) {
var a = j.length;
if (f != null) {
f()
}
}
},
render: function (c) {
var b = this;
var a = $("div.main-content .artworks img");
this.artworkInfoView = new ap.aggregation.layout.ArtworkInfo();
this.artworkInfoView.render();
if (!b.options.aggregationConfig.isSearch) {
if (ap.userIsAvailable) {
ap.log("userDataLoaded in rowsview.render");
if (!ap.isMobile) {
this.artworkOptionsView = new ap.artwork.OptionsView()
} else {
this.artworkOptionsView = new ap.mobile.artwork.OptionsView()
}
this.artworkOptionsView.render()
} else {
b.parentView.bind("userDataLoaded",
function () {
ap.log("userDataLoaded in rowsview.render");
if (!ap.isMobile) {
this.artworkOptionsView = new ap.artwork.OptionsView()
} else {
this.artworkOptionsView = new ap.mobile.artwork.OptionsView()
}
this.artworkOptionsView.render()
})
}
}
this.infiniteScrollingView = new ap.aggregation.layout.InfiniteScrollingView({
el: b.el,
jScrollPaneApi: this.jScrollPaneApi,
rowFormat: ap.aggregation.layout.RowFormat,
collection: this.collection,
artworkInfo: this.artworkInfoView
});
this.infiniteScrollingView.render();
if (!ap.isMobile) {
this.artworkMagnifierView = new ap.aggregation.layout.ArtworkMagnifierView({
rowView: ap.aggregation.layout.Global.currentRowView
});
this.artworkMagnifierView.render()
}
this.rowView(c)
}
});
ap.namespace("ap.aggregation.layout").WheelScrollingView = Backbone.View.extend({
events: {
"mousewheel .scroll-pane": "scrollPanelWheel"
},
jScrollPaneApi: null,
initialize: function () {
_.bindAll(this, "render");
this.jScrollPaneApi = this.options.jScrollPaneApi
},
scrollPanelWheel: function (c, d, b, a) {
this.jScrollPaneApi.scrollByX(d * -150);
return false
},
remove: function () {
var a = $(".scroll-pane");
a.unbind("mousewheel")
},
render: function () {
var a = $(".scroll-pane");
a.bind("mousewheel")
}
});
ap.namespace("ap.aggregation.layout").FloatingArrowScrollingView = Backbone.View.extend({
jScrollPaneApi: null,
floatingArrowLeft: null,
floatingArrowRight: null,
isHoverOverArrow: false,
_isAtLeft: true,
_isAtRight: false,
contentPane: null,
mainPane: null,
options: {
scrollBy: 600,
hideAfter: 1000,
arrowPosition: "far"
},
template: '<a class="floating-arrow-left" href="#"><span class="arrow"></span></a><a class="floating-arrow-right" href="#"><span class="arrow"></span></a>',
events: {
"click .floating-arrow-left": "floatingArrowLeft_Click",
"click .floating-arrow-right": "floatingArrowRight_Click",
"mouseover .floating-arrow-left": "floatingArrowLeft_Mouseover",
"mouseout .floating-arrow-left": "floatingArrowLeft_Mouseout",
"mouseover .floating-arrow-right": "floatingArrowRight_Mouseover",
"mouseout .floating-arrow-right": "floatingArrowRight_Mouseout",
},
initialize: function () {
_.bindAll(this, "render", "followMouseY", "scroll", "atLeftRight");
this.jScrollPaneApi = this.options.jScrollPaneApi;
this.contentPane = this.jScrollPaneApi.getContentPane();
this.mainPane = this.jScrollPaneApi.getContentPane().parent().parent()
},
floatingArrowLeft_Click: function (a) {
this.options.scrollLeftHandler(a);
return false
},
floatingArrowRight_Click: function (a) {
this.options.scrollRightHandler(a);
return false
},
floatingArrowLeft_Mouseover: function (a) {
this.isHoverOverArrow = true
},
floatingArrowLeft_Mouseout: function (a) {
this.isHoverOverArrow = false
},
floatingArrowRight_Mouseover: function (a) {
this.isHoverOverArrow = true
},
floatingArrowRight_Mouseout: function (a) {
this.isHoverOverArrow = false
},
atLeftRight: function (a, b, d, c) {
this._isAtLeft = d;
this._isAtRight = c;
if (d) {
this.floatingArrowLeft.hide()
} else {
this.floatingArrowLeft.show()
}
if (c) {
this.floatingArrowRight.hide()
} else {
this.floatingArrowRight.show()
}
},
followMouseY: function (f) {
var b = this;
var a = 24;
var j = b.floatingArrowRight.height() / 2;
window.clearTimeout("floatingpagearrows");
if (!b._isAtLeft) {
b.floatingArrowLeft.not(":visible").fadeIn("slow")
}
if (!b._isAtRight) {
b.floatingArrowRight.not(":visible").fadeIn("slow")
}
if (c(f) || d(f)) {
if (b.options.hideAfter) {
b.leaveMouseFollowArea("fast")
}
} else {
b.floatingArrowRight.css("top", f.clientY);
b.floatingArrowLeft.css("top", f.clientY);
if (b.options.hideAfter) {
$.doTimeout("floatingpagearrows", b.options.hideAfter,
function () {
if (!b.isHoverOverArrow) {
b.leaveMouseFollowArea("slow");
return false
}
return true
})
}
}
function c(k) {
return k.clientY + j > b.contentPane.offset().top + b.contentPane.outerHeight(true)
}
function d(k) {
return k.clientY - j < b.contentPane.offset().top
}
},
leaveMouseFollowArea: function (a) {
this.floatingArrowLeft.fadeOut(a);
this.floatingArrowRight.fadeOut(a)
},
centerYArrows: function () {
var a = "45%";
this.floatingArrowLeft.css("top", a);
this.floatingArrowRight.css("top", a);
if (this.options.hideAfter) {
this.floatingArrowRight.hide()
}
this.floatingArrowLeft.hide()
},
setArrowPosition: function () {
var a = 0;
var b = this.mainPane.parent().outerWidth() - this.floatingArrowLeft.width();
this.floatingArrowLeft.css({
left: a,
position: "absolute"
});
this.floatingArrowRight.css({
left: b,
position: "absolute"
})
},
scroll: function (a) {
this.jScrollPaneApi.scrollByX(a * this.options.scrollBy)
},
remove: function () {},
render: function () {
this.el = $(this.el);
if (this.options.arrowPosition == "far") {
$(".content-with-sidebar").append(this.template)
} else {
this.el.append(this.template)
}
this.floatingArrowLeft = this.el.find(".floating-arrow-left").eq(0);
this.floatingArrowRight = this.el.find(".floating-arrow-right").eq(0);
this.el.bind("jsp-scroll-x", this.atLeftRight);
if (this.options.arrowPosition == "close") {
this.setArrowPosition()
}
this.leaveMouseFollowArea(0)
}
});
ap.namespace("ap.aggregation.layout").DragScrollingView = Backbone.View.extend({
el: $("body"),
jScrollPaneApi: null,
dragData: {},
events: {
"mousedown .main-content": "startScroll",
"mousemove .main-content": "scroll",
"mouseup .main-content": "stopScroll"
},
initialize: function () {
_.bindAll(this, "render");
this.jScrollPaneApi = this.options.jScrollPaneApi;
$(".main-content").bind("mousedown");
$(".main-content").bind("mouseup");
$(".main-content").bind("mousemove")
},
startScroll: function (a) {
this.dragData.down = true;
this.dragData.x = a.clientX;
this.dragData.scrollLeft = $(".jspPane").scrollLeft();
$("body").addClass("mouse-grabbing");
return false
},
scroll: function (a) {
if (this.dragData.down) {
this.jScrollPaneApi.scrollByX(this.dragData.scrollLeft + this.dragData.x - a.clientX)
}
},
stopScroll: function (a) {
this.dragData.down = false;
$("body").removeClass("mouse-grabbing")
},
remove: function () {
$(".main-content").unbind("mousedown").unbind("mouseup").unbind("mousemove")
},
render: function () {}
});
ap.namespace("ap.aggregation.layout").KeyboardScrollingView = Backbone.View.extend({
el: $("document"),
jScrollPaneApi: null,
events: {},
options: {
scrollBy: 600
},
initialize: function () {
_.bindAll(this, "render", "keyScroll");
$(document).keydown(this.keyScroll)
},
keyScroll: function (b) {
var d = 37;
var a = 39;
var c = $("input:focus").size() + $("textarea:focus").size();
if (c < 1) {
if (b.keyCode == a) {
this.options.scrollRightHandler(b);
return false
} else {
if (b.keyCode == d) {
this.options.scrollLeftHandler(b);
return false
}
}
}
},
remove: function () {
$("document").unbind("keypress")
},
render: function () {}
});
ap.namespace("ap.aggregation.layout").MainScrollingView = Backbone.View.extend({
events: {},
options: {
element: $(".main-content.scroll-pane"),
useFloatingArrows: true,
useDragScrolling: false,
useKeyboardScrolling: true,
useWheelScrolling: true,
scrollBy: 600,
defaults: {},
jScrollPaneSettings: {}
},
floatingArrowScrollingView: null,
dragScrollingView: null,
keyboardScrollingView: null,
wheelScrollingView: null,
jScrollPaneApi: null,
initialize: function () {
_.bindAll(this, "render", "setupDefaults", "scrollLeftHandler", "scrollRightHandler", "doScroll");
var b = this;
b.setupDefaults();
var c = {
showArrows: false,
verticalGutter: 10,
animateScroll: true,
mouseWheelSpeed: 30,
horizontalDragMinWidth: 40,
hijackInternalLinks: true,
horizontalGutter: 60,
enableKeyboardNavigation: false,
maintainPosition: true
};
$.extend(c, b.options.jScrollPaneSettings);
if (b.options.events) {
$.each(b.options.events,
function (d, e) {
b.options.element.bind(d, e)
})
}
var a = b.options.element.pScrollPane(c);
this.jScrollPaneApi = a.data("jsp")
},
setupDefaults: function () {
$.extend(this.options.defaults, {
floatingArrowOptions: {
el: this.el,
scrollLeftHandler: this.scrollLeftHandler,
scrollRightHandler: this.scrollRightHandler
},
keyboardScrollOptions: {
scrollLeftHandler: this.scrollLeftHandler,
scrollRightHandler: this.scrollRightHandler
}
})
},
doScroll: function (a) {
if (this.options.customScrollHandler) {
this.options.customScrollHandler(a)
} else {
this.jScrollPaneApi.scrollByX(a * this.options.scrollBy)
}
},
scrollLeftHandler: function () {
this.doScroll(-1)
},
scrollRightHandler: function () {
this.doScroll(1)
},
remove: function () {},
render: function () {
if (!ap.isMobile) {
if (this.options.useFloatingArrows) {
var b = $.extend({
jScrollPaneApi: this.jScrollPaneApi,
container: this.el
}, this.options.defaults.floatingArrowOptions, this.options.floatingArrowOptions);
this.floatingArrowScrollingView = new ap.aggregation.layout.FloatingArrowScrollingView(b);
this.floatingArrowScrollingView.render()
}
if (this.options.useDragScrolling) {
this.dragScrollingView = new ap.aggregation.layout.DragScrollingView({
jScrollPaneApi: this.jScrollPaneApi
});
this.dragScrollingView.render()
}
if (this.options.useKeyboardScrolling) {
var a = $.extend({}, this.options.defaults.keyboardScrollOptions, this.options.keyboardScrollOptions);
this.keyboardScrollingView = new ap.aggregation.layout.KeyboardScrollingView(a);
this.keyboardScrollingView.render()
}
if (this.options.useWheelScrolling) {
this.wheelScrollingView = new ap.aggregation.layout.WheelScrollingView({
el: this.el,
jScrollPaneApi: this.jScrollPaneApi
});
this.wheelScrollingView.render()
}
}
return this.jScrollPaneApi
}
});
ap.namespace("ap.aggregation.layout").TopFiltersView = Backbone.View.extend({
el: $("#top-filters"),
toggleEls: null,
mainFiltersEl: null,
navEl: null,
filterEls: null,
summaryEl: null,
buttonEls: null,
activeFilters: {},
events: {
"click #main-filters .filter": "activateFilter",
"click #main-filters .bttn-filter": "activateFilter",
"click .toggle.main-filters": "toggleMainFilters",
"click .close-filter": "closeFilter",
"click #main-filters .nav a": "updateTabs",
toggleFilterDisplay: "toggleMainFilters",
closeFilter: "closeFilter"
},
buttons: ["museumView", "gigaPixel", "location", "streetView"],
filterTypes: {
alpha: {
callback: function () {}
},
dateRange: {
callback: function () {
$(".date-range").find(".slider").slider({
range: true,
min: 0,
max: 500,
values: [75, 300],
slide: function (a, b) {}
})
}
},
medium: {},
category: {},
museumView: {},
streetView: {},
gigaPixel: {},
location: {}
},
filterDisplayNames: {
country: "Country"
},
filterButtons: [],
initialize: function () {
var a = this;
ap.log("[Debug] Main filters: Starting init");
_.bindAll(this, "updateTabs", "activateFilter", "updateResults", "toggleFilter", "resetFilters", "setActiveFilter", "removeActiveFilter", "updateSelection", "enableFilter", "toggleMainFilters", "removeFilter", "closeFilter");
this.toggleEls = this.el.find(".toggle");
this.mainFiltersEl = this.el.find("#main-filters");
this.navEl = this.mainFiltersEl.find(".nav");
this.filterEls = this.mainFiltersEl.find(".filter");
this.toggleEls.filter(".main-filters").addClass("enabled");
this.summaryEl = $("#secondary-prop .collection-mutators");
this.buttonEls = this.mainFiltersEl.find(".bttn-filter");
this.parentView = a.options.parentView;
_.each(a.options.filtersToInit,
function (b, c) {
a.enableFilter(b, c, _.indexOf(a.buttons, b.type) !== -1)
});
this.navEl.find("a").first().click();
this.summaryEl.on("click", ".clear-mutator", this.removeFilter);
this.renderSummary();
ap.log("[Debug] Main filters: Finished init")
},
resetFilters: function (b) {
var a = this;
_.each(a.activeFilters,
function (d, c) {
var f = a.el.find('#main-filters [data-filter-key="' + c + '"]'),
e = f.find('[data-filter-value="' + d.val + '"]');
a.toggleFilter(c, d, e, f, b)
})
},
enableFilter: function (j, c, a) {
var e = j.type,
f = this.filterTypes[e],
b = window.TRANSLATIONS && TRANSLATIONS.hasOwnProperty(j.displayNameKey) ? TRANSLATIONS[j.displayNameKey] : j.displayName,
d;
if (typeof f == "undefined") {
ap.log("[Debug] Main filters: " + c + " of type " + e + " has not been found");
return
}
this.filterDisplayNames[c] = b;
if (a) {
ap.log(e + " is a button");
this.el.find("#main-filters > .wrap .filter-" + e).addClass("enabled").attr("data-filter-key", c);
this.filterButtons.push(c)
} else {
d = this.navEl.find(".filter-" + e);
d.text(b).attr("title", b);
d.parent().addClass("enabled");
this.el.find("#main-filters > .wrap > .filter-" + e).attr("data-filter-key", c)
}
if (typeof f.callback === "function") {
f.callback();
ap.log("[Debug] Main filters: " + c + " of type " + e + " callback done")
}
ap.log("[Debug] Main filters: " + c + " of type " + e + " enabled")
},
closeFilter: function () {
this.mainFiltersEl.is(":visible") && this.toggleMainFilters()
},
toggleMainFilters: function (j) {
if (j && j.preventDefault) {
j.preventDefault()
}
var f = $("#page-content > .content-wrapper"),
a = f.children(".content-with-sidebar"),
k = $("#museum-list .mapwrapper"),
b = this,
c = this.mainFiltersEl.is(":visible"),
d = function () {
var m = c ? ["slideUp", 70, 0] : ["slideDown", 0, 6],
e = $(document.documentElement),
l = e.css("overflow");
$("#footer").stop().animate({
height: m[1]
});
e.css({
overflow: "hidden"
});
b.el.find(".close-filter").stop().animate({
top: m[2]
});
b.mainFiltersEl.stop()[m[0]]({
complete: function () {
e.css({
overflow: l
})
},
step: function (p) {
var n = b.mainFiltersEl.height(),
o = b.mainFiltersEl.outerHeight();
f.css({
"padding-bottom": n
});
a.css({
"padding-top": o
});
k.css({
top: o
});
b.parentView.preloaderview.positionPreloader({
"margin-top": o
}, true)
}
})
};
this.toggleEls.filter(".main-filters").toggleClass("open", !c);
b.parentView.trigger(c ? "topFilterClosing" : "topFilterOpening");
d();
return false
},
openMainFilters: function () {
var e = $("#page-content > .content-wrapper"),
a = e.children(".content-with-sidebar"),
f = $("#museum-list .mapwrapper"),
c = this,
d = this.mainFiltersEl.is(":visible"),
b = function () {
var m = ["slideDown", 0, 6, "70px"],
j = $(document.documentElement);
$("#footer").stop().css({
height: m[1]
});
c.el.find(".close-filter").css({
top: m[2]
});
c.mainFiltersEl.show();
var k = c.mainFiltersEl.height(),
l = c.mainFiltersEl.outerHeight();
e.css({
"padding-bottom": k
});
a.css({
"padding-top": l
});
f.css({
top: l
});
c.parentView.preloaderview.positionPreloader({
"margin-top": m[3]
}, true)
};
if (d) {
return
}
this.toggleEls.filter(".main-filters").toggleClass("open", !d);
b()
},
updateTabs: function (a) {
$(a.delegateTarget).find("dd").removeClass("active").filter(a.currentTarget.parentNode).addClass("active");
this.filterEls.removeClass("active").filter("." + $(a.currentTarget).data("filter-name")).addClass("active");
a.preventDefault()
},
getNewResults: function (b, c, a) {
var d;
ap.log("[stub]: request for filter by " + b + ", with value " + c);
d = "[new results]";
if (a && typeof a.callback === "function") {
a.callback(d, a.el)
} else {
return d
}
},
updateSelection: function (a) {
this.filterEls.find(".active").removeClass("active");
$(a).addClass("active")
},
updateResults: function (b, a) {
ap.log("[stub]: updated results with " + b);
this.updateSelection(a)
},
activateFilter: function (j) {
var d = $(j.currentTarget),
a = $(j.target),
c = d.data("filter-key"),
f = a.data("filter-value"),
b = this;
if (this.parentView.continentDropdown) {
this.parentView.continentDropdown.resetDropdown()
}
if (!c) {
c = a.parent().data("filter-key")
}
b.toggleFilter(c, f, a, d);
j.preventDefault();
return false
},
toggleFilter: function (e, f, a, d, c) {
var b = this;
if (!e || !f) {
return
}
if (a.length === 0 && d.length === 0) {
if (this.activeFilters[e]) {
delete this.activeFilters[e];
this.renderSummary();
this.toggleEls.toggleClass("active", !$.isEmptyObject(this.activeFilters));
this.parentView.trigger("filterCurrentCollection", e, false, {
silent: true
});
this.parentView.trigger("filterCurrentCollection")
}
return
}
if (f && f == "reset") {
if (!a.hasClass("active")) {
delete this.activeFilters[e];
a.closest("ul").find("a.active").not(a).each(function () {
var j = $(this).data("filter-value");
!c && b.parentView.trigger("filterCurrentCollection", e, false, {
silent: true
})
}).removeClass("active");
a.addClass("active");
!c && this.parentView.trigger("filterCurrentCollection")
}
} else {
if (a.hasClass("active")) {
delete this.activeFilters[e];
this.parentView.trigger("filterCurrentCollection", e, false, {
silent: true
});
this.parentView.trigger("filterCurrentCollection")
} else {
_.each(this.activeFilters,
function (l, j) {
b.parentView.trigger("filterCurrentCollection", j, false, {
silent: true
})
});
this.filterEls.add(this.buttonEls).find('.active:not(".reset")').removeClass("active");
this.filterEls.find(".reset").addClass("active");
this.activeFilters = {};
this.activeFilters[e] = {
val: f,
disp: a.text()
};
!c && this.parentView.trigger("filterCurrentCollection", e, f)
}
a.toggleClass("active");
a.closest("ul").find('a[data-filter-value="reset"]').toggleClass("active", (a.closest("ul").find('a.active:not([data-filter-value="reset"])').length === 0))
}
this.toggleEls.toggleClass("active", !$.isEmptyObject(this.activeFilters));
this.renderSummary()
},
removeFilter: function (f) {
var a = $(f.currentTarget),
b = a.data("filter-key"),
j = a.data("filter-value") + "",
d = this.el.find('#main-filters [data-filter-key="' + b + '"]'),
c = d.find('[data-filter-value="' + j + '"]');
if (this.parentView.continentDropdown) {
this.parentView.continentDropdown.resetDropdown()
}
this.toggleFilter(b, j, c, d)
},
removeAllFilters: function (b) {
var a = this;
_.each(a.activeFilters,
function (d, c) {
var e = a.el.find('#main-filters [data-filter-key="' + c + '"]');
e.find(".active").removeClass("active");
e.find(".reset").addClass("active");
delete a.activeFilters[c];
a.parentView.trigger("filterCurrentCollection", c, false, {
silent: b
})
});
a.toggleEls.removeClass("active");
a.renderSummary()
},
renderSummary: function () {
var a = this,
b = function (e, f, d) {
if ((f).toLowerCase() === "zzz") {
d = "Other"
}
var c = _.indexOf(a.filterButtons, e) === -1 ? " " + d.charAt(0).toUpperCase() + d.substr(1) : "";
return $("<span />", {
"class": "active-filter top-filter",
"data-filter-name": e,
text: a.filterDisplayNames[e] + c
}).append(" ").append($("<span />", {
"class": "clear-mutator",
"data-filter-key": e,
"data-filter-value": f
}))
};
a.summaryEl.find(".top-filter").remove();
if (!$.isEmptyObject(a.activeFilters)) {
_.each(a.activeFilters,
function (d, c) {
a.summaryEl.append(b(c, d.val + "", d.disp + "")).append(" ")
})
}
},
setActiveFilter: function (c, d, a) {
var b = this;
_.each(this.activeFilters,
function (f, e) {
if (_.indexOf(b.filterButtons, e) !== -1) {
b.parentView.trigger("filterCurrentCollection", e, false, {
silent: true
});
delete b.activeFilters[e];
b.el.find('#main-filters [data-filter-key="' + e + '"] .active').removeClass("active")
}
b.parentView.trigger("filterCurrentCollection", e, false, {
silent: true
})
});
this.activeFilters[c] = {
val: d,
disp: a || d
};
b.el.find('#main-filters [data-filter-key="' + c + '"] [data-filter-value="' + d + '"] ').addClass("active").closest("ul").find(".reset").removeClass("active");
this.renderSummary();
this.toggleEls.toggleClass("active", !$.isEmptyObject(this.activeFilters))
},
removeActiveFilter: function (a) {
if (this.activeFilters[a]) {
delete this.activeFilters[a];
this.renderSummary();
this.toggleEls.toggleClass("active", !$.isEmptyObject(this.activeFilters))
}
},
hideFilterButton: function () {
this.toggleEls.filter(".main-filters").removeClass("enabled")
},
showFilterButton: function () {
this.toggleEls.filter(".main-filters").addClass("enabled")
},
render: function () {
var a = this;
if (a.options.isOpen) {
a.openMainFilters()
}
}
});
ap.namespace("ap.aggregations").MainView = ap.globals.MainCollectionView.extend({
el: $("body.aggregation .content-with-sidebar"),
options: {
aggregationConfig: {
artworkDimensions: {
height: null,
width: null
},
aggregationType: null,
collectionOptions: {},
modelViewType: null,
useDynamicRows: true,
viewType: null
},
disabledButtons: [".add-to-collection"],
visibleButtons: [".plusone", ".discover", ".share", ".add-to-collection", ".slideshow", ".streetview"]
},
currentRowId: null,
isInitialLoad: true,
museumDetails: null,
rowsView: null,
lastHeight: null,
initialPreloader: null,
pagingProcessManager: null,
loadedViewArray: [],
slideShowData: {
collection: null,
startModel: null
},
router: null,
initialize: function (b) {
var a = this;
var c = a.options.aggregationConfig;
a.router = a.options.router;
_.bindAll(a, "addAll", "calculateDimensionsForRender", "imageLoadedCallback", "imageLoadErrorCallback", "initialBatchLoadedCallback", "addToExistingBatchLoadedCallback", "renderArtworkToPage", "render");
$.extend(true, this.options, this.options.aggregationConfig.overrideOptions);
ap.globals.MainCollectionView.prototype.initialize.apply(a, [b]);
a.currentRowId = c.rowId;
ap.aggregation.layout.Global.currentRowView = ap.aggregation.layout.Config["rowView" + c.rowId];
a.lastHeight = $(window).height();
$(window).smartresize(function () {
var d = a.lastHeight;
a.lastHeight = $(window).height();
if (d != a.lastHeight && a.rowsView) {
var e = false;
if (c.aggregationBodyType === "galleries") {
e = true
}
a.rowsView.aggregationZoomChange(ap.aggregation.layout.Global.currentRowView.title, e)
}
});
return a
},
calculateDimensionsForRender: function () {
var a = this;
var c = a.options.aggregationConfig;
var b = {};
if (!_.isNull(c.artworkDimensions.height)) {
if (c.artworkDimensions.height === "auto") {
b.height = ap.aggregation.layout.Global.currentRowView.image.height
} else {
b.height = c.artworkDimensions.height
}
if (b.height > 512) {
b.height = 512
}
}
if (!_.isNull(c.artworkDimensions.width)) {
b.width = c.artworkDimensions.width;
if (b.width > 512) {
b.width = 512
}
}
return b
},
imageLoadedCallback: function (c, b) {
var a = this;
b.view.render(a.calculateDimensionsForRender())
},
imageLoadErrorCallback: function (b, a) {
ap.log("Image load error for URL " + b, "warn");
a.self.loadedViewArray.splice(_.indexOf(a.self.loadedViewArray, a.view), 1)
},
initialBatchLoadedCallback: function () {
this.renderArtworkToPage();
if (this.sidebar && !_.include(this.options.disabledButtons, ".slideshow")) {
this.sidebar.enableButton(".slideshow")
}
},
addToExistingBatchLoadedCallback: function () {
this.isInitialLoad = false;
this.renderArtworkToPage()
},
renderArtworkToPage: function () {
ap.aggregation.layout.RowFormat.setRowWidth();
var c = this.loadedViewArray.length;
var d = !this.options.aggregationConfig.preloadImages;
for (var b = 0; b < c; b++) {
var a = this.loadedViewArray[b];
if (d) {
ap.aggregation.layout.RowFormat.renderToNextRow((a.render(this.calculateDimensionsForRender())).el)
} else {
ap.aggregation.layout.RowFormat.renderToNextRow(a.el)
}
}
if (this.isInitialLoad && !ap.isMobile) {
this.rowsView = new ap.aggregation.layout.RowsView({
aggregationConfig: this.options.aggregationConfig,
collection: this.currentCollection,
el: this.el,
jScrollPaneApi: this.jScrollPaneApi,
rowFormat: ap.aggregation.layout.RowFormat,
parentView: this
});
this.rowsView.render(this.currentRowId)
} else {
if (this.isInitialLoad && ap.isMobile) {
this.rowsView = new ap.mobile.aggregation.RowsView({
aggregationConfig: this.options.aggregationConfig,
collection: this.currentCollection,
el: this.el,
jScrollPaneApi: this.jScrollPaneApi,
rowFormat: ap.aggregation.layout.RowFormat,
parentView: this
});
this.rowsView.render(this.currentRowId)
}
}
ap.aggregation.layout.RowFormat.setRowWidth(true);
this.loadedViewArray = [];
this.jScrollPaneApi.reinitialise();
if (ap.aggregation.layout.PageLoading.needToLoadMore() && this.isInitialLoad) {
this.currentCollection.nextPage()
} else {
this.pagingProcessManager.end()
}
},
render: function () {
ap.globals.MainCollectionView.prototype.render.apply(this, [this.options]);
var a = new ap.aggregation.layout.SetupRow();
a.setRowconfig()
}
});
var AggregationWorkspace = Backbone.Router.extend({
routes: {
"collection/:museumslug/museumview/*encodedLocation": "showMuseumView",
":countryCode/collection/:museumslug/museumview/*encodedLocation": "showMuseumViewI18N",
"*defaulturl": "setupAggregationView"
},
aggregationConfig: {
aggregationBodyType: null,
aggregationType: null,
artworkDimensions: {
height: "auto",
width: null,
},
dynamicRows: true,
isSearch: null,
magnifier: true,
modelViewType: null,
overrideOptions: {},
preloadImages: true,
rowId: null,
useDynamicArtworkInfo: true
},
urlParts: null,
showMuseumViewI18N: function (c, b, a) {
this.showMuseumView(b, a)
},
showMuseumView: function (b, a) {
if (!window.app) {
this.setupAggregationView()
}
ap.trackOpenMuseumView($("body").data("museum-slug"), ap.getMuseumAnalyticsId());
window.app.sidebar.killMuseumView();
window.app.sidebar.showMuseumView(null, a)
},
hideMuseumView: function () {
window.app.sidebar.hideMuseumView()
},
setupAggregationView: function () {
if (window.app) {
this.hideMuseumView()
} else {
var b = this;
var e = this.aggregationConfig;
var d = ap.getQueryStringParams();
var j = {};
var f = window.location.hash;
if (f && f.indexOf("museumview") == -1 && f.indexOf("collection") == -1) {
rowId = window.location.hash.replace("#", "").split("-")[0];
e.rowId = rowId.charAt(0).toUpperCase() + rowId.slice(1)
}
e.aggregationBodyType = $("body").attr("id");
e.isSearch = (e.aggregationBodyType === "search") ? true : false;
if (e.aggregationBodyType === "artworks") {
j = ap.getCurrentArtworkCollectionState()
} else {
ap.clearCurrentArtworkCollectionState()
}
if (e.aggregationBodyType === "artists") {
e.aggregationType = "ArtistList"
} else {
if (e.aggregationBodyType === "artworks") {
var a = {};
e.aggregationType = "ArtworkList";
e.modelViewType = "ArtworkView";
e.artworkDimensions = {
height: "auto"
};
_.each(j,
function (m, l) {
a[l] = m.value
});
d = $.extend(d, a);
b.urlParts = ["artwork"]
} else {
if (e.aggregationBodyType === "galleries") {
e.aggregationType = "PublicBookmarkGroupList";
e.dynamicRows = true;
e.magnifier = false;
e.rowId = "Bookmarks", e.modelViewType = "BookmarkGroupView";
e.preloadImages = false, e.useDynamicArtworkInfo = false;
e.overrideOptions = {
disabledButtons: [".add-to-collection", ".slideshow"]
};
b.urlParts = ["public_bookmarkgroup"]
} else {
if (e.aggregationBodyType === "gallery") {
e.aggregationType = "PublicBookmarkList";
e.modelViewType = "BookmarkArtworkView";
e.artworkDimensions = {
height: "auto"
};
b.urlParts = ["public_bookmark"];
e.artworkDimensions = {
height: "auto"
};
e.overrideOptions = {
disabledButtons: [".add-to-collection"]
};
d = $.extend(d, {
bookmark_group: $("body").data("group-id")
})
} else {
if (e.aggregationBodyType === "museum") {
e.aggregationType = "ArtworkList";
e.modelViewType = "ArtworkView";
e.overrideOptions = {
disabledButtons: [".add-to-collection", ".slideshow"]
};
b.urlParts = ["artwork"];
d = $.extend(d, {
collection: $("body").data("museum-id")
})
} else {
if (e.aggregationBodyType === "artist") {
e.aggregationType = "ArtworkList";
e.modelViewType = "ArtworkView";
e.overrideOptions = {
disabledButtons: [".add-to-collection", ".slideshow"]
};
b.urlParts = ["artwork"];
d = $.extend(d, {
canonical_artist: $("body").data("artist-id")
})
} else {
if (e.aggregationBodyType === "level") {
e.aggregationType = "ArtworkList";
e.modelViewType = "ArtworkView";
b.urlParts = ["artwork"];
d = $.extend(d, {
level: $("body").data("level-id")
})
} else {
if (e.aggregationBodyType === "room") {
e.aggregationType = "ArtworkList";
e.modelViewType = "ArtworkView";
b.urlParts = ["artwork"];
d = $.extend(d, {
room: $("body").data("room-id")
})
} else {
if (e.aggregationBodyType === "search") {
var c = $("body").attr("class").split(/\s+/);
$.each(c,
function (l, n) {
var m = n.indexOf("-search-aggregation");
var k = null;
if (m !== -1) {
k = n.substring(0, m);
if (k === "artworks") {
e.aggregationType = "ArtworkList";
e.artworkDimensions = {
height: 80,
width: 80
};
e.dynamicRows = false;
e.magnifier = false;
e.modelViewType = "SearchArtworkView";
e.useDynamicArtworkInfo = false;
e.overrideOptions = {
disabledButtons: [".add-to-collection"]
};
b.urlParts = ["artwork"]
} else {
if (k === "artists") {
e.aggregationType = "ArtistList";
e.artworkDimensions = {
height: 80,
width: 80
};
e.dynamicRows = false;
e.magnifier = false;
e.modelViewType = "SearchArtistView";
e.preloadImages = false, e.useDynamicArtworkInfo = false;
e.overrideOptions = {
disabledButtons: [".add-to-collection", ".slideshow"]
};
b.urlParts = ["artist"]
} else {
if (k === "collections") {
e.aggregationType = "MuseumList";
e.artworkDimensions = {
height: 80,
width: 80
};
e.dynamicRows = false;
e.magnifier = false;
e.modelViewType = "SearchMuseumView";
e.preloadImages = false, e.useDynamicArtworkInfo = false;
e.overrideOptions = {
disabledButtons: [".add-to-collection", ".slideshow"]
};
b.urlParts = ["collection"]
} else {
if (k === "galleries") {
e.aggregationType = "PublicBookmarkGroupList";
e.collectionOptions = {
url: ap.buildApiUrl(["public_bookmarkgroup"], {
offset: 0
})
};
e.artworkDimensions = {
height: 80,
width: 80
};
e.dynamicRows = false;
e.magnifier = false;
e.modelViewType = "SearchBookmarkGroupView";
e.preloadImages = false, e.useDynamicArtworkInfo = false;
e.overrideOptions = {
disabledButtons: [".add-to-collection", ".slideshow"]
};
b.urlParts = ["public_bookmarkgroup"]
} else {
if (k === "videos") {
e.aggregationType = "ArtistList";
e.artworkDimensions = {
height: 80,
width: 80
};
e.dynamicRows = false;
e.magnifier = false;
e.modelViewType = "SearchArtistView";
e.preloadImages = false, e.useDynamicArtworkInfo = false;
e.overrideOptions = {
disabledButtons: [".add-to-collection", ".slideshow"]
};
b.urlParts = ["artist"]
}
}
}
}
}
}
});
e.rowId = "Multi";
if (_.isNull(e.aggregationType)) {
ap.log("Could not determine aggregation type for search results", "error");
return
} else {
ap.log("Page is a search aggregation of " + e.aggregationType, "info")
}
} else {
return
}
}
}
}
}
}
}
}
}
window.app = {};
if (_.isNull(e.rowId)) {
e.rowId = "Two"
}
if (!e.dynamicRows) {
e.rowId = "Multi"
}
window.app = new ap.aggregations.MainView({
aggregationConfig: e,
qs_params: d,
urlParts: b.urlParts,
router: this
});
window.app.render();
if (e.aggregationBodyType === "museum") {
window.app.museumDetails = new ap.details.layout.Main({
sidebar: window.app.sidebar,
parentView: window.app
})
}
}
}
});
$(document).ready(function () {
var a = $("body");
if (a.hasClass("aggregation") && a.attr("id") != "museumlist") {
new AggregationWorkspace();
if (ap.isMobile) {
Backbone.history.start({})
} else {
Backbone.history.start({
pushState: true
})
}
}
});
ap.namespace("ap.aggregation.layout").ArtworkBaseView = Backbone.View.extend({
tagName: "img",
className: "artwork",
events: {
recalculateWidth: "recalculateWidth"
},
initialize: function () {
_.bindAll(this, "render")
},
render: function (d, f) {
var a = this.model.attributes;
var c = $(this.el);
var e = this.model.calculateImageSizeForAPI(d);
var b = (f) ? "max-height: " + d.maxHeight + " px; max-width: " + d.maxWidth + "px" : "height: " + d.height + "px;";
c.attr("data-cid", this.model.cid);
c.attr("src", this.model.image(e));
c.data("model", this.model);
return this
},
recalculateWidth: function (b, a) {
var c = $(this.el);
c.attr("width", Math.round(a * this.model.attributes.primary_image_aspect_ratio))
}
});
ap.namespace("ap.artwork.layout").CollapserView = Backbone.View.extend({
tagName: "a",
className: "collapser",
events: {
click: "toggleContainer"
},
container: null,
lineHeight: 0,
currentHeight: 0,
lines: 3,
wrapper: null,
initialize: function () {
if (!this.options.container) {
return
}
_.bindAll(this, "render", "toggleContainer");
if (this.options.lines) {
this.lines = this.options.lines
}
this.container = this.options.container;
this.wrapper = this.container.find(".wrapper").eq(0);
this.lineHeight = parseInt(this.wrapper.css("line-height"), 10);
this.currentHeight = this.wrapper.outerHeight(true);
this.targetHeight = this.lineHeight * this.lines;
if (this.currentHeight > this.targetHeight) {
return this.render()
}
},
toggleContainer: function (a, c) {
var b = this;
var d;
if (b.container.hasClass("shrinked")) {
b.el.text(TRANSLATIONS.less);
b.container.removeClass("shrinked");
d = b.currentHeight
} else {
b.el.text(TRANSLATIONS.more);
b.container.addClass("shrinked");
d = b.targetHeight
}
if (c === true) {
b.wrapper.css({
height: d
})
} else {
b.wrapper.animate({
height: d
},
function () {
if (!_.isUndefined(a)) {
b.options.detailsView.recalculateHeights(true,
function () {
b.options.detailsView.jScrollPaneApi.reinitialise()
})
}
})
}
},
render: function () {
$(this.el).text(TRANSLATIONS.more);
this.container.append($(this.el));
this.el = $(this.el);
this.toggleContainer(null, true);
return this
}
});
ap.namespace("ap.microscope.layout").Main = Backbone.View.extend({
tagName: "div",
className: "microscope artwork-large",
microscope: null,
initialState: {
x: 0.5,
y: 0.5,
z: 2
},
imageUrl: null,
aspectRatio: null,
microscopeState: null,
maxSize: 2048,
initialize: function () {
_.bindAll(this, "render", "loadImage", "animate", "center", "loadSingleImage", "getCurrentState");
var a = this;
a.imageUrl = a.options.imageUrl;
a.aspectRatio = a.options.aspectRatio;
a.microscopeState = a.options.microscopeState;
return this.render()
},
loadImage: function (a, b) {
this.imageUrl = a;
this.aspectRatio = b;
this.microscope.LoadImage(a, this.microscopeState)
},
loadSingleImage: function (b, d) {
ap.log("Tile data not found, loading single image: " + b, "info");
ap.log("Aspect ratio: " + d, "info");
var c = this.maxSize;
var a = parseInt((this.maxSize / d), 10);
this.microscope.LoadSingleImage(b + "=s" + this.maxSize, c, a, this.microscopeState)
},
getCurrentState: function () {
return this.microscope.GetState()
},
center: function () {
try {
this.microscope.Center()
} catch (a) {}
},
animate: function (b, a) {
if (_.isUndefined(b)) {
var b = new MicroscopeState(this.initialState.x, this.initialState.y, this.initialState.z)
}
if (!a) {
a = 0
}
this.microscope.AnimateTo(b, a)
},
render: function () {
var a = this;
if (a.options.prepend) {
a.options.container.prepend($(a.el))
} else {
a.options.container.append($(a.el))
}
a.microscope = new Microscope(a.el, true);
a.microscope.SetLoadCallback(function (b) {
if (b !== true) {}
});
a.loadImage(a.imageUrl, a.aspectRatio);
a.el = $(a.el);
return a.microscope
}
});
ap.namespace("ap.artwork.layout").RecommendedBarView = Backbone.View.extend({
tagName: "div",
className: "recommended-artworks",
template: $("#recommended_artworks-template").html(),
container: null,
events: {
"click .tabs a": "switchTab",
"click .artwork": "artworkClickHandler"
},
artwork: null,
recommendedArtworkList: null,
sameMuseumArtworkList: null,
sameArtistArtworkList: null,
limit: 20,
initialize: function () {
var a = this;
a.container = a.options.container;
a.parentView = a.options.parentView;
_.bindAll(this, "render", "addSingleArtwork", "addArtworks", "addRecommendedArtworks", "addSameMuseumArtworks", "addSameArtistArtworks", "switchTab", "artworkClickHandler");
a.artwork = a.options.artwork;
a.recommendedArtworkList = new ap.ArtworkList(null, {
url: ap.buildApiUrl(["artwork"], {
limit: a.limit
})
});
a.sameMuseumArtworkList = new ap.ArtworkList(null, {
url: ap.buildApiUrl(["artwork"], {
limit: a.limit,
collection: a.artwork.collection_id
})
});
a.sameArtistArtworkList = new ap.ArtworkList(null, {
url: ap.buildApiUrl(["artwork"], {
limit: a.limit,
canonical_artist: a.artwork.canonical_artist_id
})
});
a.recommendedArtworkList.bind("reset", a.addRecommendedArtworks);
a.sameMuseumArtworkList.bind("reset", a.addSameMuseumArtworks);
a.sameArtistArtworkList.bind("reset", a.addSameArtistArtworks)
},
artworkClickHandler: function (a) {
var b = this;
if ($("body").hasClass(b.parentView.cssHooks.DETAILS_CLASS)) {
var c = $(a.currentTarget).data("artworkListToUse");
b.parentView.showArtwork(function () {
b.parentView.thumbnailStrip.el.trigger("artworkListChange", [c]);
b.parentView.router.navigate($(a.currentTarget).attr("href").replace("/", ""), true)
})
}
return false
},
switchTab: function (f) {
var b = this;
var c = b.el.find(".tabs li a");
c.removeClass("active");
var d = $(f.currentTarget);
b.el.find("a[href=" + d.attr("href") + "]").addClass("active");
var a = d.attr("href").replace("#", ".");
var j = b.el.find(a);
b.el.find(".tab.active").fadeOut("fast");
j.addClass("active").fadeIn("fast");
return false
},
addSingleArtwork: function (d, b) {
var c = this;
if (c.artwork.id != b.attributes.id) {
var a = new ap.aggregation.layout.ArtworkView({
model: b,
noMagnifier: true
});
a.render({
height: 100
});
var e = c.recommendedArtworkList;
if (d == "same-museum") {
e = c.sameMuseumArtworkList
} else {
if (d == "same-artist") {
e = c.sameArtistArtworkList
}
}
$(a.el).data("artworkListToUse", e);
c.el.find("." + d).append(a.el)
}
},
addArtworks: function (b, c) {
var a = this;
if (c.models.length <= 1) {
a.removeTab(b)
} else {
$.each(c.models,
function (e, d) {
a.addSingleArtwork(b, d)
})
}
},
removeTab: function (b) {
var a = this;
var d = a.el.find(".tab-" + b);
var c = a.el.find("." + b);
d.prev().remove();
d.remove();
c.remove()
},
addRecommendedArtworks: function () {
var a = this;
a.addArtworks("recommended", a.recommendedArtworkList)
},
addSameMuseumArtworks: function () {
var a = this;
a.addArtworks("same-museum", a.sameMuseumArtworkList)
},
addSameArtistArtworks: function () {
var a = this;
a.addArtworks("same-artist", a.sameArtistArtworkList)
},
render: function () {
this.el = $(this.el);
this.el.html(_.template(this.template, this.artwork));
this.container.append(this.el);
this.el.find(".tabs li a").eq(0).trigger("click");
this.recommendedArtworkList.fetch();
this.sameMuseumArtworkList.fetch();
if (this.artwork.canonical_artist_id) {
this.sameArtistArtworkList.fetch()
}
return this
}
});
ap.namespace("ap.artwork.layout").MapView = Backbone.View.extend({
tagName: "div",
className: "artwork-artist-map",
template: '<div id="mapcanvas" class="mapcanvas" style="width: 770px; height: 512px; position: relative;"></div>',
infoboxTemplate: null,
extraScripts: ["markerwithlabel", "markerclusterer", "infobox"],
mainMapOptions: {
centre: {
lat: 48.89364,
lng: 2.33739
},
zoom: 3,
mapTypeId: "ROADMAP",
disableDefaultUI: true
},
mapCanvas: null,
context: null,
geocoder: null,
markers: {},
initialize: function () {
_.bindAll(this, "render", "loadExtraScripts", "refreshMap", "addMarker", "renderMarkers", "geocodeAll", "createMarkers", "loadMapsAPI");
this.context = this.options.context
},
addMarker: function (e, f, d) {
var c = this;
var a = e[0];
var j = a.geometry.location;
var b = new google.maps.Marker({
position: new google.maps.LatLng(j.lat(), j.lng()),
draggable: false,
map: c.map,
icon: "/skip_media_generator/map-pin-circle-" + f + ".png",
infobox: new InfoBox($.extend({}, c.infoboxOptions, d))
});
return b
},
createInfoBoxContent: function (a) {
var b = _.template($("#map_infobox-template").html(), {
contexts: a
});
return b
},
getSize: function (c) {
var b = 0;
for (var a in c) {
if (c.hasOwnProperty(a)) {
++b
}
}
return b
},
geocodeAll: function () {
var a = this;
$.each(a.addressesToGeocode,
function (c, b) {
var d = new google.maps.Geocoder();
d.geocode({
address: b.address
},
function (f, e) {
if (e == "OK") {
delete a.addressesToGeocode[c];
a.markers[c] = {
results: f,
key: c,
place: b
};
if (a.getSize(a.addressesToGeocode) == 0) {
a.renderMarkers()
}
} else {
ap.log("something wrong with: " + c)
}
})
})
},
setInfoboxContent: function (a) {
a.infobox.setContent(this.createInfoBoxContent(a.context))
},
renderMarkers: function () {
var c = this;
var d = c.getSize(c.markers);
var f = {
single: [],
group: []
};
if (d == 3 && (c.markers.death && c.markers.artwork && c.markers.death) && (c.markers.birth.place.address == c.markers.death.place.address) && (c.markers.death.place.address == c.markers.artwork.place.address)) {
$.each(c.markers,
function (k, l) {
f.group.push(l)
})
} else {
if ((c.markers.birth && c.markers.death) && (c.markers.birth.place.address == c.markers.death.place.address)) {
f.group.push(c.markers.birth);
f.group.push(c.markers.death);
if (d == 3) {
f.single.push(c.markers.artwork)
}
} else {
if ((c.markers.birth && c.markers.artwork) && (c.markers.birth.place.address == c.markers.artwork.place.address)) {
f.group.push(c.markers.birth);
f.group.push(c.markers.artwork);
if (d == 3) {
f.single.push(c.markers.death)
}
} else {
if ((c.markers.death && c.markers.artwork) && (c.markers.death.place.address == c.markers.artwork.place.address)) {
f.group.push(c.markers.death);
f.group.push(c.markers.artwork);
if (d == 3) {
f.single.push(c.markers.birth)
}
} else {
$.each(c.markers,
function (k, l) {
if (l) {
f.single.push(l)
}
})
}
}
}
}
var b = [];
$.each(f.single,
function (k, l) {
if (l) {
a = c.addMarker(l.results, l.place.icon_suffix);
a.context = [l.place];
c.setInfoboxContent(a);
a.infobox.open(c.map, a);
b.push(a)
}
});
var j = f.group.length;
if (j) {
var e = "black";
if (j == 3) {
e = "triple"
}
var a = c.addMarker(f.group[0].results, e);
a.context = [];
$.each(f.group,
function (k, l) {
a.context.push(l.place)
});
c.setInfoboxContent(a);
a.infobox.open(c.map, a);
b.push(a)
}
c.fitMarkers(b)
},
createMarkers: function () {
var l = this;
var e = l.context.artist;
var d = l.context.artwork;
var b = e.birth_place ? e.birth_place : null;
var f = e.birth_date_display ? e.birth_date_display : (e.birth_year ? e.birth_year : null);
var c = e.death_place ? e.death_place : null;
var k = e.death_date_display ? e.death_date_display : (e.death_year ? e.death_year : null);
var a = d.place_name ? d.place_name : null;
var j = null;
if (d.place_earliest_date && d.place_latest_date) {
j = d.place_earliest_date + " - " + d.place_latest_date
} else {
if (d.place_earliest_date) {
j = d.place_earliest_date
} else {
if (d.place_latest_date) {
j = d.place_latest_date
}
}
}
l.addressesToGeocode = {};
if (b) {
l.addressesToGeocode.birth = {
action: "Born",
date: f,
address: b,
icon_suffix: "black"
}
} else {
l.markers.birth = null
}
if (a) {
l.addressesToGeocode.artwork = {
action: "Created",
date: j,
address: a,
icon_suffix: "yellow",
"class": "yellow"
}
} else {
l.markers.artwork = null
}
if (c) {
l.addressesToGeocode.death = {
action: "Died",
date: k,
address: c,
icon_suffix: "black"
}
} else {
l.markers.death = null
}
if (b || a || c) {
return true
} else {
return false
}
},
fitMarkers: function (b) {
var c = this;
var a = new google.maps.LatLngBounds();
$.each(b,
function (e, d) {
if (d) {
a.extend(d.position)
}
});
c.map.fitBounds(a);
if (c.map.getZoom() > 5) {
c.map.setZoom(5)
}
if (b.length == 1) {
c.map.setCenter(b[0].position)
}
c.refreshMap(true)
},
loadMapsAPI: function (c) {
if (_.isUndefined(window.google.maps) || _.isUndefined(window.google.maps.Geocoder)) {
var b = ap.getMapsApiKey();
var a = "//maps.googleapis.com/maps/api/js?key=" + b + "&sensor=false&callback=" + c;
$('<script src="' + a + '">').appendTo($("body"))
} else {
this.render()
}
},
loadExtraScripts: function () {
$.each(this.extraScripts,
function (b, c) {
var a = $("<script />");
a.attr("type", "text/javascript");
a.attr("src", "/skip_media_generator/" + c + ".js");
$("body").append(a)
});
this.render()
},
refreshMap: function (a) {
google.maps.event.trigger(this.map, "resize");
if (a !== true) {
this.map.setCenter(this.mainMapOptions.center)
}
this.map.setZoom(this.map.getZoom())
},
setupInfobox: function () {
this.infoboxOptions = {
disableAutoPan: true,
maxWidth: 0,
pixelOffset: new google.maps.Size(-37, 0),
zIndex: null,
closeBoxURL: "",
infoBoxClearance: new google.maps.Size(1, 1),
pane: "floatPane",
enableEventPropagation: true
}
},
render: function () {
if (this.createMarkers()) {
this.el = $(this.el);
this.el.html(_.template(this.template));
this.options.container.append(this.el);
this.mapCanvas = this.el.find(".mapcanvas").eq(0);
this.mainMapOptions.center = new google.maps.LatLng(this.mainMapOptions.centre.lat, this.mainMapOptions.centre.lng);
this.mainMapOptions.mapTypeId = "roadmap";
this.map = new google.maps.Map(this.mapCanvas.get(0), this.mainMapOptions);
this.setupInfobox();
this.geocodeAll()
} else {
$("li[data-asset-type=map]").remove();
this.options.parentView.setup()
}
return this
}
});
ap.namespace("ap.artwork.layout").DetailsPaneView = Backbone.View.extend({
tagName: "div",
className: "artwork-details",
template: null,
mainScrollingView: null,
jScrollPaneApi: null,
maxImageWidth: 770,
thumbWidth: 73,
activeAssetType: "image",
mainPane: null,
context: null,
imagesToPreload: [],
imagePreloader: null,
audioPlayer: null,
playlist: null,
playlistItems: [],
primaryImage: null,
aspectRatio: null,
parentView: null,
initialize: function () {
_.bindAll(this, "render", "setup", "doScroll", "playItem", "recalculateHeights", "assetThumbClick");
var a = this;
a.context = a.options.context;
a.parentView = a.options.parentView;
a.primaryImage = a.context.artwork.aggregation_image_url;
a.aspectRatio = a.context.artwork.primary_image_aspect_ratio;
a.openAfterLoad = a.options.openAfterLoad;
$.each(a.context.assets,
function (b, c) {
if (c.kind == "image" && c.full_url) {
a.imagesToPreload.push(c.full_url + "=s" + a.maxImageWidth)
}
});
a.imagePreloader = new ap.system.imagePreload("artworkDetailsPane-" + a.context.artwork.id, {
batchLoaded: function () {
a.render()
}
});
$.each(a.imagesToPreload,
function (b, c) {
a.imagePreloader.addToQueue(c)
});
if (a.context.artwork.collection_logo) {
a.imagePreloader.addToQueue(a.context.artwork.collection_logo)
}
a.imagePreloader.load()
},
recalculateHeights: function (e, k) {
var d = this;
var c = $(".artwork_assets_wrapper");
var b = 0;
$.each($(".artwork_assets_wrapper ul li.asset"),
function (m, l) {
if ($(l).height() > b) {
b = $(l).height()
}
});
if (e) {
var a = c.height();
var f = $(".artwork-details").outerHeight();
var j = b - a;
c.animate({
height: b
});
$(".content-wrapper").animate({
height: f + j
},
function () {
if (k) {
k()
}
})
} else {
c.css("height", b);
d.parentView.resizeMicroscopeViewer(false)
}
ap.log("[Debug] recalculateHeights done")
},
assetThumbClick: function (b) {
var c = this;
var e = $(b.currentTarget);
var d = $(e).index();
var a = $(".artwork_assets_wrapper li.asset").eq(d);
c.doScroll(0, a);
c.trackAssetView(e, d)
},
trackAssetView: function (d, b) {
var c = d.attr("class").split(/\s+/);
var a = "";
$.each(c,
function (e, f) {
if (f === "details" || f === "image" || f === "video" || f === "audio" || f === "map") {
a = f
}
});
ap.trackDetailsPane({
tab_index: b,
tab_content_type: a
}, ap.getMuseumAnalyticsId())
},
setup: function () {
var l = this;
var f = $(".artwork_assets_wrapper ul.asset_list");
var e = f.find("li.asset");
var c = e.length * $(e[0]).width();
if (e.length == 1) {
$(".floating-arrow-right").hide()
}
f.width(c);
l.jScrollPaneApi.reinitialise({
contentWidth: c
});
var m = $(".artwork_thumbs ul.asset_list");
m.find("li.asset:last").css("margin-right", 0);
var k = m.find("li.asset");
var a = k.length * k.eq(0).outerWidth(true);
m.css("width", a);
l.thumbjScrollPaneApi.reinitialise();
var b = $(".artwork_object_details ul.asset_list");
var j = b.find("li");
var d = j.length * j.eq(0).width();
b.css("width", d);
$.each($(".facet"),
function (n, o) {
new ap.artwork.layout.CollapserView({
container: $(this),
detailsView: l
})
});
l.recalculateHeights();
l.jScrollPaneApi.reinitialise();
l.el.find(".artwork_thumbs ul.asset_list li.asset").click(l.assetThumbClick);
l.el.find(".playlist-item").click(l.playItem);
$(".details-trigger").addClass("ready");
if (l.openAfterLoad) {
l.parentView.showArtworkDetails()
}
},
doScroll: function (n, k) {
if (n == 1) {
var l = Math.ceil(this.jScrollPaneApi.getContentPositionX() / this.maxImageWidth)
} else {
var l = Math.floor(this.jScrollPaneApi.getContentPositionX() / this.maxImageWidth)
}
if (typeof (k) == "undefined") {
var j = l + n;
if (j < 0) {
j = 0
}
var b = $(".artwork_assets_wrapper li.asset").eq(j);
var e = j;
if (e <= 0) {
e = 0
} else {
if (e >= $(".artwork_assets_wrapper li.asset").length) {
e -= 1
}
}
} else {
var b = k;
var e = k.index()
}
$(".artwork_thumbs ul.asset_list li.asset").removeClass("active");
var m = $(".artwork_thumbs ul.asset_list li.asset").eq(e);
m.addClass("active");
if (b.length) {
if (this.activeAssetType != b.data("asset-type")) {
this.activeAssetType = b.data("asset-type");
var d = $(".artwork_object_details li.asset_description").filter("[data-asset-type=" + this.activeAssetType + "]")
}
if (this.activeAssetType == "map") {
var a = this.mapView.map.getCenter();
this.mapView.map.setCenter(a);
google.maps.event.trigger(this.mapView.map, "resize")
}
if (!ap.isMobile) {
this.jScrollPaneApi.scrollToX(b.position().left);
if (e == 0) {
this.thumbjScrollPaneApi.scrollToX(0)
} else {
var f = m.position().left - ((770 - 60) / 2);
this.thumbjScrollPaneApi.scrollToX(f)
}
} else {
var c = $(".artwork_assets_wrapper .asset").eq(e);
$(".artwork_assets_wrapper .asset").removeClass("current");
c.addClass("current")
}
}
this.trackAssetView(b, j)
},
playItem: function (b) {
var a = $(b.currentTarget);
this.playlist.find("a.selected").removeClass("selected");
a.addClass("selected");
this.audioPlayer.player.select(a.index());
this.audioPlayer.setupTitleScroller();
setTimeout(this.audioPlayer.scrollTitle, this.audioPlayer.scrollDelayDuration);
this.audioPlayer.player.play()
},
unbind: function () {
$(this.el).find(".artwork_thumbs ul.asset_list li.asset").unbind("click");
$("#more-art a").unbind("click");
$(this.el).find(".close-details").unbind("click");
$(this.el).find(".playlist-item").unbind("click")
},
render: function () {
var b = this;
b.el = $(b.el);
b.template = _.template($("#artwork_detail_pane-template").html(), b.context);
b.el.html(b.template);
b.parentView.elements.$artworkWrapper.append(b.el);
b.recommendedBarView = new ap.artwork.layout.RecommendedBarView({
container: b.el,
artwork: b.context.artwork,
parentView: b.parentView
});
b.recommendedBarView.render();
b.el.find(".close-details").click(function () {
b.parentView.showArtwork(function () {
b.parentView.onSidebarResize()
})
});
b.el.find(".museum_logo img").load(function () {
ap.log("[Debug] Museum logo loaded");
b.recalculateHeights()
});
var c = new ap.Artwork(b.context.artwork);
b.artworkView = new ap.aggregation.layout.ArtworkView({
model: c
});
b.artworkView.render({
maxHeight: 184,
maxWidth: 184,
height: 184
}, null, true);
b.el.find(".artwork-placeholder").append(b.artworkView.el);
ap.aggregation.layout.Global.currentRowView = ap.aggregation.layout.Config.singleArtworkView;
var a = new ap.aggregation.layout.ArtworkMagnifierView();
a.render();
b.mainScrollingView = new ap.aggregation.layout.MainScrollingView({
el: $(".artwork_assets"),
element: $(".artwork_assets_wrapper.scroll-pane"),
useWheelScrolling: false,
useDragScrolling: false,
scrollBy: b.maxImageWidth,
customScrollHandler: b.doScroll,
floatingArrowOptions: {
arrowPosition: "close",
hideAfter: false
},
events: {
"jsp-scroll-x": b.scrolled
},
jScrollPaneSettings: {
useMouseWheel: false,
horizontalGutter: 0
}
});
b.jScrollPaneApi = b.mainScrollingView.render();
b.thumbScrollingView = new ap.aggregation.layout.MainScrollingView({
el: $(".artwork_thumbs_wrapper"),
element: $(".artwork_thumbs"),
useWheelScrolling: false,
useDragScrolling: false,
useKeyboardScrolling: false,
floatingArrowOptions: {
arrowPosition: "inside",
hideAfter: false
},
scrollBy: 292,
jScrollPaneSettings: {
useMouseWheel: false,
horizontalGutter: 0
}
});
b.thumbjScrollPaneApi = b.thumbScrollingView.render();
b.playlist = $("#playlist-" + b.context.artwork.id);
$.each(b.playlist.find("a"),
function (d, e) {
if (d == 0) {
$(this).addClass("selected")
}
b.playlistItems.push({
title: $(this).data("title"),
mp3: $(this).data("mp3")
})
});
b.audioPlayer = new ap.globals.AudioPlayerView({
el: $("#audioplayer-" + b.context.artwork.id),
playlistItems: b.playlistItems
});
b.mapView = new ap.artwork.layout.MapView({
container: $(b.el).find(".artwork_assets_wrapper .asset_list .asset.map .map-wrapper").eq(0),
context: b.context,
parentView: b
});
ap.namespace("ap.maps").detailsMapsCallback = b.mapView.loadExtraScripts;
b.mapView.loadMapsAPI("ap.maps.detailsMapsCallback");
b.audioPlayer.render();
if (ap.isMobile) {
$(".artwork_assets_wrapper .asset").eq(0).addClass("current")
}
b.setup();
return b
}
});
ap.namespace("ap.artwork.layout").PivotView = Backbone.View.extend({
el: $("#artwork-wrapper"),
events: {
"click .option": "changeStripContent"
},
template: null,
thumbnailStrip: null,
collection_id: null,
artist_id: null,
date: null,
initialize: function () {
_.bindAll(this, "render", "changeStripContent");
this.thumbnailStrip = this.options.thumbnailStrip;
this.setup();
return this.render()
},
setup: function () {
var a = $("body");
this.collection_id = a.data("museum-id");
this.artist_id = a.data("artist-id");
this.canonical_artist_id = a.data("canonical-artist-id");
this.earliest_date = a.data("earliest-date");
this.latest_date = a.data("latest-date")
},
changeStripContent: function (a) {
a.preventDefault();
var d = $(a.currentTarget).data("list-type");
this.setup();
var c = {
offset: 0,
limit: 20
};
if (d == "date") {
if (this.earliest_date) {
c.latest_date__gte = this.earliest_date
}
if (this.latest_date) {
c.latest_date__lte = this.latest_date
}
c.order_by = "latest_date"
} else {
c[d] = this[d + "_id"]
}
var b = ap.buildApiUrl(["artwork"], c);
var e = new ap.ArtworkList(null, {
url: b
});
this.thumbnailStrip.el.trigger("artworkListChange", [e]);
this.thumbnailStrip.processManager.reset();
this.thumbnailStrip.processManager.start();
this.thumbnailStrip.artworkList.fetch()
},
render: function () {
this.template = _.template($("#pivots-template").html(), {
canonical_artist: this.canonical_artist_id
});
this.el.append(this.template);
this.el = $("#pivots");
return this
}
});
ap.namespace("ap.thumbnailstrip.layout").Main = Backbone.View.extend({
tagName: "div",
id: "thumbnail-strip",
className: "thumbnail-strip",
isSlideshow: false,
template: '<div class="wrapper scroll-pane"><div class="thumbnails"></div></div><a class="scroll scrollLeft"><span></span></a><a class="scroll scrollRight"><span></span></a><div class="preloader left"></div>',
events: {
"mouseenter .artwork": "magnifyImage",
"mouseleave .artwork": "hideMagnifiedImage",
artworkListChange: "artworkListChange"
},
options: {
imageUrl: null,
urlParts: ["artwork"],
qs_params: {
collection: $("body").data("museum-id")
}
},
leftArrow: null,
rightArrow: null,
animating: false,
artworkList: null,
numberOfImages: 0,
hide: true,
hideTimeout: null,
hideTimeoutDuration: 1000,
microscope: null,
parentView: null,
scrollTimeout: null,
scrollAmount: 200,
thumbnails: null,
processManager: null,
preloader: null,
mainScrollingView: null,
jScrollPaneApi: null,
hasMoved: false,
eventsAttached: false,
magnifyMultiplier: 4,
preloadTimeout: null,
preloadDelay: 500,
wrapperWidth: 0,
thumbsWidth: 0,
settings: {
artworkClickCallback: null,
showPivots: true,
autoHide: true,
isSlideshow: false,
collectionToUse: null
},
initialize: function () {
_.bindAll(this, "render", "addAll", "addOne", "addNewlyLoaded", "showStrip", "hideStrip", "clearHideTimeout", "setHideTimeout", "dontHide", "doHide", "attachEvents", "clickHandler", "leftArrowClick", "rightArrowClick", "scrollToElement", "calculateWidth", "displayPreloader", "hidePreloader", "scrollPanelXScroll", "magnifyImage", "hideMagnifiedImage", "artworkListChange", "calculateOffsetsForClone", "artworkClick", "highlightArtwork", "scrollToCurrentArtwork", "unload");
var a = this;
if (this.options.settings) {
$.extend(this.settings, this.options.settings)
}
a.parentView = a.options.parentView;
a.container = a.options.container;
if (a.options.imageUrl == null) {
a.options.imageUrl = ap.buildApiUrl(a.options.urlParts, $.extend({
offset: 0,
limit: 20
}, a.options.qs_params))
}
if (a.settings.collectionToUse === null) {
a.artworkList = new ap.ArtworkList(null, {
url: a.options.imageUrl,
noMagnifier: true
})
} else {
a.artworkList = a.settings.collectionToUse
}
a.artworkList.bind("reset", a.addAll);
a.artworkList.bind("addNewlyLoaded", a.addNewlyLoaded);
a.processManager = new ap.system.ProcessManager("paging");
$(a.processManager).bind("processStarted_paging", a.displayPreloader);
$(a.processManager).bind("processEnded_paging", a.hidePreloader);
$(a.processManager).bind("processTerminated_paging", a.hidePreloader);
$(a.processManager).bind("processStarted_paging", a.logStarted);
$(a.processManager).bind("processEnded_paging", a.logEnded);
$(a.processManager).bind("processTerminated_paging", a.logTerminated);
$(a.processManager).bind("processTerminated_paging", a.logTerminated);
return a.render()
},
logStarted: function () {
ap.log("I started my job", "info")
},
logEnded: function () {
ap.log("I finished my job", "info")
},
logTerminated: function () {
ap.log("Someone finished my job", "warn")
},
logReset: function () {
ap.log("I'm happy now, 'cause I'm reset!", "warn")
},
artworkListChange: function (a, c) {
var b = this;
if (this.parentView.sidebar) {
this.parentView.sidebar.disableButton(".slideshow")
}
b.jScrollPaneApi.scrollToX(0);
b.preloader.addClass("left");
b.el.find(".scroll").hide();
b.artworkList = c;
b.artworkList.reset(c.models);
b.artworkList.bind("addNewlyLoaded", b.addNewlyLoaded);
b.artworkList.bind("reset", b.addAll);
b.el.find(".artwork").remove()
},
scrollPanelXScroll: function (a, b, d, c) {
c = c || this.isAtRight();
if (c && !this.processManager.isBusy && !this.processManager.isTerminated) {
this.processManager.start();
this.artworkList.nextPage()
}
if (d && !this.processManager.isBusy && !this.processManager.isTerminated) {}
},
isAtRight: function () {
var a = this.jScrollPaneApi.getContentPositionX();
var b = this.thumbsWidth - this.wrapperWidth - 100;
if (a > b) {
return true
} else {
return false
}
},
scrollPanelYScroll: function (a) {
return false
},
leftArrowClick: function (a) {
this.dontHide();
this.mainScrollingView.scrollLeftHandler(a)
},
rightArrowClick: function (a) {
this.dontHide();
this.mainScrollingView.scrollRightHandler(a)
},
scrollToArtwork: function (a) {
var b = this.el.find(".artwork[data-artwork-id=" + a + "]");
if (b) {
this.scrollToElement($(b), true)
}
},
scrollToCurrentArtwork: function () {
var a = this.el.find(".artwork.current");
if (a) {
this.scrollToElement($(a), false)
}
},
highlightArtwork: function (a) {
var b = this.el.find(".artwork[data-artwork-id=" + a + "]");
this.el.find(".artwork.current").removeClass("current");
if (b) {
$(b).addClass("current")
}
},
scrollToElement: function (e, b) {
if (e.position()) {
var a = this;
var d = a.el.width();
var c = e.position().left;
var f = Math.abs(a.thumbnails.position().left);
var k = (c - f);
var j = -(f + k) + ((d - e.outerWidth(true)) / 2);
a.jScrollPaneApi.scrollToX(-j, b)
}
},
calculateOffsetsForClone: function (e, m) {
var o = this;
var n = m.height() * this.magnifyMultiplier;
var c = m.width() * this.magnifyMultiplier;
var a = o.parentView.sidebar;
var j = 0;
var l = ((c - m.attr("width")) / 2);
if (a) {
var b = a.el.width();
if (a.open) {
j = b + a.el.position().left
} else {
j = b
}
}
j = e.offset().left - j;
var d = j - l;
if (d < 0) {
d = 0
}
var k = -1 * n;
var f = {
origWidth: m.width(),
origHeight: m.height(),
origLeft: j,
width: c,
height: n,
left: d,
top: k,
arrowLeft: (c / 2)
};
return f
},
preloadMagnifiedImage: function (b) {
var c = $("#clone-" + b.data("artwork-id"));
if (c.length && !c.hasClass("loading") && !c.hasClass("loaded")) {
c.addClass("loading");
var a = new ap.system.imagePreload("thumbnailStripMagnifier-" + c.attr("id"), {
imageLoaded: function (d) {
b.data("highresimage", d.src);
c.find("img").attr("src", d.src);
c.removeClass("loading").addClass("loaded")
}
});
a.addToQueue(c.data("imageurl"), null);
a.load()
}
},
magnifyImage: function (k) {
if (!ap.isMobile) {
var a = this;
var c = $(k.currentTarget);
var d = c.find("img");
var j = "clone-" + c.data("artwork-id");
var l = $("#" + j);
var b = this.calculateOffsetsForClone(c, d);
if (!l.length) {
l = $('<div class="clone"><span></span></div>');
var f = d.clone();
f.css("height", "");
l.attr("id", j).attr("width", "").attr("height", "").addClass("clone").css({
left: b.origLeft + "px",
top: -1 * b.origHeight + "px",
width: b.origWidth + "px",
height: b.origHeight + "px",
opacity: "0"
});
if (c.data("highresimage")) {
l.data("imageurl", c.data("highresimage"));
l.addClass("loaded");
f.attr("src", c.data("highresimage"))
} else {
l.data("imageurl", c.data("imageurl") + "=s" + Math.round(((b.width > b.height) ? b.width : b.height)))
}
l.data("offsets", b);
l.data("preloadTimer", null);
l.append(f);
this.el.append(l)
} else {
l.stop(true, false)
}
clearTimeout(l.data("preloadTimer"));
l.data("preloadTimer", setTimeout(function () {
a.preloadMagnifiedImage(c)
}, a.preloadDelay));
l.find("span").css("left", b.arrowLeft);
l.animate({
top: b.top + "px",
left: b.left + "px",
height: b.height + "px",
width: b.width + "px",
opacity: 1
})
}
},
hideMagnifiedImage: function (d) {
var b = $(d.currentTarget);
var c = "clone-" + b.data("artwork-id");
var f = $("#" + c);
if (f.length) {
clearTimeout(f.data("preloadTimer"));
var a = f.data("offsets");
f.stop().animate({
top: -1 * a.origHeight + "px",
left: a.origLeft + "px",
height: a.origHeight + "px",
width: a.origWidth + "px",
opacity: 0
},
function () {
if (!f.is(":animated") && !b.is(":hover")) {
f.remove()
}
})
}
},
attachEvents: function () {
if (!this.eventsAttached) {
this.eventsAttached = true;
this.leftArrow.click(this.leftArrowClick);
this.rightArrow.click(this.rightArrowClick);
this.el.mouseenter(this.dontHide);
this.el.mouseenter(this.showStrip);
this.el.mouseleave(this.doHide)
}
},
detachEvents: function () {
this.eventsAttached = false;
this.leftArrow.unbind("click");
this.rightArrow.unbind("click");
this.el.unbind("mouseenter", this.showStrip);
this.el.unbind("mouseenter", this.dontHide);
this.el.unbind("mouseleave", this.doHide)
},
dontHide: function () {
this.hide = false;
this.clearHideTimeout()
},
doHide: function () {
if (!this.processManager.isBusy) {
this.hide = true;
this.setHideTimeout()
}
},
clearHideTimeout: function () {
var a = this;
clearTimeout(a.hideTimeout)
},
setHideTimeout: function () {
var a = this;
if (a.hide && a.settings.autoHide) {
a.hideTimeout = setTimeout(a.hideStrip, a.hideTimeoutDuration)
}
},
showStrip: function () {
var a = this;
if (!a.animating) {
a.animating = true;
a.clearHideTimeout();
a.el.show();
$(a.el).children().not(".clone").stop().animate({
top: "0"
}, 200,
function () {
a.animating = false;
if (a.hide) {
a.doHide()
}
})
}
},
hideStrip: function () {
var a = this;
if (!a.animating && a.hide && !ap.isMobile && !a.processManager.isBusy) {
a.animating = true;
a.clearHideTimeout();
$(a.el).children().not(".clone").stop().animate({
top: a.el.height() + "px"
},
function () {
a.animating = false
})
}
},
addNewlyLoaded: function (a) {
var b = this;
$.each(b.artworkList.newlyAdded,
function (d, c) {
b.addOne(c, true)
});
b.checkInfiniteLoad()
},
displayPreloader: function () {
var a = this;
a.dontHide();
a.showStrip();
a.detachEvents();
a.thumbnails.addClass("loading");
a.preloader.show()
},
hidePreloader: function () {
var a = this;
a.thumbnails.removeClass("loading");
a.preloader.removeClass("left").hide();
a.doHide();
a.attachEvents()
},
checkInfiniteLoad: function () {
var b = this;
b.el.find(".scroll").show();
b.showStrip();
var a = b.calculateWidth();
if (b.wrapper.width() > a) {
var c = b.artworkList.nextPage();
if (c === (false || null)) {
b.attachEvents();
b.processManager.end()
}
} else {
b.attachEvents();
b.processManager.end()
}
b.jScrollPaneApi.reinitialise();
setTimeout(function () {
b.jScrollPaneApi.reinitialise()
}, 500)
},
addAll: function () {
var a = this;
a.artworkList.each(a.addOne);
a.preloader.removeClass("left");
a.checkInfiniteLoad();
if (this.parentView.sidebar) {
this.parentView.sidebar.enableButton(".slideshow")
}
},
addOne: function (d, b) {
var e = this;
var a = (ap.isMobile) ? 40 : 40;
if (d.artworkModel) {
var c = new ap.aggregation.layout.BookmarkArtworkView({
data_vieworder: ++e.numberOfImages,
model: d,
isAppendToExisting: b,
clickCallback: e.artworkClick,
imageSize: a,
noMagnifier: true
})
} else {
var c = new ap.aggregation.layout.ArtworkView({
data_vieworder: ++e.numberOfImages,
model: d,
isAppendToExisting: b,
clickCallback: e.artworkClick,
imageSize: a,
noMagnifier: true
})
}
c.render({
height: a
});
e.thumbnails.append(c.el)
},
calculateWidth: function () {
var b = this.thumbnails.find("img");
var a = 0;
$.each(b,
function (d, c) {
a += $(c).outerWidth(true)
});
this.thumbnails.css("width", a + 15);
this.thumbsWidth = a + 15;
return a
},
artworkClick: function (b, a) {
$(this).trigger("artworkClicked", a);
if (!this.isSlideshow) {
this.clickHandler(b, a)
}
},
clickHandler: function (b, a) {
var c = this;
$(".details-trigger").removeClass("ready");
$("body").data("artwork-id", a.model.attributes.id);
$("body").data("museum-id", a.model.attributes.collection_id);
$("body").data("artist-id", a.model.attributes.artist_id);
this.thumbnails.find(".artwork.active").removeClass("active");
$(b.currentTarget).addClass("active");
c.scrollToElement($(b.currentTarget));
if (c.parentView.router) {
c.parentView.router.navigate($(b.currentTarget).attr("href").replace("/", ""), true)
} else {
document.location.href = $(b.currentTarget).attr("href")
}
return false
},
resize: function (a) {
this.wrapper.css({
width: a
});
this.jScrollPaneApi.reinitialise();
this.checkInfiniteLoad();
self.wrapperWidth = a;
self.thumbsWidth = self.thumbnails.width()
},
render: function () {
var a = this;
$(a.el).html(_.template(a.template));
a.el = $(a.el);
a.options.container.prepend(a.el);
a.preloader = a.el.find(".preloader").eq(0);
a.thumbnails = a.el.find(".thumbnails").eq(0);
a.leftArrow = a.el.find(".scrollLeft").eq(0);
a.rightArrow = a.el.find(".scrollRight").eq(0);
a.wrapper = a.el.find(".wrapper").eq(0);
a.microscope = a.options.microscope;
a.mainScrollingView = new ap.aggregation.layout.MainScrollingView({
element: a.wrapper,
useWheelScrolling: false,
useDragScrolling: false,
useFloatingArrows: false,
useKeyboardScrolling: false,
jScrollPaneSettings: {
useMouseWheel: false
}
});
a.jScrollPaneApi = a.mainScrollingView.render();
if (this.settings.showPivots && !ap.isMobile) {
a.pivotView = new ap.artwork.layout.PivotView({
thumbnailStrip: a
})
} else {
if (this.settings.showPivots && ap.isMobile) {
a.pivotView = new ap.mobile.artwork.PivotView({
thumbnailStrip: a
})
}
}
if (a.settings.collectionToUse === null) {
a.processManager.start();
a.artworkList.fetch()
} else {
a.addAll()
}
if (ap.isMobile) {
a.wrapper.on("scroll", a.scrollPanelXScroll)
} else {
a.wrapper.on("jsp-scroll-x", a.scrollPanelXScroll);
$(this.el).on("mousewheel", a.scrollPanelYScroll)
}
a.wrapperWidth = a.wrapper.width();
a.thumbsWidth = a.thumbnails.width();
return a
},
unload: function () {
var a = this;
if (a.artworkList) {
a.artworkList.unbind();
a.artworkList = null
}
$(a.el).remove()
}
});
ap.slideshow.layout.ThumbnailStripView = ap.thumbnailstrip.layout.Main.extend({
id: "slideshow-thumbnail-strip",
isSlideshow: true,
initialize: function () {
ap.thumbnailstrip.layout.Main.prototype.initialize.call(this, [this.options])
}
});
ap.namespace("ap.artwork.layout").Main = ap.globals.MainBaseView.extend({
el: $("body"),
options: {
visibleButtons: [".plusone", ".discover", ".share", ".add-to-collection", ".slideshow", ".streetview"]
},
cssHooks: {
DETAILS_CLASS: "showing_details",
SECONDARY_NAV_EXPANDED: "secondary_expanded"
},
config: {
overviewBarAnimSpeed: 250,
viewTransitionSpeed: 1000,
titleCharTruncCount: 8,
artistCharTruncCount: 6
},
events: function () {
var a = {
"click .details-trigger": "setupDetails"
};
if (!ap.isMobile) {
a["mousemove .microscope"] = "setPivotHideTimeout";
a["mouseenter #pivots"] = "clearPivotHideTimeout"
}
return a
},
elements: {
$artwork: $("div.artwork"),
$artworkDetails: $(".artwork-details"),
$artworkWrapper: $("#artwork-wrapper"),
$header: $("#header"),
$footer: $("#footer"),
$overviewBarProp: $("#secondary-prop"),
$secondaryNav: $("nav.secondary"),
$thumbSlider: $(".artwork_thumbs .track .slider"),
$artworkAssets: $(".artwork_assets_wrapper li.asset"),
$artworkDescriptions: $(".artwork_object_details li.asset_description"),
$detailsTrigger: $("a.details-trigger"),
$pageContent: $(".content-wrapper")
},
overviewBarData: {
$overviewBar: $("nav.secondary"),
$artwork_location: $(".artwork-info-container ul.artwork-info-data-list"),
$artwork_location_height: "",
$artwork_title: $(".artwork-info-container .artwork-title"),
$artwork_title_marginTop: "",
$artwork_info_container: $(".artwork-info-container")
},
isInitalLoad: true,
jScrollPaneApi: null,
secondaryjScrollPaneApi: null,
thumbnailStrip: null,
microscope: null,
artworkDetailView: null,
pivotHideTimeout: null,
pivotHideDelay: 1000,
slideShowData: {
collection: null,
startModel: null
},
initialize: function (b) {
var a = this;
ap.globals.MainBaseView.prototype.initialize.call(a, [b]);
_.bindAll(this, "onBeforeSidebarResize", "onSidebarResize", "getArtworkResourceUri", "updateArtwork", "resizeMicroscopeViewer", "showArtworkDetails", "showArtwork", "setupDetails", "setPivotHideTimeout", "togglePivots", "clearPivotHideTimeout");
a.microscope = new ap.microscope.layout.Main({
container: a.elements.$artworkWrapper,
imageUrl: a.elements.$artworkWrapper.data("image-url"),
aspectRatio: a.elements.$artworkWrapper.data("aspect-ratio")
});
a.resizeMicroscopeViewer(false);
if (!a.elements.$artworkWrapper.hasClass("hide-thumbnails")) {
a.thumbnailStrip = new ap.thumbnailstrip.layout.Main({
container: a.elements.$artworkWrapper,
microscope: a.microscope.microscope,
parentView: a
})
}
a.slideShowData.collection = a.thumbnailStrip.artworkList;
a.setupOverviewBar();
a.render();
a.setupDetails()
},
clearPivotHideTimeout: function () {
clearTimeout(this.pivotHideTimeout)
},
setPivotHideTimeout: function () {
if (this.thumbnailStrip) {
this.thumbnailStrip.pivotView.el.css("opacity", 1)
}
this.clearPivotHideTimeout();
this.pivotHideTimeout = setTimeout(this.togglePivots, this.pivotHideDelay)
},
togglePivots: function () {
this.thumbnailStrip.pivotView.el.css("opacity", 0)
},
setupAnalyticsTracking: function () {
var b = this;
var a = $("body").data("museum-url");
$("li.asset.details").on("click", 'a[href^="http"]',
function (d) {
var c = encodeURIComponent(d.attr("href"));
ap.trackMuseumLinkClicked({
collection_slug: $("body").data("museum-url"),
external_url: c
}, ap.getMuseumAnalyticsId())
})
},
setupOverviewBar: function () {
var b = this;
var c = b.cssHooks;
var d = b.elements;
var a = b.overviewBarData;
a.$artwork_location_height = a.$artwork_location.height();
a.$artwork_location.show().css("height", "1px");
b.overviewBarData.$artwork_info_container.bind("mouseenter",
function () {
$(this).addClass(c.SECONDARY_NAV_EXPANDED);
a.$artwork_location.stop().animate({
height: a.$artwork_location_height
}, {
duration: b.$overviewBarAnimSpeed,
queue: false
});
a.$artwork_info_container.stop().animate({
top: -1 * a.$artwork_location_height / 2
}, {
duration: b.$overviewBarAnimSpeed,
queue: false
})
});
b.overviewBarData.$artwork_info_container.bind("mouseleave",
function () {
if (!b.el.hasClass(c.DETAILS_CLASS)) {
$(this).removeClass(c.SECONDARY_NAV_EXPANDED);
a.$artwork_location.animate({
height: 1
}, {
duration: b.$overviewBarAnimSpeed,
queue: false
});
a.$artwork_info_container.stop().animate({
top: 0
}, {
duration: b.$overviewBarAnimSpeed,
queue: false
})
}
})
},
setupDetails: function () {
var a = this;
if (a.el.hasClass(a.cssHooks.DETAILS_CLASS)) {
a.el.removeClass(a.cssHooks.DETAILS_CLASS);
a.resizeMicroscopeViewer(true);
a.showArtwork(function () {
a.onSidebarResize()
})
} else {
a.onBeforeSidebarResize();
a.showArtworkDetails()
}
},
resizeMicroscopeViewer: function (b, j) {
var a = this;
if (a.el.hasClass(a.cssHooks.DETAILS_CLASS)) {
if (b) {
a.elements.$pageContent.animate({
height: $(".artwork-details").outerHeight()
},
function () {
if (j) {
j()
}
})
} else {
a.elements.$pageContent.height($(".artwork-details").outerHeight())
}
} else {
var f = parseInt($(window).height(), 10);
var c = f - (a.elements.$secondaryNav.height() + (a.elements.$header.height() + a.elements.$footer.outerHeight()));
if (b === undefined || b === false) {
a.microscope.el.height(c);
a.elements.$pageContent.height(c)
} else {
a.microscope.el.animate({
height: c
});
a.elements.$pageContent.animate({
height: c
},
function () {
if (j) {
j()
}
})
}
}
if (a.sidebar) {
var d = $(window).width();
var e = a.sidebar.closedWidth + a.sidebar.el.position().left;
$(".content-with-sidebar").css({
marginLeft: e,
width: (d - e) + "px"
})
}
if (a.jScrollPaneApi !== null) {
a.jScrollPaneApi.reinitialise()
}
},
showArtwork: function (c) {
var a = this;
a.elements.$detailsTrigger.removeClass("active").attr("href", "#").text(TRANSLATIONS.details);
a.el.removeClass(a.cssHooks.DETAILS_CLASS);
a.elements.$artworkWrapper.animate({
top: "0"
});
var b = a.microscope.el.outerHeight();
a.elements.$pageContent.animate({
height: b
}, c);
a.sidebar.el.removeClass("grey");
a.overviewBarData.$artwork_info_container.trigger("mouseleave");
if (a.recommendedBarView) {
a.recommendedBarView.el.hide()
}
},
showArtworkDetails: function (d) {
var b = this;
if (b.streetview && b.streetview.sidebar.open) {
b.streetview.sidebar.killMuseumView();
b.streetview.sidebar.closeSidebar()
}
if (b.artworkDetailView) {
b.elements.$detailsTrigger.addClass("active").attr("href", "#details").text(TRANSLATIONS.close_details);
b.el.addClass(b.cssHooks.DETAILS_CLASS);
b.overviewBarData.$artwork_info_container.trigger("mouseenter");
var c = b.microscope.el.height();
b.elements.$artworkWrapper.animate({
top: "-" + c + "px"
});
var a = $(".artwork-details").outerHeight();
if (a > c) {
b.elements.$pageContent.animate({
height: a
})
}
b.sidebar.el.addClass("grey");
if (typeof d === "function") {
d()
}
ap.trackDetailsPane({}, ap.getMuseumAnalyticsId())
}
if (b.recommendedBarView) {
b.recommendedBarView.el.show()
}
},
onBeforeSidebarResize: function () {
var a = this;
a.thumbnailStrip.hide = false;
a.thumbnailStrip.clearHideTimeout();
a.thumbnailStrip.detachEvents();
a.thumbnailStrip.doHide()
},
onSidebarResize: function () {
var a = this;
if (!$("body").hasClass(a.cssHooks.DETAILS_CLASS)) {
a.thumbnailStrip.el.show();
a.thumbnailStrip.hide = true;
a.thumbnailStrip.setHideTimeout();
a.thumbnailStrip.attachEvents();
a.thumbnailStrip.jScrollPaneApi.reinitialise()
}
},
getArtworkResourceUri: function (e, f, a, k) {
var l = this;
l.elements.$detailsTrigger.removeClass("ready");
var d = l.el.find("a.artwork[data-artwork-id=" + a + "]");
var c;
var j = false;
if (d.length) {
j = true;
var b = $(d).data("model");
$(".add-to-collection-content .artwork-panel img").attr("src", b.attributes.aggregation_image_url + "=s100");
l.updateArtwork(b.attributes, j, k);
l.attachArrowEvents()
} else {
if (CURRENT_ARTWORK) {
$(".add-to-collection-content .artwork-panel img").attr("src", CURRENT_ARTWORK.attributes.aggregation_image_url + "=s100");
l.updateArtwork(CURRENT_ARTWORK.attributes, j, k);
l.attachArrowEvents();
CURRENT_ARTWORK = null
} else {
c = ap.buildApiUrl(["artwork", a]);
$.get(c,
function (m) {
l.updateArtwork(m, j, k);
l.attachArrowEvents()
})
}
}
},
attachArrowEvents: function () {
var b = $("a.artwork.active");
var a = $(b).next();
if (a.length) {
$(".artwork-next").attr("href", a.attr("href"));
$(".artwork-next").unbind("click").click(function () {
a.click();
return false
})
}
var c = $(b).prev();
if (c.length) {
$(".artwork-previous").attr("href", c.attr("href"));
$(".artwork-previous").unbind("click").click(function () {
c.click();
return false
})
}
},
updateArtwork: function (d, k, p) {
var q = this,
j, m;
if (!q.isInitalLoad) {
ap.log("Not initial load - tracking the new pageview", "info");
ap.setMuseumAnalyticsId(d.collection_analytics_id);
ap.trackDynamicPageView(ap.getMuseumAnalyticsId())
}
if (q.artworkDetailView) {
q.artworkDetailView.unbind();
q.artworkDetailView.remove()
}
q.slideShowData.startModel = d;
if (k) {
q.microscope.loadImage(d.cached_artwork_primary_image_full_url, d.primary_image_aspect_ratio)
}
q.el.data("artwork-id", d.id).attr("data-artwork-id", d.id);
q.el.data("artwork-slug", d.slug).attr("artwork-slug", d.slug);
q.el.data("museum-url", d.collection_detail_url).attr("museum-url", d.collection_detail_url);
q.el.data("artist-id", d.artist_id).attr("data-artist-id", d.artist_id);
q.el.data("canonical-artist-id", d.canonical_artist_id).attr("data-canonical-artist-id", d.canonical_artist_id);
q.el.data("earliest-date", d.pivot_earliest_decade).attr("data-earliest-date", d.pivot_earliest_decade);
q.el.data("latest-date", d.pivot_latest_decade).attr("data-latest-date", d.pivot_latest_decade);
$("#artwork-wrapper").data("artwork-id", d.id);
q.onSidebarResize();
var n = ($(".artwork-info-wrapper").hasClass("showing-hidden") && ap.isMobile) ? false : true;
if (n) {
var l = ap.truncatewords(d.title, q.config.titleCharTruncCount);
var c = d.title;
var f = ap.truncatewords(d.artist_display_name, q.config.artistCharTruncCount);
var o = d.artist_display_name
} else {
var l = d.title;
var c = ap.truncatewords(d.title, q.config.titleCharTruncCount);
var f = d.artist_display_name;
var o = ap.truncatewords(d.artist_display_name, q.config.artistCharTruncCount)
}
ap.updateTitle(ap.truncatewords(l, q.config.titleCharTruncCount));
$(".artwork-name").text(l);
$(".artwork-name").data("alt", c);
j = d.canonical_artist_detail_url;
m = $("<a />", {
text: f
}).attr("href", j);
$(".artwork-artist").html(m);
$(".artwork-artist").data("alt", o);
var b;
if (d.pretty_display_date) {
b = d.pretty_display_date
} else {
b = ""
}
$(".artwork-date_range").text(b);
$(".museum-link a").attr("href", d.collection_detail_url).text(d.collection_display_name);
if (d.level) {
$(".artwork-level a").attr("href", d.level_detail_url).text(d.level_display_name).show()
} else {
$(".artwork-level a").hide()
}
if (d.level && d.room) {
$(".artwork-room a").attr("href", d.room_detail_url).text(d.room_display_name).show()
} else {
$(".artwork-room a").hide()
}
var e = ap.buildApiUrl(["asset"], {
artwork: d.id,
limit: 50
});
var a = {
artwork: d,
assets: [],
artist: {}
};
if (CURRENT_ARTWORK_ASSETS && CURRENT_ARTWORK_ARTIST) {
a.assets = CURRENT_ARTWORK_ASSETS.objects;
a.artist = CURRENT_ARTWORK_ARTIST;
CURRENT_ARTWORK_ARTIST = null;
CURRENT_ARTWORK_ASSETS = null;
q.artworkDetailView = new ap.artwork.layout.DetailsPaneView({
context: a,
parentView: q,
openAfterLoad: p
})
} else {
$.get(e,
function (r) {
a.assets = r.objects;
$.get(a.artwork.artist + "?format=json",
function (s) {
a.artist = s;
q.artworkDetailView = new ap.artwork.layout.DetailsPaneView({
context: a,
parentView: q,
openAfterLoad: p
})
})
})
}
this.isInitalLoad = false;
$(".content-with-sidebar").trigger("content-change")
},
render: function () {
var b = this;
ap.globals.MainBaseView.prototype.render.call(b, [b.options]);
var a = $(window).width() - b.sidebar.el.width();
b.elements.$artwork.width(a);
$(document).on("beforeResize", b.sidebar.el.selector, b.onBeforeSidebarResize);
$(document).on("resize", b.sidebar.el.selector, b.onSidebarResize);
$(window).smartresize(function () {
b.resizeMicroscopeViewer(false)
})
}
});
var ArtworkRouter = Backbone.Router.extend({
routes: {
"collection/:museumslug/artwork/:artworkslug/:artworkid/museumview/*encodedLocation": "showMuseumView",
":countryCode/collection/:museumslug/artwork/:artworkslug/:artworkid/museumview/*encodedLocation": "showMuseumViewI18N",
"collection/:museumslug/artwork/:artworkslug/:artworkid/": "getArtworkResourceUri",
"*lang/collection/:museumslug/artwork/:artworkslug/:artworkid/": "getArtworkResourceUri"
},
showMuseumViewI18N: function (c, b, d, e, a) {
this.showMuseumView(b, d, e, a)
},
showMuseumView: function (b, c, d, a) {
if (window.location.hash == "#ref='annotation'") {
ap.trackAnnotationClicked({
collection_slug: $("body").data("museum-url"),
aw_slug: $("body").data("artwork-slug"),
aw_id: $("body").data("artwork-id")
}, ap.getMuseumAnalyticsId())
} else {
ap.trackOpenMuseumView($("body").data("museum-url"), ap.getMuseumAnalyticsId())
}
window.app.sidebar.killMuseumView();
window.app.sidebar.showMuseumView(null, a)
},
hideMuseumView: function () {
window.app.sidebar.hideMuseumView()
},
getArtworkResourceUri: function (f, d, c, b) {
window.app.sidebar.hideMuseumView();
var a, e, k, j = false;
if (typeof b === "undefined") {
a = f;
e = d;
k = c
} else {
a = d;
e = c;
k = b
}
if (window.location.hash == "#details") {
j = true
}
window.app.getArtworkResourceUri(a, e, k, j)
}
});
$(document).ready(function () {
if ($("#artwork").length && !ap.isMobile) {
window.app = new ap.artwork.layout.Main();
window.app.router = new ArtworkRouter();
Backbone.history.start({
pushState: true
})
}
});
ap.namespace("ap.artist.layout").ColumnView = Backbone.View.extend({
tagName: "div",
className: "column",
itemCount: 0,
contentString: "",
initialize: function () {
_.bindAll(this, "render");
return this.render()
},
render: function () {
return this
}
});
ap.namespace("ap.artist.layout").LetterView = Backbone.View.extend({
template: '<div class="item letter"><span></span><%= letter %></div>',
initialize: function () {
var a = this;
_.bindAll(this, "render");
a.el = _.template(a.template, {
letter: a.options.letter.toUpperCase()
});
return a.render()
},
render: function () {
return this
}
});
ap.namespace("ap.artist.layout").ArtistView = Backbone.View.extend({
template: null,
isLetter: false,
initialize: function () {
var a = this;
this.el = _.template($("#artist-template").html(), {
artist: a.model.attributes
});
return this.render()
},
render: function () {
return this
}
});
ap.namespace("ap.artist.layout").MainView = ap.globals.MainNameListView.extend({
el: $(".content-with-sidebar"),
container: $(".content-with-sidebar .artists"),
defaultQueryStringParams: {
offset: 0,
limit: 30
},
events: {
"click .item.letter.grey": "applyFilter"
},
currentLetter: null,
currentColumn: null,
maxItemsInColumn: 0,
aggregationConfig: {
aggregationType: "ArtistList",
collectionOptions: {},
modelViewType: "ArtistView",
useDynamicRows: false,
viewType: null,
urlParts: ["canonical_artist"],
isSearch: true
},
options: {
disabledButtons: [".add-to-collection", ".slideshow"],
visibleButtons: [".plusone", ".discover", ".share", ".add-to-collection", ".slideshow"],
},
attributeToSlice: "display_name",
modelView: ap.artist.layout.ArtistView,
columns: [],
columnsCount: 1,
itemHeight: 54,
isEmptyCall: false,
showingInitialItems: true,
initialize: function () {
var a = this;
_.bindAll(this, "render", "addOne", "createNewColumn", "filterCurrentCollection", "applyFilter", "reorganiseColumns");
a.initialItems = a.container.children().clone();
$.extend(a.options, {
urlParts: a.aggregationConfig.urlParts,
aggregationConfig: a.aggregationConfig,
disabledButtons: [".add-to-collection", ".slideshow"],
visibleButtons: [".plusone", ".discover", ".share", ".add-to-collection", ".slideshow"]
});
a.bind("filterCurrentCollection", a.checkForFilterReset);
ap.globals.MainNameListView.prototype.initialize.apply(a, [a.options]);
$(window).smartresize(this.reorganiseColumns)
},
applyFilter: function (a) {
a.preventDefault();
var c = $(a.currentTarget);
var b = c.data("letter").toLowerCase();
this.showingInitialItems = false;
this.isEmptyCall = false;
this.topFiltersView.setActiveFilter("display_name_firstletter", b);
this.filterCurrentCollection("display_name_firstletter", b);
return false
},
checkForFilterReset: function (b, c, a) {
if (arguments.length == 0) {
this.isEmptyCall = true
}
},
clearCollectionElements: function (a) {
if (a !== true) {
this.currentColumn = null
}
this.columnsCount = 1;
this.currentLetter = null;
this.container.empty();
this.container.width(0)
},
filterCurrentCollection: function () {
this.jScrollPaneApi.scrollToX(0, false);
if (this.currentXHR) {
this.currentXHR.abort()
}
if (this.isEmptyCall) {
this.isEmptyCall = false;
this.showingInitialItems = true;
this.showInitialItems()
} else {
this.itemHeight = 44;
ap.globals.MainNameListView.prototype.filterCurrentCollection.apply(this, arguments)
}
},
showInitialItems: function () {
this.itemHeight = 54;
this.clearCollectionElements();
this.container.append(this.initialItems.clone());
this.reorganiseColumns(false)
},
calculateMaxHeight: function () {
var a = this;
var b = $(a.el).height() - 60;
var c = Math.floor(b / a.itemHeight);
a.maxItemsInColumn = c
},
addNewlyLoaded: function () {
if (!this.showingInitialItems) {
ap.globals.MainNameListView.prototype.addNewlyLoaded.apply(this)
}
},
addOne: function (c) {
var b = this;
var a = c.attributes[b.attributeToSlice].slice(0, 1).toLowerCase();
if (b.currentLetter != a) {
b.currentLetter = a;
var d = new ap.artist.layout.LetterView({
letter: b.currentLetter
});
b.addToColumn(d.el)
}
var e = new b.modelView({
model: c
});
b.addToColumn(e.el)
},
needToLoadMore: function () {
return this.container.width() < $(this.el).width() + 320
},
render: function () {
ap.globals.MainBaseView.prototype.render.apply(this, [this.options]);
this.preloaderview = new ap.aggregation.layout.PreloaderView();
this.preloaderview.render();
this.preloaderview.displayPreloader(true);
if (this.topFiltersView) {
this.topFiltersView.render()
}
this.mainScrollingView = new ap.aggregation.layout.MainScrollingView({
el: this.el
});
this.jScrollPaneApi = this.mainScrollingView.render();
this.infiniteScrollingView = new ap.aggregation.layout.InfiniteScrollingView({
el: this.el,
jScrollPaneApi: this.jScrollPaneApi,
collection: this.currentCollection,
selector: ".column:last-child",
scrollTriggerOffset: 30
});
this.infiniteScrollingView.render();
$(this.sidebar.el.selector).on("resize", this.sidebar.el.selector, this.onSidebarResize);
this.reorganiseColumns()
}
});
$(document).ready(function () {
if ($("#artists").length) {
window.app = new ap.artist.layout.MainView();
window.app.render()
}
});
ap.namespace("ap.museumlist.layout").MuseumView = Backbone.View.extend({
tagName: "div",
className: "item museum",
template: null,
logo: null,
museumName: null,
optionsContainer: null,
infoContainer: null,
optionTexts: null,
animOptions: {
queue: false,
duration: 400
},
widthsCalculated: false,
isExpanded: false,
isLetter: false,
initialize: function () {
_.bindAll(this, "render", "expand", "shrink", "setOptionTextWidths");
this.render();
return this
},
shrink: function () {
this.isExpanded = false;
this.$el.removeClass("hover")
},
expand: function () {
this.isExpanded = true;
this.$el.addClass("hover")
},
expandOption: function (a) {
if (!this.isExpanded) {
return
}
a.stop().animate({
paddingRight: 7,
width: a.data("width")
}, this.animOptions)
},
shrinkOption: function (a) {
a.stop().animate({
paddingRight: 0,
width: 0
}, this.animOptions)
},
setOptionTextWidths: function () {
$.each(this.optionTexts,
function (a, b) {
$(b).data("width", $(b).width());
$(b).width(0)
})
},
render: function () {
this.$el = $(this.el);
this.$el.html(_.template($("#collection-template").html(), {
museum: this.model.attributes
}));
return this
}
});
ap.namespace("ap.museumlist.layout").ContinentDropdownView = Backbone.View.extend({
el: $("#continent_filter"),
elWidth: null,
events: {
"click li a": "showNext",
"click a.current": "toggleDropdown",
},
map: null,
menuWrapper: null,
continents: null,
countries: null,
cities: null,
previousLevel: null,
currentLevel: "continents",
nextLevel: "countries",
initialHeight: 0,
levels: {
continents: {
previous: null,
next: "countries"
},
countries: {
previous: "continents",
next: "cities"
},
cities: {
previous: "countries",
next: null
}
},
initialize: function () {
var b = this;
$("body").on("click",
function () {
b.hideDropdown()
});
_.bindAll(this, "render", "showDropdown", "showNext");
this.mapView = this.options.mapView;
this.menuWrapper = this.el.find(".filter-wrapper").eq(0);
var a = this.el.find("ul");
this.continents = a.eq(0);
this.worldLink = this.continents.find("li:first a").text();
this.countries = this.continents.find("ul");
this.cities = this.countries.find("ul");
this.currentPlaceLink = this.el.find("a.current").eq(0);
this.parentView = this.options.parentView
},
showDropdown: function (a) {
this.menuWrapper.show();
if (this.initialHeight == 0) {
this.initialHeight = this.continents.outerHeight()
}
this.elWidth = this.elWidth || this.el.outerWidth();
this.el.width(this.elWidth);
this.menuWrapper.width(this.elWidth);
this.menuWrapper.fadeIn();
$("#continent_filter a.current").addClass("open");
a.stopPropagation()
},
hideDropdown: function () {
this.menuWrapper.fadeOut();
$("#continent_filter a.current").removeClass("open")
},
render: function () {},
showNext: function (a) {
a.preventDefault();
var f = $(a.currentTarget);
var d = f.parent().hasClass("back");
if (f.data("level") == "reset") {
this.parentView.trigger("mapLocationFiltered");
if (this.mapView) {
this.mapView.resetLocationFilter()
}
} else {
if (f.data("level") == "countries" && f.data("filter-value")) {
this.parentView.trigger("mapLocationFiltered", f.data("filter-value"));
this.hideDropdown()
}
}
this.currentLevel = this.levels[f.data("level")];
if (this.currentLevel) {
if (!d) {
this.currentPlaceLink.text(f.text());
if (this.mapView) {
this.mapView.findPlace(f.text())
}
}
if (!d && this.currentLevel.next) {
var e = f.next();
this[this.currentLevel.next].hide();
e.show();
this.menuWrapper.animate({
height: e.outerHeight(),
width: this.elWidth
});
if (e[0]) {
this.menuWrapper.find("ul").eq(0).animate({
left: "-=" + this.elWidth
})
}
} else {
if (d && this.currentLevel.previous) {
var c = f.parents("ul");
var e = c.eq(1);
var b = c.eq(0);
this.currentPlaceLink.text(b.prev().text());
if (this.mapView) {
this.mapView.findPlace(b.prev().text())
}
if (e.hasClass("first")) {
this.menuWrapper.animate({
height: e.outerHeight(),
width: this.elWidth
})
} else {
this.menuWrapper.animate({
height: e.outerHeight(),
width: this.elWidth
})
}
this.menuWrapper.find("ul").eq(0).animate({
left: "+=" + this.elWidth
})
}
}
} else {
this.currentPlaceLink.text(f.text());
this.hideDropdown();
if (this.mapView) {
this.mapView.resetMap()
}
}
a.stopPropagation()
},
resetDropdown: function () {
if (this.initialHeight > 0) {
this.currentPlaceLink.text(this.worldLink);
this.previousLevel = null;
this.currentLevel = "continents";
this.nextLevel = "countries";
this.menuWrapper.css({
height: this.initialHeight,
width: this.elWidth
});
this.continents.css({
left: 0
})
}
if (this.mapView) {
this.mapView.resetMap()
}
},
toggleDropdown: function (b) {
var a = this;
if (a.$(".filter-wrapper").is(":visible")) {
a.hideDropdown(b)
} else {
a.showDropdown(b)
}
}
});
ap.namespace("ap.museumlist.layout").MarkerView = Backbone.View.extend({
template: null,
initialize: function () {
var a = this;
this.el = _.template($("#map-marker-template").html(), {
museum: a.model.attributes
});
return this.render()
},
render: function () {
return this
}
});
ap.namespace("ap.museumlist.layout").ContinentDropdownView = Backbone.View.extend({
el: $("#continent_filter"),
elWidth: null,
events: {
"click li a": "showNext",
"click a.current": "toggleDropdown",
},
map: null,
menuWrapper: null,
continents: null,
countries: null,
cities: null,
previousLevel: null,
currentLevel: "continents",
nextLevel: "countries",
initialHeight: 0,
levels: {
continents: {
previous: null,
next: "countries"
},
countries: {
previous: "continents",
next: "cities"
},
cities: {
previous: "countries",
next: null
}
},
initialize: function () {
var b = this;
$("body").on("click",
function () {
b.hideDropdown()
});
_.bindAll(this, "render", "showDropdown", "showNext");
this.mapView = this.options.mapView;
this.menuWrapper = this.el.find(".filter-wrapper").eq(0);
var a = this.el.find("ul");
this.continents = a.eq(0);
this.worldLink = this.continents.find("li:first a").text();
this.countries = this.continents.find("ul");
this.cities = this.countries.find("ul");
this.currentPlaceLink = this.el.find("a.current").eq(0);
this.parentView = this.options.parentView
},
showDropdown: function (a) {
this.menuWrapper.show();
if (this.initialHeight == 0) {
this.initialHeight = this.continents.outerHeight()
}
this.elWidth = this.elWidth || this.el.outerWidth();
this.el.width(this.elWidth);
this.menuWrapper.width(this.elWidth);
this.menuWrapper.fadeIn();
$("#continent_filter a.current").addClass("open");
a.stopPropagation()
},
hideDropdown: function () {
this.menuWrapper.fadeOut();
$("#continent_filter a.current").removeClass("open")
},
render: function () {},
showNext: function (a) {
a.preventDefault();
var f = $(a.currentTarget);
var d = f.parent().hasClass("back");
if (f.data("level") == "reset") {
this.parentView.trigger("mapLocationFiltered");
if (this.mapView) {
this.mapView.resetLocationFilter()
}
} else {
if (f.data("level") == "countries" && f.data("filter-value")) {
this.parentView.trigger("mapLocationFiltered", f.data("filter-value"));
this.hideDropdown()
}
}
this.currentLevel = this.levels[f.data("level")];
if (this.currentLevel) {
if (!d) {
this.currentPlaceLink.text(f.text());
if (this.mapView) {
this.mapView.findPlace(f.text())
}
}
if (!d && this.currentLevel.next) {
var e = f.next();
this[this.currentLevel.next].hide();
e.show();
this.menuWrapper.animate({
height: e.outerHeight(),
width: this.elWidth
});
if (e[0]) {
this.menuWrapper.find("ul").eq(0).animate({
left: "-=" + this.elWidth
})
}
} else {
if (d && this.currentLevel.previous) {
var c = f.parents("ul");
var e = c.eq(1);
var b = c.eq(0);
this.currentPlaceLink.text(b.prev().text());
if (this.mapView) {
this.mapView.findPlace(b.prev().text())
}
if (e.hasClass("first")) {
this.menuWrapper.animate({
height: e.outerHeight(),
width: this.elWidth
})
} else {
this.menuWrapper.animate({
height: e.outerHeight(),
width: this.elWidth
})
}
this.menuWrapper.find("ul").eq(0).animate({
left: "+=" + this.elWidth
})
}
}
} else {
this.currentPlaceLink.text(f.text());
this.hideDropdown();
if (this.mapView) {
this.mapView.resetMap()
}
}
a.stopPropagation()
},
resetDropdown: function () {
if (this.initialHeight > 0) {
this.currentPlaceLink.text(this.worldLink);
this.previousLevel = null;
this.currentLevel = "continents";
this.nextLevel = "countries";
this.menuWrapper.css({
height: this.initialHeight,
width: this.elWidth
});
this.continents.css({
left: 0
})
}
if (this.mapView) {
this.mapView.resetMap()
}
},
toggleDropdown: function (b) {
var a = this;
if (a.$(".filter-wrapper").is(":visible")) {
a.hideDropdown(b)
} else {
a.showDropdown(b)
}
}
});
ap.namespace("ap.maps.layout").Main = Backbone.View.extend({
el: $(document),
mapStyles: [{
stylers: [{
invert_lightness: true
}, {
saturation: -100
}, {
visibility: "on"
}, {
gamma: 0.7
}]
}],
mapCanvas: $(".map"),
markerData: [],
map: null,
mapCentre: null,
mapZoom: 0,
markerClusterer: null,
markerList: [],
mainMapOptions: {},
mapLoaded: false,
infobox: null,
infoboxTemplate: $("#map-marker-template").html(),
pinIcon: "/skip_media_generator/map-pin.png",
clusterStyle: [{
fontWeight: "normal",
gridSize: 32,
height: 22,
textColor: "#030303",
textSize: 12,
url: "/skip_media_generator/map-pin-circle-yellow.png",
width: 22
}],
extraScripts: ["markerwithlabel", "markerclusterer", "infobox"],
sidebarView: null,
parentView: null,
showMapAfterLoad: false,
initialize: function () {
_.bindAll(this, "initMap", "loadExtraScripts", "show", "hide", "findPlace", "resetMap");
this.sidebarView = this.options.sidebarView;
this.parentView = this.options.parentView
},
resetMap: function () {
this.map.setCenter(this.mapCentre);
this.map.setZoom(this.mapZoom)
},
initMap: function () {
var a = this;
var c = a.mapCanvas.data("lat");
var b = a.mapCanvas.data("lng");
a.mapZoom = a.mapCanvas.data("zoom");
a.mapCentre = new google.maps.LatLng(c, b);
a.mainMapOptions = {
center: a.mapCentre,
disableDefaultUI: true,
mapTypeId: google.maps.MapTypeId.ROADMAP,
minZoom: 2,
styles: a.mapStyles,
zoom: a.mapZoom
};
a.map = new google.maps.Map(a.mapCanvas.get(0), a.mainMapOptions);
var d = {
disableAutoPan: true,
maxWidth: 0,
pixelOffset: new google.maps.Size(-160, - 131),
zIndex: null,
closeBoxURL: "",
infoBoxClearance: new google.maps.Size(1, 1),
pane: "floatPane",
enableEventPropagation: true
};
a.infobox = new InfoBox(d);
$.each(a.parentView.rawModels,
function (f, e) {
a.markerData.push(e.attributes)
});
$.each(a.markerData,
function (f, e) {
if (e.latitude && e.longitude) {
a.addMarker(e)
}
});
a.markerClusterer = new MarkerClusterer(a.map, a.markerList, {
gridSize: 22,
styles: a.clusterStyle
});
a.addZoomControl();
a.attachEvents();
a.mapLoaded = true;
ap.log("[Debug] Finished Init");
if (a.showMapAfterLoad) {
a.show()
}
},
resetLocationFilter: function () {
this.parentView.trigger("mapLocationFiltered", false)
},
findPlace: function (a) {
var b = this,
c = new google.maps.Geocoder();
c.geocode({
address: a.replace(" ", "+")
},
function (l, j) {
var m, e, o, f, p, n, d, k, q;
if (j === "OK") {
m = l[0].geometry;
e = m.viewport.getNorthEast();
o = m.viewport.getSouthWest();
f = 256;
p = o.lng();
n = e.lng();
d = n - p;
k = $(b.map.getDiv()).outerWidth();
if (d < 0) {
d += 360
}
q = Math.round(Math.log(k * 360 / d / f) / Math.LN2);
b.map.setZoom(q - 1);
b.map.setCenter(m.location)
}
})
},
refreshMap: function () {
google.maps.event.trigger(this.map, "resize");
this.map.setCenter(this.mapCentre);
this.map.setZoom(this.mapZoom)
},
show: function () {
var a = this;
if (a.mapLoaded) {
a.parentView.resetFilters();
a.mapCanvas.parent().show();
a.refreshMap();
$("body").removeClass("view-multi-rows").addClass("view-map")
} else {
setTimeout(a.show, 100)
}
},
hide: function () {
var a = this;
if (a.mapLoaded) {
a.mapCanvas.parent().hide();
$("body").removeClass("view-map").addClass("view-multi-rows")
}
},
attachEvents: function () {
var a = this;
google.maps.event.addDomListener(a.map, "zoom_changed",
function () {
if (a.map.getZoom() == a.mainMapOptions.minZoom) {
a.map.panTo(a.mapCentre)
}
})
},
addZoomControl: function () {
var c = this;
var b = $('<div id="zoomControl"></div>');
var d = $('<a class="zoomIn"></a>');
var a = $('<a class="zoomOut"></a>');
b.append(d).append(a);
c.map.controls[google.maps.ControlPosition.TOP_RIGHT].push(b.get(0));
google.maps.event.addDomListener(d.get(0), "click",
function () {
c.map.setZoom(c.map.getZoom() + 1)
});
google.maps.event.addDomListener(a.get(0), "click",
function () {
c.map.setZoom(c.map.getZoom() - 1)
})
},
createInfoBoxContent: function (a) {
var b = this;
var c = _.template(b.infoboxTemplate, a.museum);
return c
},
addMarker: function (c) {
var b = this;
var a = new MarkerWithLabel({
draggable: false,
icon: b.pinIcon,
labelAnchor: new google.maps.Point(3, 31),
labelClass: "map-label",
labelContent: "",
labelInBackground: true,
map: b.map,
museum: c,
position: new google.maps.LatLng(c.latitude, c.longitude),
url: c.detail_url
});
google.maps.event.addListener(a, "click",
function () {
ap.redirectTo(a.url)
});
google.maps.event.addListener(a, "mouseover",
function (d) {
b.infobox.setContent(b.createInfoBoxContent(a));
b.infobox.open(b.map, this)
});
google.maps.event.addListener(a, "mouseout",
function () {
b.infobox.close()
});
b.markerList.push(a)
},
loadMapsAPI: function (c) {
var b = ap.getMapsApiKey();
var a = "http://maps.googleapis.com/maps/api/js?key=" + b + "&sensor=false&callback=" + c;
ap.log("[Debug] Loading Google Maps API");
$('<script src="' + a + '">').appendTo($("body"))
},
loadExtraScripts: function () {
$.each(this.extraScripts,
function (b, c) {
ap.log("[Debug] Loading JS: " + c);
var a = $("<script />");
a.attr("type", "text/javascript");
a.attr("src", "/skip_media_generator/" + c + ".js");
$("body").append(a)
});
ap.log("[Debug] Init map start");
this.initMap()
}
});
ap.namespace("ap.museumlist.layout").MainView = ap.globals.MainNameListView.extend({
el: $(".content-with-sidebar"),
container: $(".content-with-sidebar .museums"),
aggregationConfig: {
aggregationType: "MuseumList",
collectionOptions: {},
modelViewType: "MuseumView",
useDynamicRows: false,
viewType: null,
urlParts: ["collection"]
},
options: {
disabledButtons: [".slideshow", ".add-to-collection", ".streetview"]
},
defaultQueryStringParams: {
offset: 0,
limit: 200
},
events: {
"click .museum": "gotoMuseum",
"click .view-option-map": "showMap",
"click .view-option-multi": "hideMap",
currentCollectionChange: "currentCollectionChange",
"mouseenter .item.museum": "expand",
"mouseleave .item.museum": "shrink",
"mouseenter .option": "expandOption",
"mouseleave .option": "shrinkOption"
},
museumHoverTimeout: null,
optionHoverTimeout: null,
mainScrollingView: null,
jScrollPaneApi: null,
mapsView: null,
items: $(".pane-wrapper"),
attributeToSlice: "name_lower",
modelView: ap.museumlist.layout.MuseumView,
loadMapsAfterLoad: false,
animOptions: {
queue: false,
duration: 400
},
initialize: function () {
var a = this,
b = document.location.hash;
$.extend(a.options, {
urlParts: a.aggregationConfig.urlParts,
aggregationConfig: a.aggregationConfig
});
ap.globals.MainNameListView.prototype.initialize.apply(this, [this.options]);
_.bindAll(this, "render", "onSidebarResize", "reorganiseColumns", "showMap", "hideMap", "addAll", "addNewlyLoaded", "filterByLocation");
if (b && b == "#MuseumView" && a.topFiltersView) {
a.topFiltersView.setActiveFilter("collection_type", "A", TRANSLATIONS.museumview);
a.currentCollection.setFilter("collection_type", "A")
}
$("#main-nav").on("click", ".pegman",
function (d) {
d.preventDefault();
var c = document.location.hash;
$("#main-filters .filter-museumView > a").click();
if (c && c == "#MuseumView") {
document.location.hash = ""
} else {
document.location.hash = "#MuseumView"
}
});
this.rawModels = this.currentCollection.models || [];
$("#continent_filter").show();
this.validCountries = {};
$("#continent_filter .second .filter-list-item").each(function () {
a.validCountries[$(this).data("filter-value")] = $(this).text()
});
$(window).smartresize(this.reorganiseColumns);
this.bind("mapLocationFiltered", this.filterByLocation);
a.continentDropdown = new ap.museumlist.layout.ContinentDropdownView({
parentView: a
});
a.currentCollection.bind("reset",
function () {
if (a.rawModels.length == 0) {
a.rawModels = a.currentCollection.models.slice(0);
a.continentDropdown.mapView = a.mapsView
}
});
this.render()
},
addAll: function () {
ap.globals.MainNameListView.prototype.addAll.apply(this);
if (this.loadMapsAfterLoad) {
this.showMap()
}
},
addOne: function (c) {
var b = this;
var a = c.attributes[b.attributeToSlice].slice(0, 1).toUpperCase();
if (b.currentLetter != a) {
b.currentLetter = a;
b.addToColumn('<div class="item letter"><span></span>' + b.currentLetter + "</div>")
}
b.addToColumn(_.template($("#collection-template").html(), {
museum: c.attributes
}))
},
expand: function (a) {
var b = this;
clearTimeout(this.museumHoverTimeout);
var d = $(a.currentTarget);
if (!d.data("optionWidthsCalculated")) {
var c = d.find(".option");
$.each(c,
function (e, f) {
if (!$(f).data("width") || $(f).data("width") == 0) {
b.setOptionTextWidths(d);
d.data("optionWidthsCalculated", true)
}
})
}
this.museumHoverTimeout = setTimeout(function () {
d.data("expanded", true);
d.addClass("hover")
}, 120)
},
shrink: function (a) {
clearTimeout(this.museumHoverTimeout);
var c = $(a.currentTarget),
b = c.data("expanded");
if (b) {
c.data("expanded", false);
c.removeClass("hover")
}
},
shrinkOption: function (a) {
clearTimeout(this.optionHoverTimeout);
var c = $(a.currentTarget),
b = c.data("expanded");
if (b) {
c.data("expanded", false);
c.stop().animate({
paddingRight: 0,
width: 0
}, this.animOptions)
}
},
expandOption: function (a) {
clearTimeout(this.optionHoverTimeout);
var b = $(a.currentTarget);
if (!b.data("width") || b.data("width") == 0) {
this.setOptionTextWidths(b.parent().parent())
}
this.optionHoverTimeout = setTimeout(function () {
b.data("expanded", true);
b.stop().animate({
paddingRight: 7,
width: b.data("width")
}, this.animOptions)
}, 120)
},
setOptionTextWidths: function (a) {
var b = a.find(".option");
$.each(b,
function (c, d) {
$(d).data("width", $(d).width());
$(d).width(0)
})
},
showMap: function () {
var a = this;
if (a.mapsView) {
if (!a.loadMapsAfterLoad) {
a.mapsView.show()
} else {
a.mapsView.showMapAfterLoad = true;
a.mapsView.loadMapsAPI("ap.maps.mapsCallback");
a.loadMapsAfterLoad = false
}
} else {
if (!a.loadMapsAfterLoad) {
a.mapsView = new ap.maps.layout.Main({
parentView: a
});
a.continentDropdown.mapView = a.mapsView;
ap.namespace("ap.maps").mapsCallback = a.mapsView.loadExtraScripts;
a.loadMapsAfterLoad = true
}
}
},
hideMap: function () {
if (this.mapsView) {
this.mapsView.hide()
}
this.resetFilters()
},
gotoMuseum: function (a) {
window.location = $(a.currentTarget).find(".option.artwork_view").attr("href")
},
remove: function () {},
resetFilters: function () {
var a = this;
a.topFiltersView.resetFilters();
a.topFiltersView.closeFilter();
a.continentDropdown.resetDropdown()
},
onSidebarResize: function () {
this.jScrollPaneApi.reinitialise();
if (this.mapsView) {
this.mapsView.refreshMap()
}
},
filterByLocation: function (a) {
if (a) {
this.topFiltersView.resetFilters();
this.topFiltersView.setActiveFilter("country", a, this.validCountries[a]);
this.filterCurrentCollection("country", a)
} else {
this.topFiltersView.removeActiveFilter("country");
this.filterCurrentCollection("country")
}
}
});
var MuseumListRouter = Backbone.Router.extend({
routes: {
":section": "showHideMap"
},
showHideMap: function (a) {
if (a == "map") {
window.app.showMap()
} else {
if (a == "list") {
window.app.hideMap()
}
}
}
});
$(document).ready(function () {
if ($("#museumlist").length && !ap.isMobile) {
window.app = new ap.museumlist.layout.MainView();
window.app.router = new MuseumListRouter();
Backbone.history.start()
}
});
ap.namespace("ap.details.layout").Main = Backbone.View.extend({
el: $(".detailpopup"),
$popupwrapper: $(".popupwrapper"),
$columnWrappers: $(".column_wrapper"),
$columns: $(".column"),
$popupMargins: [],
$mainContent: $(".main-content"),
jScrollPaneApi: null,
sidebar: null,
initialize: function () {
_.bindAll(this, "render", "togglePopup");
this.sidebar = this.options.sidebar;
this.$popupMargins = [parseInt(this.$popupwrapper.css("margin-top"), 10), parseInt(this.$popupwrapper.css("margin-bottom"), 10)];
this.parentView = this.options.parentView;
this.render()
},
direction: "down",
getScrollHeight: function () {
return this.el.parent().height()
},
calculateMaxHeights: function (b) {
var c = $(".main-content").position().top;
var a = b.getScrollHeight();
$(b.el).css({
height: a
}).data("initialTop", c);
if (b.direction == "up") {
$(b.el).css({
top: c
})
} else {
$(b.el).css({
top: -1 * a
})
}
var e = b.getScrollHeight() - (b.$popupMargins[0] + b.$popupMargins[1]);
b.$popupwrapper.css({
height: e
});
var d = 0;
_.each(b.$columnWrappers,
function (f) {
if ($(f).outerHeight() > d) {
d = $(f).outerHeight()
}
});
if (d < e) {
d = e
}
b.$columns.height(d)
},
render: function () {
this.el.show();
this.calculateMaxHeights(this);
this.mainScrollingView = new ap.aggregation.layout.MainScrollingView({
element: this.$popupwrapper,
useFloatingArrows: false,
useDragScrolling: false,
useKeyboardScrolling: false,
scrollBy: 30
});
this.jScrollPaneApi = this.mainScrollingView.render();
this.attachEvents();
this.setupAnalyticsTracking()
},
attachEvents: function () {
var a = this;
$(".details-trigger").click(function () {
a.togglePopup()
});
$(a.$(".close")).click(function (b) {
b.preventDefault();
a.togglePopup()
});
$(window).resize(function () {
a.calculateMaxHeights(a);
a.jScrollPaneApi.reinitialise()
})
},
setupAnalyticsTracking: function () {
var b = this;
var a = $("body").data("museum-url");
$(".detailpopup").on("click", 'a[href^="http"]',
function (d) {
var c = encodeURIComponent(d.attr("href"));
b.trackExternalMuseumLinkFollow(c)
})
},
togglePopup: function (d) {
var b = this,
c;
if (!_.isUndefined(d)) {
b.direction = d
} else {
c = b.sidebar.parentView.streetview;
if (c && c.sidebar && c.sidebar.open) {
c.sidebar.killMuseumView();
c.sidebar.closeSidebar()
}
}
b.el.stop();
var a = b.getScrollHeight();
b.el.height(a);
var e = -1 * $(b.el).height();
var f = null;
if (b.direction == "down") {
b.direction = "up";
e = b.el.data("initialTop");
$(".details-trigger").addClass("active").text(TRANSLATIONS.close_details);
b.sidebar.el.addClass("grey");
if (b.parentView.topFiltersView) {
b.parentView.topFiltersView.closeFilter();
b.parentView.topFiltersView.hideFilterButton()
}
f = function () {
b.$mainContent.hide()
};
ap.trackDetailsPane({}, ap.getMuseumAnalyticsId())
} else {
$(".details-trigger").removeClass("active").text(TRANSLATIONS.details);
b.sidebar.el.removeClass("grey");
b.direction = "down";
b.$mainContent.show();
if (b.parentView.topFiltersView) {
b.parentView.topFiltersView.showFilterButton()
}
}
if (parseInt(b.el.css("top"), 10) != e) {
b.el.animate({
top: e
},
function () {
$(window).trigger("resize");
if (f) {
f()
}
});
b.jScrollPaneApi.reinitialise()
} else {
if (f) {
f()
}
}
},
trackExternalMuseumLinkFollow: function (a) {
ap.trackMuseumLinkClicked({
collection_slug: $("body").data("museum-url"),
external_url: a
}, ap.getMuseumAnalyticsId())
}
});
ap.namespace("ap.searchoverview.layout").MainView = ap.globals.MainBaseView.extend({
options: {
disabledButtons: [".add-to-collection", ".slideshow"],
},
mainScrollingView: null,
jScrollPaneApi: null,
mapsView: null,
initialize: function (a) {
ap.log("ap.searchoverview.layout.MainView::initalize()");
this.constructor.__super__.initialize.apply(this, [a]);
_.bindAll(this, "render", "onSidebarResize", "recalculateElements");
this.render()
},
render: function () {
this.constructor.__super__.render.apply(this, [this.options]);
this.calculateWidths();
this.mainScrollingView = new ap.aggregation.layout.MainScrollingView({
useFloatingArrows: false,
jScrollPaneSettings: {
hijackInternalLinks: false,
}
});
this.jScrollPaneApi = this.mainScrollingView.render();
this.recalculateElements();
this.el.on("resize", this.sidebar.el.selector, this.onSidebarResize)
},
calculateWidths: function () {
var b = this;
var c = $(".column");
var d = c.outerWidth(true);
var a = c.length * d;
$(".pane-wrapper").width(a)
},
recalculateElements: function () {
var a = this;
var b = (!ap.isMobile) ? $(".main-content .jspContainer") : $(".main-content");
$(".column").each(function (d, f) {
var k = $(f);
var m = k.find("li");
var e = m.size();
for (var j = 0; j < e; j++) {
var c = k.height();
if (c >= b.height()) {
ap.log("height is greater - height: " + c + " jspPaneHeight: " + b.height());
a.hideItem(k)
} else {
var l = m.filter(".hidden-result");
if (l.size() > 0) {
a.showItem(k)
}
}
}
});
a.jScrollPaneApi.reinitialise()
},
hideItem: function (b) {
ap.log("Hiding item in column: ");
ap.log(b);
var a = b.find("li").not(".hidden-result").last();
ap.log("Hiding item: ");
ap.log(a);
a.addClass("hidden-result")
},
showItem: function (a) {
ap.log("Showing item in column: ");
ap.log(a);
var b = a.find("li").filter(".hidden-result").first();
ap.log("Showing item: " + b);
ap.log(ap.log(b));
b.removeClass("hidden-result")
},
onSidebarResize: function () {
this.jScrollPaneApi.reinitialise()
}
});
$(document).ready(function () {
if ($("#searchoverview").length) {
window.app = new ap.searchoverview.layout.MainView()
}
});
ap.namespace("ap.aggregation.layout").SearchBaseView = Backbone.View.extend({
highlightTerms: function () {
var a = $(body).data("search-query")
}
});
ap.namespace("ap.aggregation.layout").SearchArtworkView = Backbone.View.extend({
tagName: "div",
className: "row-item artwork",
template: $("#search-artwork-view-template").html(),
events: {},
initialize: function () {
_.bindAll(this, "render")
},
highlightTerms: function () {
var a = $(body).data("search-query")
},
render: function (e, d) {
var a = this.model.attributes;
var f = this.model.calculateImageSizeForAPI(e);
var b;
var j = this.model.attributes.primary_image_aspect_ratio < 1;
if (j) {
b = "height: " + e.height + "px;"
} else {
b = "width: " + e.width + "px;"
}
var c = {
artist_display_name: this.model.attributes.artist_display_name,
detail_url: this.model.attributes.detail_url,
img_path: this.model.image(f),
title: this.model.attributes.title,
pretty_display_date: this.model.attributes.pretty_display_date,
portrait: j,
style: b
};
$(this.el).attr("data-cid", this.model.cid);
$(this.el).attr("data-vieworder", this.model.viewOrder);
$(this.el).attr("data-imageurl", this.model.attributes.cached_artwork_primary_image_full_url);
$(this.el).attr("data-slug", this.model.attributes.slug);
$(this.el).attr("data-artwork-id", this.model.attributes.id);
$(this.el).data("model", this.model);
$(this.el).html(_.template(this.template, c));
return this
}
});
ap.namespace("ap.aggregation.layout").SearchArtistView = ap.aggregation.layout.SearchBaseView.extend({
tagName: "div",
className: "row-item artwork",
template: $("#search-artist-view-template").html(),
events: {},
initialize: function () {
_.bindAll(this, "render")
},
render: function (c, b) {
var a = this.model.attributes;
$(this.el).data("model", this.model);
$(this.el).html(_.template(this.template, a));
return this
}
});
ap.namespace("ap.aggregation.layout").SearchMuseumView = ap.aggregation.layout.SearchBaseView.extend({
tagName: "div",
className: "row-item artwork",
template: $("#search-museum-view-template").html(),
events: {},
initialize: function () {
_.bindAll(this, "render")
},
render: function (d, c) {
var a = this.model.attributes;
var b = $.extend({}, a, {
style: "height: 80px;"
});
$(this.el).data("model", this.model);
$(this.el).html(_.template(this.template, b));
return this
}
});
ap.namespace("ap.aggregation.layout").SearchBookmarkGroupView = ap.aggregation.layout.SearchBaseView.extend({
tagName: "div",
className: "row-item artwork",
template: $("#search-gallery-view-template").html(),
events: {},
initialize: function () {
_.bindAll(this, "render")
},
render: function (c, b) {
var a = this.model.attributes;
$(this.el).data("model", this.model);
$(this.el).html(_.template(this.template, a));
return this
}
});
$(document).ready(function () {
$("#faq-videos ul a").click(function () {
$("#faq-videos ul a").removeClass("active");
$(this).addClass("active");
ytid = $(this).attr("data-ytid");
$("#faq-videos iframe").attr("src", "//www.youtube.com/embed/" + ytid + "?autoplay=1");
return false
});
$("#education .answer, #faqs dd").each(function () {
$(this).data("height", $(this).height());
$(this).css({
visibility: "visible",
height: 0
})
});
if (window.location.hash == "#user_galleries_tutorial") {
var a = $(".user-gallery-tutorial-content");
a.css("height", a.data("height"))
}
$("#faqs dt").on("click",
function (j) {
var c = $(this);
var k = c.next();
var d = k.height();
var b;
var f;
if (d > 0) {
b = 0;
f = 250
} else {
b = k.data("height");
f = 500
}
k.animate({
height: b
}, f);
return false
});
$("#education .answer-trigger").on("click",
function (k) {
var c = $(this);
var l = c.next(".answer");
var f = l.height();
var d;
var j;
var b;
if (f > 0) {
d = 0;
j = 250;
b = "Show Answers";
c.css("background-position", "-467px -107px")
} else {
d = l.data("height");
j = 500;
b = "Hide Answers";
c.css("background-position", "-467px -125px")
}
l.animate({
height: d
}, j);
c.text(b);
return false
})
});
@randito
Copy link
Author

randito commented Jul 17, 2012

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment