Skip to content

Instantly share code, notes, and snippets.

@luqmaan
Created April 22, 2015 15:44
Show Gist options
  • Save luqmaan/a46816b4ccdf9ebee3ab to your computer and use it in GitHub Desktop.
Save luqmaan/a46816b4ccdf9ebee3ab to your computer and use it in GitHub Desktop.
* /
function() {
var e, t, n;
di.provide("di.ui.CanvasBlur"), t = [512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259], n = [9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24], e = function() {
return this.r = 0, this.g = 0, this.b = 0, this.a = 0, this.next = null
}, di.ui.CanvasBlur = function(i, r, o, a, s, l) {
var u, c, d, h, p, f, m, g, y, v, _, b, w, x, k, C, A, S, T, P, M, E, I, F, O, R, D, L, B, N, $, V, j, H, z, U, W, q, Y, K, G, J, Q, X, Z, et, tt, nt, it;
if (!(isNaN(l) || 1 > l)) {
for (l |= 0, m = i.getContext("2d"), x = null, x = m.getImageData(r, o, a, s), P = x.data, U = W = w = C = Y = q = K = null, F = _ = f = d = null, I = v = p = c = null, E = y = h = u = null, M = T = S = A = R = null, g = l + l + 1, H = a << 2, z = a - 1, b = s - 1, O = l + 1, j = O * (O + 1) / 2, V = new e, L = V, w = G = 1; g >= 1 ? g > G : G > g; w = g >= 1 ? ++G : --G) L = L.next = new e, w === O && (B = L);
for (L.next = V, N = null, $ = null, K = q = 0, k = t[l], D = n[l], W = J = 0; s >= 0 ? s > J : J > s; W = s >= 0 ? ++J : --J) {
for (E = y = h = u = F = _ = f = d = 0, I = O * (M = P[q]), v = O * (T = P[q + 1]), p = O * (S = P[q + 2]), c = O * (A = P[q + 3]), F += j * M, _ += j * T, f += j * S, d += j * A, L = V, w = Q = 0; O >= 0 ? O > Q : Q > O; w = O >= 0 ? ++Q : --Q) L.r = M, L.g = T, L.b = S, L.a = A, L = L.next;
for (w = X = 1; O >= 1 ? O > X : X > O; w = O >= 1 ? ++X : --X) C = q + ((w > z ? z : w) << 2), F += (L.r = M = P[C]) * (R = O - w), _ += (L.g = T = P[C + 1]) * R, f += (L.b = S = P[C + 2]) * R, d += (L.a = A = P[C + 3]) * R, E += M, y += T, h += S, u += A, L = L.next;
for (N = V, $ = B, U = Z = 0; a >= 0 ? a > Z : Z > a; U = a >= 0 ? ++Z : --Z) P[q + 3] = A = d * k >> D, 0 !== A ? (A = 255 / A, P[q] = (F * k >> D) * A, P[q + 1] = (_ * k >> D) * A, P[q + 2] = (f * k >> D) * A) : P[q] = P[q + 1] = P[q + 2] = 0, F -= I, _ -= v, f -= p, d -= c, I -= N.r, v -= N.g, p -= N.b, c -= N.a, C = K + ((C = U + l + 1) < z ? C : z) << 2, E += N.r = P[C], y += N.g = P[C + 1], h += N.b = P[C + 2], u += N.a = P[C + 3], F += E, _ += y, f += h, d += u, N = N.next, I += M = $.r, v += T = $.g, p += S = $.b, c += A = $.a, E -= M, y -= T, h -= S, u -= A, $ = $.next, q += 4;
K += a
}
for (U = et = 0; a >= 0 ? a > et : et > a; U = a >= 0 ? ++et : --et) {
for (y = h = u = E = _ = f = d = F = 0, q = U << 2, I = O * (M = P[q]), v = O * (T = P[q + 1]), p = O * (S = P[q + 2]), c = O * (A = P[q + 3]), F += j * M, _ += j * T, f += j * S, d += j * A, L = V, w = tt = 0; O >= 0 ? O > tt : tt > O; w = O >= 0 ? ++tt : --tt) L.r = M, L.g = T, L.b = S, L.a = A, L = L.next;
for (Y = a, w = nt = 1; l >= 1 ? l >= nt : nt >= l; w = l >= 1 ? ++nt : --nt) q = Y + U << 2, F += (L.r = M = P[q]) * (R = O - w), _ += (L.g = T = P[q + 1]) * R, f += (L.b = S = P[q + 2]) * R, d += (L.a = A = P[q + 3]) * R, E += M, y += T, h += S, u += A, L = L.next, b > w && (Y += a);
for (q = U, N = V, $ = B, W = it = 0; s >= 0 ? s > it : it > s; W = s >= 0 ? ++it : --it) C = q << 2, P[C + 3] = A = d * k >> D, A > 0 ? (A = 255 / A, P[C] = (F * k >> D) * A, P[C + 1] = (_ * k >> D) * A, P[C + 2] = (f * k >> D) * A) : P[C] = P[C + 1] = P[C + 2] = 0, F -= I, _ -= v, f -= p, d -= c, I -= N.r, v -= N.g, p -= N.b, c -= N.a, C = U + ((C = W + O) < b ? C : b) * a << 2, F += E += N.r = P[C], _ += y += N.g = P[C + 1], f += h += N.b = P[C + 2], d += u += N.a = P[C + 3], N = N.next, I += M = $.r, v += T = $.g, p += S = $.b, c += A = $.a, E -= M, y -= T, h -= S, u -= A, $ = $.next, q += a
}
return m.putImageData(x, r, o)
}
}
}.call(this),
function() {
di.app.module("ShowHeroApp.Views", function(e, t, n, i, r, o) {
var a, s, l, u, c;
return u = "#hero.show-detail", a = "active", l = 4, s = 80, e.Layout = i.LayoutView.extend({
el: u,
regions: {
controlsRegion: ".controls-region",
nowPlayingRegion: ".now-playing-region",
statusRegion: ".status-region"
},
ui: {
bgFX: ".bg-fx"
},
initialize: function() {
return this.bindUIElements(), this.heroBackgroundFX()
},
heroBackgroundFX: function() {
var e, t, n;
return t = this.ui.bgFX[0], e = new Image, e.onload = function() {
var n, i, r, o, a;
return i = t.getContext("2d"), i.scale(l, l), r = t.width, n = t.height, o = -(r - r / l) / 2, a = -(n - n / l) / 2, i.drawImage(e, o, a, r, n), di.ui.CanvasBlur(t, 0, 0, r, n, s)
}, n = this.ui.bgFX.data("bg-img"), e.src = "//" + document.domain + "/_papi/" + n
}
}), e.Status = i.ItemView.extend({
template: "di/ui/show_hero/status"
}), c = {
initialize: function() {
var e;
return e = this.model.get("channels")[0].id, this.sharedChannelEntity = t.request("channel:entity", e), this.model.set("channel", this.sharedChannelEntity), this.listenTo(this.sharedChannelEntity, "change:playing", this.render)
},
serializeData: function() {
var e;
return e = this.model.toJSON(), e.channel.playing = e.channel.playing || !1, e
}
}, e.NowPlaying = i.ItemView.extend(o.extend({
template: "di/ui/show_hero/now_playing",
className: "now-playing",
ui: {
tuneInButton: ".tune-in"
},
events: {
"click @ui.tuneInButton": "playChannel"
},
behaviors: {
TuneIn: {}
}
}, c)), e.Controls = i.ItemView.extend(o.extend({
tagName: "ul",
className: "controls",
behaviors: {
TuneIn: {},
Popdown: {},
Share: {
scope: "show"
}
}
}, c)), e.LiveControls = e.Controls.extend({
template: "di/ui/show_hero/live_controls"
}), e.UpcomingControls = e.Controls.extend({
template: "di/ui/show_hero/upcoming_controls"
})
})
}.call(this),
function() {}.call(this),
function() {
di.app.module("ChannelInfoApp", function(e) {
var t;
return this.startWithParent = !1, t = {
showChannelInfo: function(t) {
return e.Controller.show(t)
},
destroyChannelInfo: function() {
return e.Controller.destroy()
}
}, e.addInitializer(function(e) {
return null != (null != e ? e.channel_id : void 0) ? t.showChannelInfo(e.channel_id) : void 0
}), e.addFinalizer(function() {
return t.destroyChannelInfo()
})
})
}.call(this),
function() {
di.app.module("ChannelInfoApp", function(e, t, n, i, r) {
return e.Controller = {
show: function(e) {
return this.channel = t.request("channel:entity", e), this.attachLayout(), this.showNowPlaying(), this.notifySocialModule()
},
attachLayout: function() {
return this.layout = new e.Views.Layout({
model: this.channel
}), this.layout.render(), this.tileView = new e.Views.Tile({
model: this.channel
}), this.layout.tileRegion.show(this.tileView)
},
destroyLayout: function() {
return this.layout.destroy()
},
showNowPlaying: function() {
return t.request("nowPlaying:entity", {
channel_id: this.channel.get("id")
}, function(t) {
return function(n) {
return t.nowPlaying = n, t.nowPlayingView = new e.Views.NowPlaying({
model: t.nowPlaying
}), t.layout.nowPlayingRegion.show(t.nowPlayingView)
}
}(this))
},
notifySocialModule: function() {
return r(document).trigger("Channel.Changed", this.channel.toJSON())
},
destroy: function() {
return this.destroyLayout()
}
}
})
}.call(this),
function() {
di.app.module("ChannelInfoApp.Views", function(e, t, n, i, r) {
var o, a, s;
return a = "#channel-info", s = "favorited", o = "active", e.Layout = i.LayoutView.extend({
template: "di/ui/channel_info/layout",
el: a,
regions: {
nowPlayingRegion: ".now-playing-region",
tileRegion: ".tile-region"
},
ui: {
shareButton: ".share",
sharePopdown: ".share-buttons",
subscribeButton: ".subscribe",
subscribePopdown: ".calendar-subscribe",
favButton: ".fav-btn"
},
events: {
"click @ui.shareButton": "setActive",
"click @ui.subscribeButton": "setActive",
"mouseleave @ui.sharePopdown": "removeActiveParent",
"mouseleave @ui.subscribePopdown": "removeActiveParent"
},
triggers: {
"click @ui.favButton": "favorite"
},
behaviors: {
Favorite: {},
Popdown: {},
Share: {
scope: "channel"
}
},
serializeData: function() {
var e;
return e = this.model.toJSON(), null == e.favorite && (e.favorite = !1), e
},
setActive: function(e) {
return r(e.currentTarget).addClass(o)
},
removeActiveParent: function(e) {
return r(e.currentTarget).parent().removeClass(o)
}
}), e.NowPlaying = i.ItemView.extend({
template: "di/ui/channel_info/now_playing",
className: "now-playing",
modelEvents: {
change: "render"
}
}), e.Tile = i.ItemView.extend({
template: "di/ui/channel_info/tile",
className: "image",
modelEvents: {
"change:playing": "render"
},
behaviors: {
TuneIn: {}
}
})
})
}.call(this),
function() {}.call(this),
function() {
di.app.module("CommentsApp", function(e, t, n, i, r, o) {
var a, s, l, u;
return this.startWithParent = !1, s = "#fb-comments", u = 12e4, l = i.ItemView.extend({
el: r(s),
ui: {
count: ".comments-cnt"
},
initialize: function() {
return this.bindUIElements(), this.listenTo(di.eventbus, "fb:comment:create", this.updateCount), this.listenTo(di.eventbus, "fb:comment:remove", this.updateCount), this.refreshInterval = setInterval(o.bind(this.render, this), u)
},
render: function() {
return FB.XFBML.parse(this.el)
},
updateCount: function() {
return FB.XFBML.parse(this.ui.count[0])
},
onDestroy: function() {
return clearInterval(this.refreshInterval)
}
}), a = {
start: function() {
return window.FB ? this.currentView = new l : this.listenToOnce(di.eventbus, "fb:sdk:ready", a.start)
},
stop: function() {
return this.currentView.destroy(), this.currentView = null
}
}, e.addInitializer(a.start), e.addFinalizer(a.stop)
})
}.call(this),
function() {}.call(this),
function() {
di.app.module("ActivityFeedApp", function(e) {
var t;
return this.startWithParent = !1, t = {
showActivityFeed: function() {
return e.Controller.show()
},
destroyActivityFeed: function() {
return e.Controller.destroy()
}
}, e.addInitializer(function() {
return t.showActivityFeed()
}), e.addFinalizer(function() {
return t.destroyActivityFeed()
})
})
}.call(this),
function() {
di.app.module("Components.Pagination", function(e, t, n, i, r) {
var o, a;
return a = 5, o = "current", e.View = i.ItemView.extend({
template: "di/ui/components/pagination",
ui: {
pageBtn: ".page-btn"
},
events: {
"click @ui.pageBtn": "onPageBtnClick"
},
modelEvents: {
change: "render"
},
onPageBtnClick: function(e) {
var t;
return t = r(e.currentTarget).data("page"), t ? (r(e.currentTarget).addClass(o), this.model.set("selection", t)) : void 0
},
templateHelpers: {
getPrevRange: function() {
var e, t;
return e = null != this.page ? function() {
t = [];
for (var e = 1, n = this.page; n >= 1 ? n > e : e > n; n >= 1 ? e++ : e--) t.push(e);
return t
}.apply(this) : [], e.length > a && (e = [1, "..."].concat(e.slice(this.page - a, this.page))), e
},
getNextRange: function() {
var e, t, n;
return e = null != this.page && null != this.last ? function() {
n = [];
for (var e = t = this.page + 1, i = this.last; i >= t ? i >= e : e >= i; i >= t ? e++ : e--) n.push(e);
return n
}.apply(this) : [], e.length > a && (e = e.slice(0, a - 1).concat(["...", this.last])), e
}
}
})
})
}.call(this),
function() {
di.app.module("ActivityFeedApp", function(e, t, n) {
return e.Controller = {
show: function() {
return this.initModels(), this.attachViews(), this.paginationState.set("selection", 1)
},
updateFeed: function() {
return this.trackVotesView.$childViewContainer.fadeOut("fast", function(e) {
return function() {
return e.trackVotesView.collection.reset(e.trackVoteFeed.models)
}
}(this)), this.updatePagination()
},
updatePagination: function() {
return this.paginationState.clear({
silent: !0
}), this.paginationState.set(this.trackVoteFeed.link)
},
initModels: function() {
return this.trackVoteFeed = new t.Entities.TrackVoteFeed, this.paginationState = new n.Model, this.paginationState.on("change:selection", function(e) {
return function(t, n) {
return e.trackVoteFeed.getPage(n).done(function() {
return e.updateFeed()
})
}
}(this))
},
attachViews: function() {
return this.layout = new e.Views.Layout, this.trackVotesView = new e.Views.TrackVotes({
collection: new n.Collection
}), this.trackVotesView.on("render:collection", function() {
return this.$childViewContainer.fadeIn()
}), this.layout.trackVotesRegion.show(this.trackVotesView), this.paginationView = new t.Components.Pagination.View({
model: this.paginationState
}), this.layout.paginationRegion.show(this.paginationView), this.trackVotesView.on("childview:vote:altered", function(e) {
return function() {
return e.trackVoteFeed.updatePagination().done(function() {
return e.updatePagination()
})
}
}(this))
},
destroy: function() {
var e;
return null != (e = this.layout) ? e.destroy() : void 0
}
}
})
}.call(this),
function() {
di.app.module("ActivityFeedApp.Views", function(e, t, n, i) {
var r, o, a;
return r = "#activity-feed", o = "53x53", a = "retracted", e.Layout = i.LayoutView.extend({
el: r,
regions: {
trackVotesRegion: ".track-votes-region",
paginationRegion: ".pagination-region"
}
}), e.TrackVoteItem = i.ItemView.extend({
template: "di/ui/activity_feed/track_vote_item",
tagName: "li",
className: "feed-item",
ui: {
retractBtn: ".retract-btn"
},
events: {
"click @ui.retractBtn": "onRetractBtnClicked"
},
initialize: function() {
return this.listenTo(this.model.get("track"), "change:votes", this.onVotesChanged)
},
onRetractBtnClicked: function() {
return this.model.vote()
},
onVotesChanged: function() {
return this.trigger("vote:altered"), this.render()
},
onRender: function() {
return this.$el.toggleClass(a, !this.model.get("track").get("votes").cast.up)
},
templateHelpers: {
trackImage: function(e) {
return this.channel && (e = AudioAddict.UI.img_uri(this.channel.toJSON(), {
size: o
})), AudioAddict.UI.img_uri(this.track.toJSON(), {
size: o
}) || e
},
trackDetailUrl: function() {
var e;
return e = {
track_id: this.track.get("id")
}, this.channel && (e.channel_key = this.channel.get("key")), Routes.tracks_path(e)
},
channelUrl: function() {
return Routes.channel_path(this.channel.get("key"))
},
isRetracted: function() {
return !this.track.get("votes").cast.up
}
}
}), e.NoTracks = i.ItemView.extend({
template: "di/ui/activity_feed/no_tracks"
}), e.TrackVotes = i.CompositeView.extend({
template: "di/ui/activity_feed/track_votes",
childView: e.TrackVoteItem,
emptyView: e.NoTracks,
childViewContainer: ".feed-body"
})
})
}.call(this),
function() {}.call(this),
function(e, t) {
"function" == typeof define && define.amd ? define(["exports", "backbone", "underscore"], t) : "undefined" != typeof exports ? t(exports, require("backbone"), require("underscore")) : t(e, e.Backbone, e._)
}(this, function(e, t, n) {
"use strict";
t.Relational = {
showWarnings: !0
}, t.Semaphore = {
_permitsAvailable: null,
_permitsUsed: 0,
acquire: function() {
if (this._permitsAvailable && this._permitsUsed >= this._permitsAvailable) throw new Error("Max permits acquired");
this._permitsUsed++
},
release: function() {
if (0 === this._permitsUsed) throw new Error("All permits released");
this._permitsUsed--
},
isLocked: function() {
return this._permitsUsed > 0
},
setAvailablePermits: function(e) {
if (this._permitsUsed > e) throw new Error("Available permits cannot be less than used permits");
this._permitsAvailable = e
}
}, t.BlockingQueue = function() {
this._queue = []
}, n.extend(t.BlockingQueue.prototype, t.Semaphore, {
_queue: null,
add: function(e) {
this.isBlocked() ? this._queue.push(e) : e()
},
process: function() {
var e = this._queue;
for (this._queue = []; e && e.length;) e.shift()()
},
block: function() {
this.acquire()
},
unblock: function() {
this.release(), this.isBlocked() || this.process()
},
isBlocked: function() {
return this.isLocked()
}
}), t.Relational.eventQueue = new t.BlockingQueue, t.Store = function() {
this._collections = [], this._reverseRelations = [], this._orphanRelations = [], this._subModels = [], this._modelScopes = [e]
}, n.extend(t.Store.prototype, t.Events, {
initializeRelation: function(e, i, r) {
var o = n.isString(i.type) ? t[i.type] || this.getObjectByName(i.type) : i.type;
o && o.prototype instanceof t.Relation ? new o(e, i, r) : t.Relational.showWarnings && "undefined" != typeof console && console.warn("Relation=%o; missing or invalid relation type!", i)
},
addModelScope: function(e) {
this._modelScopes.push(e)
},
removeModelScope: function(e) {
this._modelScopes = n.without(this._modelScopes, e)
},
addSubModels: function(e, t) {
this._subModels.push({
superModelType: t,
subModels: e
})
},
setupSuperModel: function(e) {
n.find(this._subModels, function(t) {
return n.filter(t.subModels || [], function(n, i) {
var r = this.getObjectByName(n);
return e === r ? (t.superModelType._subModels[i] = e, e._superModel = t.superModelType, e._subModelTypeValue = i, e._subModelTypeAttribute = t.superModelType.prototype.subModelTypeAttribute, !0) : void 0
}, this).length
}, this)
},
addReverseRelation: function(e) {
var t = n.any(this._reverseRelations, function(t) {
return n.all(e || [], function(e, n) {
return e === t[n]
})
});
!t && e.model && e.type && (this._reverseRelations.push(e), this._addRelation(e.model, e), this.retroFitRelation(e))
},
addOrphanRelation: function(e) {
var t = n.any(this._orphanRelations, function(t) {
return n.all(e || [], function(e, n) {
return e === t[n]
})
});
!t && e.model && e.type && this._orphanRelations.push(e)
},
processOrphanRelations: function() {
n.each(this._orphanRelations.slice(0), function(e) {
var i = t.Relational.store.getObjectByName(e.relatedModel);
i && (this.initializeRelation(null, e), this._orphanRelations = n.without(this._orphanRelations, e))
}, this)
},
_addRelation: function(e, t) {
e.prototype.relations || (e.prototype.relations = []), e.prototype.relations.push(t), n.each(e._subModels || [], function(e) {
this._addRelation(e, t)
}, this)
},
retroFitRelation: function(e) {
var t = this.getCollection(e.model, !1);
t && t.each(function(t) {
t instanceof e.model && new e.type(t, e)
}, this)
},
getCollection: function(e, i) {
e instanceof t.RelationalModel && (e = e.constructor);
for (var r = e; r._superModel;) r = r._superModel;
var o = n.find(this._collections, function(e) {
return e.model === r
});
return o || i === !1 || (o = this._createCollection(r)), o
},
getObjectByName: function(e) {
var t = e.split("."),
i = null;
return n.find(this._modelScopes, function(e) {
return i = n.reduce(t || [], function(e, t) {
return e ? e[t] : void 0
}, e), i && i !== e ? !0 : void 0
}, this), i
},
_createCollection: function(e) {
var n;
return e instanceof t.RelationalModel && (e = e.constructor), e.prototype instanceof t.RelationalModel && (n = new t.Collection, n.model = e, this._collections.push(n)), n
},
resolveIdForItem: function(e, i) {
var r = n.isString(i) || n.isNumber(i) ? i : null;
return null === r && (i instanceof t.RelationalModel ? r = i.id : n.isObject(i) && (r = i[e.prototype.idAttribute])), r || 0 === r || (r = null), r
},
find: function(e, t) {
var n = this.resolveIdForItem(e, t),
i = this.getCollection(e);
if (i) {
var r = i.get(n);
if (r instanceof e) return r
}
return null
},
register: function(e) {
var t = this.getCollection(e);
if (t) {
var n = e.collection;
t.add(e), e.collection = n
}
},
checkId: function(e, n) {
var i = this.getCollection(e),
r = i && i.get(n);
if (r && e !== r) throw t.Relational.showWarnings && "undefined" != typeof console && console.warn("Duplicate id! Old RelationalModel=%o, new RelationalModel=%o", r, e), new Error("Cannot instantiate more than one Backbone.RelationalModel with the same id per type!")
},
update: function(e) {
var t = this.getCollection(e);
t.contains(e) || this.register(e), t._onModelEvent("change:" + e.idAttribute, e, t), e.trigger("relational:change:id", e, t)
},
unregister: function(e) {
var i, r;
e instanceof t.Model ? (i = this.getCollection(e), r = [e]) : e instanceof t.Collection ? (i = this.getCollection(e.model), r = n.clone(e.models)) : (i = this.getCollection(e), r = n.clone(i.models)), n.each(r, function(e) {
this.stopListening(e), n.invoke(e.getRelations(), "stopListening")
}, this), n.contains(this._collections, e) ? i.reset([]) : n.each(r, function(e) {
i.get(e) ? i.remove(e) : i.trigger("relational:remove", e, i)
}, this)
},
reset: function() {
this.stopListening(), n.each(this._collections, function(e) {
this.unregister(e)
}, this), this._collections = [], this._subModels = [], this._modelScopes = [e]
}
}), t.Relational.store = new t.Store, t.Relation = function(e, i, r) {
if (this.instance = e, i = n.isObject(i) ? i : {}, this.reverseRelation = n.defaults(i.reverseRelation || {}, this.options.reverseRelation), this.options = n.defaults(i, this.options, t.Relation.prototype.options), this.reverseRelation.type = n.isString(this.reverseRelation.type) ? t[this.reverseRelation.type] || t.Relational.store.getObjectByName(this.reverseRelation.type) : this.reverseRelation.type, this.key = this.options.key, this.keySource = this.options.keySource || this.key, this.keyDestination = this.options.keyDestination || this.keySource || this.key, this.model = this.options.model || this.instance.constructor, this.relatedModel = this.options.relatedModel, !n.isFunction(this.relatedModel) || this.relatedModel.prototype instanceof t.RelationalModel || (this.relatedModel = n.result(this, "relatedModel")), n.isString(this.relatedModel) && (this.relatedModel = t.Relational.store.getObjectByName(this.relatedModel)), this.checkPreconditions() && (!this.options.isAutoRelation && this.reverseRelation.type && this.reverseRelation.key && t.Relational.store.addReverseRelation(n.defaults({
isAutoRelation: !0,
model: this.relatedModel,
relatedModel: this.model,
reverseRelation: this.options
}, this.reverseRelation)), e)) {
var o = this.keySource;
o !== this.key && "object" == typeof this.instance.get(this.key) && (o = this.key), this.setKeyContents(this.instance.get(o)), this.relatedCollection = t.Relational.store.getCollection(this.relatedModel), this.keySource !== this.key && delete this.instance.attributes[this.keySource], this.instance._relations[this.key] = this, this.initialize(r), this.options.autoFetch && this.instance.fetchRelated(this.key, n.isObject(this.options.autoFetch) ? this.options.autoFetch : {}), this.listenTo(this.instance, "destroy", this.destroy).listenTo(this.relatedCollection, "relational:add relational:change:id", this.tryAddRelated).listenTo(this.relatedCollection, "relational:remove", this.removeRelated)
}
}, t.Relation.extend = t.Model.extend, n.extend(t.Relation.prototype, t.Events, t.Semaphore, {
options: {
createModels: !0,
includeInJSON: !0,
isAutoRelation: !1,
autoFetch: !1,
parse: !1
},
instance: null,
key: null,
keyContents: null,
relatedModel: null,
relatedCollection: null,
reverseRelation: null,
related: null,
checkPreconditions: function() {
var e = this.instance,
i = this.key,
r = this.model,
o = this.relatedModel,
a = t.Relational.showWarnings && "undefined" != typeof console;
if (!r || !i || !o) return a && console.warn("Relation=%o: missing model, key or relatedModel (%o, %o, %o).", this, r, i, o), !1;
if (!(r.prototype instanceof t.RelationalModel)) return a && console.warn("Relation=%o: model does not inherit from Backbone.RelationalModel (%o).", this, e), !1;
if (!(o.prototype instanceof t.RelationalModel)) return a && console.warn("Relation=%o: relatedModel does not inherit from Backbone.RelationalModel (%o).", this, o), !1;
if (this instanceof t.HasMany && this.reverseRelation.type === t.HasMany) return a && console.warn("Relation=%o: relation is a HasMany, and the reverseRelation is HasMany as well.", this), !1;
if (e && n.keys(e._relations).length) {
var s = n.find(e._relations, function(e) {
return e.key === i
}, this);
if (s) return a && console.warn("Cannot create relation=%o on %o for model=%o: already taken by relation=%o.", this, i, e, s), !1
}
return !0
},
setRelated: function(e) {
this.related = e, this.instance.attributes[this.key] = e
},
_isReverseRelation: function(e) {
return e.instance instanceof this.relatedModel && this.reverseRelation.key === e.key && this.key === e.reverseRelation.key
},
getReverseRelations: function(e) {
var t = [],
i = n.isUndefined(e) ? this.related && (this.related.models || [this.related]) : [e];
return n.each(i || [], function(e) {
n.each(e.getRelations() || [], function(e) {
this._isReverseRelation(e) && t.push(e)
}, this)
}, this), t
},
destroy: function() {
this.stopListening(), this instanceof t.HasOne ? this.setRelated(null) : this instanceof t.HasMany && this.setRelated(this._prepareCollection()), n.each(this.getReverseRelations(), function(e) {
e.removeRelated(this.instance)
}, this)
}
}), t.HasOne = t.Relation.extend({
options: {
reverseRelation: {
type: "HasMany"
}
},
initialize: function(e) {
this.listenTo(this.instance, "relational:change:" + this.key, this.onChange);
var t = this.findRelated(e);
this.setRelated(t), n.each(this.getReverseRelations(), function(t) {
t.addRelated(this.instance, e)
}, this)
},
findRelated: function(e) {
var t = null;
if (e = n.defaults({
parse: this.options.parse
}, e), this.keyContents instanceof this.relatedModel) t = this.keyContents;
else if (this.keyContents || 0 === this.keyContents) {
var i = n.defaults({
create: this.options.createModels
}, e);
t = this.relatedModel.findOrCreate(this.keyContents, i)
}
return t && (this.keyId = null), t
},
setKeyContents: function(e) {
this.keyContents = e, this.keyId = t.Relational.store.resolveIdForItem(this.relatedModel, this.keyContents)
},
onChange: function(e, i, r) {
if (!this.isLocked()) {
this.acquire(), r = r ? n.clone(r) : {};
var o = n.isUndefined(r.__related),
a = o ? this.related : r.__related;
if (o) {
this.setKeyContents(i);
var s = this.findRelated(r);
this.setRelated(s)
}
if (a && this.related !== a && n.each(this.getReverseRelations(a), function(e) {
e.removeRelated(this.instance, null, r)
}, this), n.each(this.getReverseRelations(), function(e) {
e.addRelated(this.instance, r)
}, this), !r.silent && this.related !== a) {
var l = this;
this.changed = !0, t.Relational.eventQueue.add(function() {
l.instance.trigger("change:" + l.key, l.instance, l.related, r, !0), l.changed = !1
})
}
this.release()
}
},
tryAddRelated: function(e, t, n) {
!this.keyId && 0 !== this.keyId || e.id !== this.keyId || (this.addRelated(e, n), this.keyId = null)
},
addRelated: function(e, t) {
var i = this;
e.queue(function() {
if (e !== i.related) {
var r = i.related || null;
i.setRelated(e), i.onChange(i.instance, e, n.defaults({
__related: r
}, t))
}
})
},
removeRelated: function(e, t, i) {
if (this.related && e === this.related) {
var r = this.related || null;
this.setRelated(null), this.onChange(this.instance, e, n.defaults({
__related: r
}, i))
}
}
}), t.HasMany = t.Relation.extend({
collectionType: null,
options: {
reverseRelation: {
type: "HasOne"
},
collectionType: t.Collection,
collectionKey: !0,
collectionOptions: {}
},
initialize: function(e) {
if (this.listenTo(this.instance, "relational:change:" + this.key, this.onChange), this.collectionType = this.options.collectionType, !n.isFunction(this.collectionType) || this.collectionType === t.Collection || this.collectionType.prototype instanceof t.Collection || (this.collectionType = n.result(this, "collectionType")), n.isString(this.collectionType) && (this.collectionType = t.Relational.store.getObjectByName(this.collectionType)), this.collectionType !== t.Collection && !(this.collectionType.prototype instanceof t.Collection)) throw new Error("`collectionType` must inherit from Backbone.Collection");
var i = this.findRelated(e);
this.setRelated(i)
},
_prepareCollection: function(e) {
if (this.related && this.stopListening(this.related), !(e && e instanceof t.Collection)) {
var i = n.isFunction(this.options.collectionOptions) ? this.options.collectionOptions(this.instance) : this.options.collectionOptions;
e = new this.collectionType(null, i)
}
if (e.model = this.relatedModel, this.options.collectionKey) {
var r = this.options.collectionKey === !0 ? this.options.reverseRelation.key : this.options.collectionKey;
e[r] && e[r] !== this.instance ? t.Relational.showWarnings && "undefined" != typeof console && console.warn("Relation=%o; collectionKey=%s already exists on collection=%o", this, r, this.options.collectionKey) : r && (e[r] = this.instance)
}
return this.listenTo(e, "relational:add", this.handleAddition).listenTo(e, "relational:remove", this.handleRemoval).listenTo(e, "relational:reset", this.handleReset), e
},
findRelated: function(e) {
var i = null;
if (e = n.defaults({
parse: this.options.parse
}, e), this.keyContents instanceof t.Collection) this._prepareCollection(this.keyContents), i = this.keyContents;
else {
var r = [];
n.each(this.keyContents, function(t) {
if (t instanceof this.relatedModel) var i = t;
else i = this.relatedModel.findOrCreate(t, n.extend({
merge: !0
}, e, {
create: this.options.createModels
}));
i && r.push(i)
}, this), i = this.related instanceof t.Collection ? this.related : this._prepareCollection(), i.set(r, n.defaults({
merge: !1,
parse: !1
}, e))
}
return this.keyIds = n.difference(this.keyIds, n.pluck(i.models, "id")), i
},
setKeyContents: function(e) {
this.keyContents = e instanceof t.Collection ? e : null, this.keyIds = [], this.keyContents || !e && 0 !== e || (this.keyContents = n.isArray(e) ? e : [e], n.each(this.keyContents, function(e) {
var n = t.Relational.store.resolveIdForItem(this.relatedModel, e);
(n || 0 === n) && this.keyIds.push(n)
}, this))
},
onChange: function(e, i, r) {
r = r ? n.clone(r) : {}, this.setKeyContents(i), this.changed = !1;
var o = this.findRelated(r);
if (this.setRelated(o), !r.silent) {
var a = this;
t.Relational.eventQueue.add(function() {
a.changed && (a.instance.trigger("change:" + a.key, a.instance, a.related, r, !0), a.changed = !1)
})
}
},
handleAddition: function(e, i, r) {
r = r ? n.clone(r) : {}, this.changed = !0, n.each(this.getReverseRelations(e), function(e) {
e.addRelated(this.instance, r)
}, this);
var o = this;
!r.silent && t.Relational.eventQueue.add(function() {
o.instance.trigger("add:" + o.key, e, o.related, r)
})
},
handleRemoval: function(e, i, r) {
r = r ? n.clone(r) : {}, this.changed = !0, n.each(this.getReverseRelations(e), function(e) {
e.removeRelated(this.instance, null, r)
}, this);
var o = this;
!r.silent && t.Relational.eventQueue.add(function() {
o.instance.trigger("remove:" + o.key, e, o.related, r)
})
},
handleReset: function(e, i) {
var r = this;
i = i ? n.clone(i) : {}, !i.silent && t.Relational.eventQueue.add(function() {
r.instance.trigger("reset:" + r.key, r.related, i)
})
},
tryAddRelated: function(e, t, i) {
var r = n.contains(this.keyIds, e.id);
r && (this.addRelated(e, i), this.keyIds = n.without(this.keyIds, e.id))
},
addRelated: function(e, t) {
var i = this;
e.queue(function() {
i.related && !i.related.get(e) && i.related.add(e, n.defaults({
parse: !1
}, t))
})
},
removeRelated: function(e, t, n) {
this.related.get(e) && this.related.remove(e, n)
}
}), t.RelationalModel = t.Model.extend({
relations: null,
_relations: null,
_isInitialized: !1,
_deferProcessing: !1,
_queue: null,
_attributeChangeFired: !1,
subModelTypeAttribute: "type",
subModelTypes: null,
constructor: function(e, i) {
if (i && i.collection) {
var r = this,
o = this.collection = i.collection;
delete i.collection, this._deferProcessing = !0;
var a = function(e) {
e === r && (r._deferProcessing = !1, r.processQueue(), o.off("relational:add", a))
};
o.on("relational:add", a), n.defer(function() {
a(r)
})
}
t.Relational.store.processOrphanRelations(), t.Relational.store.listenTo(this, "relational:unregister", t.Relational.store.unregister), this._queue = new t.BlockingQueue, this._queue.block(), t.Relational.eventQueue.block();
try {
t.Model.apply(this, arguments)
} finally {
t.Relational.eventQueue.unblock()
}
},
trigger: function(e) {
if (e.length > 5 && 0 === e.indexOf("change")) {
var n = this,
i = arguments;
t.Relational.eventQueue.isLocked() ? t.Relational.eventQueue.add(function() {
var r = !0;
if ("change" === e) r = n.hasChanged() || n._attributeChangeFired, n._attributeChangeFired = !1;
else {
var o = e.slice(7),
a = n.getRelation(o);
a ? (r = i[4] === !0, r ? n.changed[o] = i[2] : a.changed || delete n.changed[o]) : r && (n._attributeChangeFired = !0)
}
r && t.Model.prototype.trigger.apply(n, i)
}) : t.Model.prototype.trigger.apply(n, i)
} else "destroy" === e ? (t.Model.prototype.trigger.apply(this, arguments), t.Relational.store.unregister(this)) : t.Model.prototype.trigger.apply(this, arguments);
return this
},
initializeRelations: function(e) {
this.acquire(), this._relations = {}, n.each(this.relations || [], function(n) {
t.Relational.store.initializeRelation(this, n, e)
}, this), this._isInitialized = !0, this.release(), this.processQueue()
},
updateRelations: function(e, t) {
this._isInitialized && !this.isLocked() && n.each(this._relations, function(n) {
if (!e || n.keySource in e || n.key in e) {
var i = this.attributes[n.keySource] || this.attributes[n.key],
r = e && (e[n.keySource] || e[n.key]);
(n.related !== i || null === i && null === r) && this.trigger("relational:change:" + n.key, this, i, t || {})
}
n.keySource !== n.key && delete this.attributes[n.keySource]
}, this)
},
queue: function(e) {
this._queue.add(e)
},
processQueue: function() {
this._isInitialized && !this._deferProcessing && this._queue.isBlocked() && this._queue.unblock()
},
getRelation: function(e) {
return this._relations[e]
},
getRelations: function() {
return n.values(this._relations)
},
fetchRelated: function(e, i, r) {
i = n.extend({
update: !0,
remove: !1
}, i);
var o, a, s = [],
l = this.getRelation(e),
u = l && (l.keyIds && l.keyIds.slice(0) || (l.keyId || 0 === l.keyId ? [l.keyId] : []));
if (r && (o = l.related instanceof t.Collection ? l.related.models : [l.related], n.each(o, function(e) {
(e.id || 0 === e.id) && u.push(e.id)
})), u && u.length) {
var c = [];
if (o = n.map(u, function(e) {
var t = l.relatedModel.findModel(e);
if (!t) {
var n = {};
n[l.relatedModel.prototype.idAttribute] = e, t = l.relatedModel.findOrCreate(n, i), c.push(t)
}
return t
}, this), l.related instanceof t.Collection && n.isFunction(l.related.url) && (a = l.related.url(o)), a && a !== l.related.url()) {
var d = n.defaults({
error: function() {
var e = arguments;
n.each(c, function(t) {
t.trigger("destroy", t, t.collection, i), i.error && i.error.apply(t, e)
})
},
url: a
}, i);
s = [l.related.fetch(d)]
} else s = n.map(o, function(e) {
var t = n.defaults({
error: function() {
n.contains(c, e) && (e.trigger("destroy", e, e.collection, i), i.error && i.error.apply(e, arguments))
}
}, i);
return e.fetch(t)
}, this)
}
return s
},
get: function(e) {
var i = t.Model.prototype.get.call(this, e);
if (!this.dotNotation || -1 === e.indexOf(".")) return i;
var r = e.split("."),
o = n.reduce(r, function(e, i) {
if (n.isNull(e) || n.isUndefined(e)) return void 0;
if (e instanceof t.Model) return t.Model.prototype.get.call(e, i);
if (e instanceof t.Collection) return t.Collection.prototype.at.call(e, i);
throw new Error("Attribute must be an instanceof Backbone.Model or Backbone.Collection. Is: " + e + ", currentSplit: " + i)
}, this);
if (void 0 !== i && void 0 !== o) throw new Error("Ambiguous result for '" + e + "'. direct result: " + i + ", dotNotation: " + o);
return i || o
},
set: function(e, i, r) {
t.Relational.eventQueue.block();
var o;
n.isObject(e) || null == e ? (o = e, r = i) : (o = {}, o[e] = i);
try {
var a = this.id,
s = o && this.idAttribute in o && o[this.idAttribute];
t.Relational.store.checkId(this, s);
var l = t.Model.prototype.set.apply(this, arguments);
this._isInitialized || this.isLocked() ? s && s !== a && t.Relational.store.update(this) : (this.constructor.initializeModelHierarchy(), (s || 0 === s) && t.Relational.store.register(this), this.initializeRelations(r)), o && this.updateRelations(o, r)
} finally {
t.Relational.eventQueue.unblock()
}
return l
},
clone: function() {
var e = n.clone(this.attributes);
return n.isUndefined(e[this.idAttribute]) || (e[this.idAttribute] = null), n.each(this.getRelations(), function(t) {
delete e[t.key]
}), new this.constructor(e)
},
toJSON: function(e) {
if (this.isLocked()) return this.id;
this.acquire();
var i = t.Model.prototype.toJSON.call(this, e);
return !this.constructor._superModel || this.constructor._subModelTypeAttribute in i || (i[this.constructor._subModelTypeAttribute] = this.constructor._subModelTypeValue), n.each(this._relations, function(r) {
var o = i[r.key],
a = r.options.includeInJSON,
s = null;
a === !0 ? o && n.isFunction(o.toJSON) && (s = o.toJSON(e)) : n.isString(a) ? (o instanceof t.Collection ? s = o.pluck(a) : o instanceof t.Model && (s = o.get(a)), a === r.relatedModel.prototype.idAttribute && (r instanceof t.HasMany ? s = s.concat(r.keyIds) : r instanceof t.HasOne && (s = s || r.keyId, s || n.isObject(r.keyContents) || (s = r.keyContents || null)))) : n.isArray(a) ? o instanceof t.Collection ? (s = [], o.each(function(e) {
var t = {};
n.each(a, function(n) {
t[n] = e.get(n)
}), s.push(t)
})) : o instanceof t.Model && (s = {}, n.each(a, function(e) {
s[e] = o.get(e)
})) : delete i[r.key], a && (i[r.keyDestination] = s), r.keyDestination !== r.key && delete i[r.key]
}), this.release(), i
}
}, {
setup: function() {
return this.prototype.relations = (this.prototype.relations || []).slice(0), this._subModels = {}, this._superModel = null, this.prototype.hasOwnProperty("subModelTypes") ? t.Relational.store.addSubModels(this.prototype.subModelTypes, this) : this.prototype.subModelTypes = null, n.each(this.prototype.relations || [], function(e) {
if (e.model || (e.model = this), e.reverseRelation && e.model === this) {
var i = !0;
if (n.isString(e.relatedModel)) {
var r = t.Relational.store.getObjectByName(e.relatedModel);
i = r && r.prototype instanceof t.RelationalModel
}
i ? t.Relational.store.initializeRelation(null, e) : n.isString(e.relatedModel) && t.Relational.store.addOrphanRelation(e)
}
}, this), this
},
build: function(e, t) {
this.initializeModelHierarchy();
var n = this._findSubModelType(this, e) || this;
return new n(e, t)
},
_findSubModelType: function(e, t) {
if (e._subModels && e.prototype.subModelTypeAttribute in t) {
var n = t[e.prototype.subModelTypeAttribute],
i = e._subModels[n];
if (i) return i;
for (n in e._subModels)
if (i = this._findSubModelType(e._subModels[n], t)) return i
}
return null
},
initializeModelHierarchy: function() {
if (this.inheritRelations(), this.prototype.subModelTypes) {
var e = n.keys(this._subModels),
i = n.omit(this.prototype.subModelTypes, e);
n.each(i, function(e) {
var n = t.Relational.store.getObjectByName(e);
n && n.initializeModelHierarchy()
})
}
},
inheritRelations: function() {
if (n.isUndefined(this._superModel) || n.isNull(this._superModel))
if (t.Relational.store.setupSuperModel(this), this._superModel) {
if (this._superModel.inheritRelations(), this._superModel.prototype.relations) {
var e = n.filter(this._superModel.prototype.relations || [], function(e) {
return !n.any(this.prototype.relations || [], function(t) {
return e.relatedModel === t.relatedModel && e.key === t.key
}, this)
}, this);
this.prototype.relations = e.concat(this.prototype.relations)
}
} else this._superModel = !1
},
findOrCreate: function(e, t) {
t || (t = {});
var i = n.isObject(e) && t.parse && this.prototype.parse ? this.prototype.parse(n.clone(e)) : e,
r = this.findModel(i);
return n.isObject(e) && (r && t.merge !== !1 ? (delete t.collection, delete t.url, r.set(i, t)) : r || t.create === !1 || (r = this.build(i, n.defaults({
parse: !1
}, t)))), r
},
find: function(e, t) {
return t || (t = {}), t.create = !1, this.findOrCreate(e, t)
},
findModel: function(e) {
return t.Relational.store.find(this, e)
}
}), n.extend(t.RelationalModel.prototype, t.Semaphore), t.Collection.prototype.__prepareModel = t.Collection.prototype._prepareModel, t.Collection.prototype._prepareModel = function(e, i) {
var r;
return e instanceof t.Model ? (e.collection || (e.collection = this), r = e) : (i = i ? n.clone(i) : {}, i.collection = this, r = "undefined" != typeof this.model.findOrCreate ? this.model.findOrCreate(e, i) : new this.model(e, i), r && r.validationError && (this.trigger("invalid", this, e, i), r = !1)), r
};
var i = t.Collection.prototype.__set = t.Collection.prototype.set;
t.Collection.prototype.set = function(e, r) {
if (!(this.model.prototype instanceof t.RelationalModel)) return i.apply(this, arguments);
r && r.parse && (e = this.parse(e, r));
var o = !n.isArray(e),
a = [],
s = [];
e = o ? e ? [e] : [] : n.clone(e), n.each(e, function(e) {
e instanceof t.Model || (e = t.Collection.prototype._prepareModel.call(this, e, r)), e && (s.push(e), this.get(e) || this.get(e.cid) ? null != e.id && (this._byId[e.id] = e) : a.push(e))
}, this), s = o ? s.length ? s[0] : null : s;
var l = i.call(this, s, n.defaults({
parse: !1
}, r));
return n.each(a, function(e) {
(this.get(e) || this.get(e.cid)) && this.trigger("relational:add", e, this, r)
}, this), l
};
var r = t.Collection.prototype.__remove = t.Collection.prototype.remove;
t.Collection.prototype.remove = function(e, i) {
if (!(this.model.prototype instanceof t.RelationalModel)) return r.apply(this, arguments);
var o = !n.isArray(e),
a = [];
e = o ? e ? [e] : [] : n.clone(e), i || (i = {}), n.each(e, function(e) {
e = this.get(e) || e && this.get(e.cid), e && a.push(e)
}, this);
var s = r.call(this, o ? a.length ? a[0] : null : a, i);
return n.each(a, function(e) {
this.trigger("relational:remove", e, this, i)
}, this), s
};
var o = t.Collection.prototype.__reset = t.Collection.prototype.reset;
t.Collection.prototype.reset = function(e, i) {
i = n.extend({
merge: !0
}, i);
var r = o.call(this, e, i);
return this.model.prototype instanceof t.RelationalModel && this.trigger("relational:reset", this, i), r
};
var a = t.Collection.prototype.__sort = t.Collection.prototype.sort;
t.Collection.prototype.sort = function(e) {
var n = a.call(this, e);
return this.model.prototype instanceof t.RelationalModel && this.trigger("relational:reset", this, e), n
};
var s = t.Collection.prototype.__trigger = t.Collection.prototype.trigger;
t.Collection.prototype.trigger = function(e) {
if (!(this.model.prototype instanceof t.RelationalModel)) return s.apply(this, arguments);
if ("add" === e || "remove" === e || "reset" === e || "sort" === e) {
var i = this,
r = arguments;
n.isObject(r[3]) && (r = n.toArray(r), r[3] = n.clone(r[3])), t.Relational.eventQueue.add(function() {
s.apply(i, r)
})
} else s.apply(this, arguments);
return this
}, t.RelationalModel.extend = function() {
var e = t.Model.extend.apply(this, arguments);
return e.setup(this), e
}
}),
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.provide("di.model.PaymentType"), di.model.PaymentType = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
return t(n, e), n.prototype.defaults = {
billable: null,
id: null,
key: null,
label: null,
legacy: null,
name: null,
require_address: null
}, n.prototype.parse = function(e) {
return null != e.payment_type && (e = e.payment_type), e
}, n
}(Backbone.RelationalModel)
}.call(this),
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.provide("di.model.Plan"), di.model.Plan = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
return t(n, e), n.prototype.defaults = {
"active?": null,
allow_trial: null,
availability_ends_at: null,
availability_starts_at: null,
created_at: null,
id: null,
key: null,
name: null,
services: [],
trial_duration_days: null,
updated_at: null
}, n.prototype.parse = function(e) {
return null != e.plan && (e = e.plan), e
}, n
}(Backbone.RelationalModel)
}.call(this),
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.provide("di.model.PaymentMethod"), di.model.PaymentMethod = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
return t(n, e), n.prototype.defaults = {
address: null,
city: null,
country: null,
description: null,
expires_at: null,
external_account_id: null,
external_client_id: null,
first_name: null,
id: null,
ident_hash: null,
iin: null,
last_name: null,
payment_type: {},
payment_type_id: null,
postal_code: null,
state: null,
card_number: null,
card_type: null,
card_name: null
}, n.prototype.relations = [{
type: "HasOne",
key: "payment_type",
relatedModel: di.model.PaymentType,
parse: !0
}], n.prototype.parseDescription = function(e) {
var t, n, i;
switch (n = e.match(/[\d]+/).join("").trim(), t = e.match(/[a-zA-Z\s]+/).join("").trim(), i = t.toLowerCase().replace(/\s/gi, "_")) {
case "american_express":
n = "**** ****** *" + n;
break;
case "diners_club":
n = "**** **** **" + n.replace(/^(.{2})/, "$1 ");
break;
default:
n = "**** **** **** " + n
}
return {
cardNumber: n,
cardType: i,
cardName: t
}
}, n.prototype.parse = function(e) {
var t, n;
return "stripe" === (null != (n = e.payment_type) ? n.key : void 0) && (t = this.parseDescription(e.description), e.card_number = t.cardNumber, e.card_type = t.cardType, e.card_name = t.cardName), null != e.id && (e.is_new = !1), e
}, n
}(Backbone.RelationalModel)
}.call(this),
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.provide("di.model.Subscription"), di.model.Subscription = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
return t(n, e), n.prototype.defaults = {
"active?": null,
auto_renew: null,
billable: null,
created_at: null,
currency: null,
expired_on: null,
first_purchase_at: null,
first_trial_at: null,
id: null,
member_id: null,
network_id: null,
payment_method: null,
payment_type: null,
payment_type_id: null,
payments: [],
plan: null,
plan_id: null,
plan_price: null,
price: null,
services: [],
starts_on: null,
status: null,
term_duration: null,
term_unit: null,
trial: null,
updated_at: null
}, n.prototype.relations = [{
type: "HasOne",
key: "payment_type",
relatedModel: di.model.PaymentType,
parse: !0
}, {
type: "HasOne",
key: "plan",
relatedModel: di.model.Plan,
parse: !0
}, {
type: "HasOne",
key: "payment_method",
relatedModel: di.model.PaymentMethod,
parse: !0
}], n.prototype.isTrial = function() {
var e;
return this.get("trial") && (null != (e = this.get("plan")) ? e.has("trial_duration_days") : void 0)
}, n
}(Backbone.RelationalModel)
}.call(this),
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.provide("di.model.EmailCampaign"), di.model.EmailCampaign = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
return t(n, e), n.prototype.defaults = {
auto_opt_in: null,
created_at: null,
id: null,
key: null,
name: null,
network: null,
position: null,
sailthru_name: null,
updated_at: null
}, n
}(Backbone.RelationalModel)
}.call(this),
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.provide("di.model.Member"), di.model.Member = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
return t(n, e), n.prototype.defaults = {
activated: null,
active: null,
amember_id: null,
api_key: null,
api_key_created_at: null,
avatar_url: null,
confirmation_token: null,
confirmed: null,
confirmed_at: null,
created_at: null,
delete_token: null,
email: null,
email_campaigns: [],
failed_login_count: null,
first_name: null,
fraudulent: null,
has_set_password: null,
id: null,
images: null,
last_login_attempt: null,
last_name: null,
listen_key: null,
locale: null,
network_favorite_channels: [],
network_id: null,
password_reset_token: null,
payment_method: null,
signup_country: null,
signup_ip_address: null,
subscriptions: [],
timezone: null,
tracking_code_id: null,
updated_at: null,
user_type: null,
webplayer_preferences: null
}, n.prototype.relations = [{
type: "HasMany",
key: "subscriptions",
relatedModel: di.model.Subscription,
parse: !0
}, {
type: "HasOne",
key: "payment_method",
relatedModel: di.model.PaymentMethod,
parse: !0
}, {
type: "HasMany",
key: "email_campaigns",
relatedModel: di.model.EmailCampaign,
parse: !0
}], n.prototype.isPremiumSubscriber = function() {
var e;
return e = this.get("subscriptions").find(function(e) {
return e.get("active?")
}), null != e
}, n
}(Backbone.RelationalModel)
}.call(this),
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.provide("di.model.CurrentUser"), di.model.CurrentUser = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
return t(n, e), n.prototype.initialize = function() {
return di.app.reqres.setHandler("currentUser", function(e) {
return function() {
return e
}
}(this))
}, n.prototype.currentSubscription = function() {
return this.get("subscriptions").findWhere({
"active?": !0
})
}, n
}(di.model.Member)
}.call(this),
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.provide("di.model.PlayerSettings"), di.model.PlayerSettings = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
return t(n, e), n.prototype.defaults = {
speed: "aac_medium",
wptype: "embedded",
player: "webplayer",
external_filetype: "aac",
external_channel_key: "favorites",
external_quality: "high",
hardware_channel_key: "",
hardware_quality: "premium"
}, n.prototype.initialize = function() {
return this.loadSettingsFromCookie()
}, n.prototype.loadSettingsFromCookie = function() {
var e, t, n, i, r;
i = this.defaults, r = [];
for (t in i) n = i[t], e = $.cookie(t), r.push(null != e ? this.set(t, e) : void 0);
return r
}, n.prototype.save = function() {
var e, t, n, i;
n = this.toJSON(), i = [];
for (e in n) t = n[e], i.push($.cookie(e, t, {
expires: 3650,
path: "/"
}));
return i
}, n
}(Backbone.RelationalModel)
}.call(this),
function() {
di.app.module("MemberApp", function(e, t, n, i, r, o) {
var a;
return a = i.Region.extend({
el: "#member-content-region",
initialize: function() {
return this.listenTo(t, "member:navigate", o.bind(this.fadeOut, this))
},
onShow: function(e) {
return window.scrollTo(0, 0), null == e.hasTransitionedIn && (o.delay(function() {
return function() {
return e.$el.find(".transition-in").each(function(e, t) {
return o.delay(function() {
var e;
return e = r(t), e.addClass("visible")
}, 50 * e)
})
}
}(this), 10), e.hasTransitionedIn = !0), e.listenTo(e, "render", function() {
return e.$el.find(".transition-in").each(function(e, t) {
return r(t).removeClass("transition-in")
})
})
},
fadeOut: function() {
return this.$el.find(".transition-in").each(function(e, t) {
return o.delay(function() {
return r(t).removeClass("visible")
}, 50 * e)
})
}
}), e.Controller = {
regions: {
memberHeaderRegion: "#member-header-region",
memberContentRegion: a
},
views: {
profile: "Profile",
email_preferences: "EmailPreferences",
subscription: "Subscription",
"favorite/channels": "FavoriteChannels",
settings: "PlayerSettings"
},
initialize: function(e) {
return this.models = e, this.disableWaitAnim(), this.setupRegions(), this.createHeader(), this.setupListeners(), this.showHeader(), this.navigate(location.pathname)
},
disableWaitAnim: function() {
return t.execute("xhrpages:wait:disable")
},
setupListeners: function() {
return this.models.state.on("change:section", function(e) {
return function(t, n) {
return e.showSection(n)
}
}(this)), r(window).on("statechange.memberapp", function(e) {
return function() {
return e.navigate(History.getState().url)
}
}(this))
},
setupRegions: function() {
return t.addRegions(this.regions)
},
createHeader: function() {
return null != this.headerView ? this.headerView : this.headerView = new e.Views.Header({
model: this.models.state
})
},
showHeader: function() {
return t.memberHeaderRegion.show(this.headerView)
},
navigate: function(e) {
var t;
return null == location.origin && (location.origin = location.protocol + "//" + location.host), e = e.replace(location.origin, ""), t = e.match(e.indexOf("member") > -1 ? /\/member\/(.*)\/?/ : /\/(.*)\/?/), t = null != t ? t[1] : null, this.models.state.set({
section: t,
section_path: e
})
},
showSection: function(n) {
var i, o, a;
return null == n && (n = "profile"), o = null != (a = this.views[n]) ? a : this.views.profile, i = new e.Views[o]({
model: this.models.member
}), t.memberContentRegion.show(i), r(document.body).removeClass("wait")
},
destroy: function() {
return this.removeListeners(), this.removeRegions(), this.enableWaitAnim(), this.headerView = null
},
removeListeners: function() {
return this.models.state.off("change:section"), r(window).off("statechange.memberapp")
},
removeRegions: function() {
var e, n, i, r;
i = this.regions, r = [];
for (e in i) n = i[e], t[e].empty(), r.push(t.removeRegion(e));
return r
},
enableWaitAnim: function() {
return t.execute("xhrpages:wait:enable")
}
}
})
}.call(this),
function() {
di.app.module("MemberApp", function(e, t, n, i, r) {
var o, a, s;
return this.startWithParent = !1, s = "#member-header-region", a = "#member-content-region", o = {
models: {},
initialize: function(t) {
var i, o, a, s, l;
if (null != t.paypal_response && null != (null != (s = window.opener) ? s.onPayPalResponse : void 0)) return window.opener.onPayPalResponse(t.paypal_response, t.payment_method), void window.close();
for (null == t && (t = {}), r("#page-wrap").addClass("member-account"), t.member.payment_method = t.payment_method, this.models.member = di.model.CurrentUser.findOrCreate(t.member, {
parse: !0
}), this.models.state = new n.Model({
section: "",
section_path: ""
}), di.model.Subscription.findOrCreate(t.subscription, {
parse: !0
}), l = t.email_campaigns, o = 0, a = l.length; a > o; o++) i = l[o], di.model.EmailCampaign.findOrCreate(i, {
parse: !0
});
return e.Controller.initialize(this.models)
},
finalize: function() {
return e.Controller.destroy(), r("#page-wrap").removeClass("member-account")
}
}, e.addInitializer(function(e) {
return o.initialize(e)
}), e.addFinalizer(function() {
return o.finalize()
})
})
}.call(this),
function() {
di.app.module("MemberApp.Views", function(e, t, n, i) {
return e.BaseMemberView = i.ItemView.extend({})
})
}.call(this),
function() {
di.app.module("MemberApp.Views", function(e, t, n, i, r, o) {
var a;
return a = {
"default": {
"class": ""
},
submitting: {
"class": "submitting",
message: "Updating your Email Preferences"
},
success: {
"class": "success",
message: '<i class="icon-check-circle"></i> Your Email Preferences have been updated.'
}
}, e.EmailPreferences = i.ItemView.extend({
id: "member-email-preferences",
template: "di/ui/member/email_preferences",
ui: {
form: ".email-preferences-form"
},
events: {
"ajax:beforeSend @ui.form": "ajaxSending",
"ajax:error @ui.form": "ajaxError",
"ajax:success @ui.form": "ajaxSuccess"
},
modelEvents: {
change: "render"
},
templateHelpers: function() {
return {
emailCampaigns: function() {
var e;
return e = n.Relational.store.getCollection(di.model.EmailCampaign).models, e = o.filter(e, function(e) {
return e.get("network").key === t.options.network_key
}), o.map(e, function(e) {
return e.attributes
})
},
subscribedTo: function(e) {
var t;
return t = o.map(this.email_campaigns, function(e) {
return e.id
}), t.indexOf(e.id) > -1
}
}
},
ajaxSending: function() {
return this.setState("submitting", this.ui.form)
},
ajaxError: function() {
return this.setState("default", this.ui.form)
},
ajaxSuccess: function(e, t) {
return this.setState("success", this.ui.form), this.model.set("email_campaigns", t.result.email_campaigns, {
parse: !0,
silent: !0
}), o.delay(function(e) {
return function() {
return e.setState("default"), e.model.trigger("change")
}
}(this), 3e3)
},
setState: function(e, t) {
var n, i, r, o;
return null == t && (t = this.$el), e.indexOf(".") > -1 && (o = e.split("."), e = o[0], r = o[1]), n = t.find("#status-msg"), i = a[e], null != r && (i = i[r]), t.attr("data-state", e), null != i.message && n.html("<p>" + i.message + "</p>"), n.attr("class", i["class"])
}
})
})
}.call(this),
function(e) {
"use strict";
"function" == typeof define && define.amd ? define(e) : "undefined" != typeof module && "undefined" != typeof module.exports ? module.exports = e() : window.Sortable = e()
}(function() {
"use strict";
function e(e, n) {
this.el = e, this.options = n = n || {};
var i = {
group: Math.random(),
store: null,
handle: null,
draggable: e.children[0] && e.children[0].nodeName || (/[uo]l/i.test(e.nodeName) ? "li" : "*"),
ghostClass: "sortable-ghost",
ignore: "a, img",
filter: null
};
for (var o in i) n[o] = n[o] || i[o];
I.forEach(function(i) {
n[i] = t(this, n[i] || F), r(e, i.substr(2).toLowerCase(), n[i])
}, this), e[k] = n.group;
for (var a in this) "_" === a.charAt(0) && (this[a] = t(this, this[a]));
r(e, "mousedown", this._onTapStart), r(e, "touchstart", this._onTapStart), T && r(e, "selectstart", this._onTapStart), r(e, "dragover", this._onDragOver), r(e, "dragenter", this._onDragOver), R.push(this._onDragOver), n.store && this.sort(n.store.get(this))
}
function t(e, t) {
var n = O.call(arguments, 2);
return t.bind ? t.bind.apply(t, [e].concat(n)) : function() {
return t.apply(e, n.concat(O.call(arguments)))
}
}
function n(e, t, n) {
if ("*" === t) return e;
if (e) {
n = n || A, t = t.split(".");
var i = t.shift().toUpperCase(),
r = new RegExp("\\s(" + t.join("|") + ")\\s", "g");
do
if (!("" !== i && e.nodeName != i || t.length && ((" " + e.className + " ").match(r) || []).length != t.length)) return e;
while (e !== n && (e = e.parentNode))
}
return null
}
function i(e) {
e.dataTransfer.dropEffect = "move", e.preventDefault()
}
function r(e, t, n) {
e.addEventListener(t, n, !1)
}
function o(e, t, n) {
e.removeEventListener(t, n, !1)
}
function a(e, t, n) {
if (e)
if (e.classList) e.classList[n ? "add" : "remove"](t);
else {
var i = (" " + e.className + " ").replace(/\s+/g, " ").replace(" " + t + " ", "");
e.className = i + (n ? " " + t : "")
}
}
function s(e, t, n) {
if (e && e.style) {
if (void 0 === n) return A.defaultView && A.defaultView.getComputedStyle ? n = A.defaultView.getComputedStyle(e, "") : e.currentStyle && (n = e.currentStyle), void 0 === t ? n : n[t];
e.style[t] = n + ("string" == typeof n ? "" : "px")
}
}
function l(e, t, n) {
if (e) {
var i = e.getElementsByTagName(t),
r = 0,
o = i.length;
if (n)
for (; o > r; r++) n(i[r], r);
return i
}
return []
}
function u(e) {
return e.draggable = !1
}
function c() {
P = !1
}
function d(e, t) {
var n = e.lastElementChild.getBoundingClientRect();
return t.clientY - (n.top + n.height) > 5
}
function h(e) {
for (var t = e.tagName + e.className + e.src + e.href + e.textContent, n = t.length, i = 0; n--;) i += t.charCodeAt(n);
return i.toString(36)
}
var p, f, m, g, y, v, _, b, w, x, k = "Sortable" + (new Date).getTime(),
C = window,
A = C.document,
S = C.parseInt,
T = !!A.createElement("div").dragDrop,
P = !1,
M = function(e, t) {
var n = A.createEvent("Event");
return n.initEvent(e, !0, !0), n.item = t, n
},
E = function(e, t, n) {
e.dispatchEvent(M(t, n || e))
},
I = "onAdd onUpdate onRemove onStart onEnd onFilter".split(" "),
F = function() {},
O = [].slice,
R = [];
return e.prototype = {
constructor: e,
_applyEffects: function() {
a(p, this.options.ghostClass, !0)
},
_onTapStart: function(e) {
var t = e.touches && e.touches[0],
o = (t || e).target,
a = this.options,
s = this.el,
c = a.filter;
if ("mousedown" !== e.type || 0 === e.button) {
if ("function" == typeof c) {
if (c.call(this, o, this)) return void E(s, "filter", o)
} else if (c && (c = c.split(",").filter(function(e) {
return n(o, e.trim(), s)
}), c.length)) return void E(s, "filter", o);
if (a.handle && (o = n(o, a.handle, s)), o = n(o, a.draggable, s), o && "selectstart" == e.type && "A" != o.tagName && "IMG" != o.tagName && o.dragDrop(), o && !p && o.parentNode === s) {
w = e, m = this.el, p = o, g = p.nextSibling, b = this.options.group, p.draggable = !0, a.ignore.split(",").forEach(function(e) {
l(o, e.trim(), u)
}), t && (w = {
target: o,
clientX: t.clientX,
clientY: t.clientY
}, this._onDragStart(w, !0), e.preventDefault()), r(A, "mouseup", this._onDrop), r(A, "touchend", this._onDrop), r(A, "touchcancel", this._onDrop), r(this.el, "dragstart", this._onDragStart), r(this.el, "dragend", this._onDrop), r(A, "dragover", i);
try {
A.selection ? A.selection.empty() : window.getSelection().removeAllRanges()
} catch (d) {}
E(p, "start")
}
}
},
_emulateDragOver: function() {
if (x) {
s(f, "display", "none");
var e = A.elementFromPoint(x.clientX, x.clientY),
t = e,
n = this.options.group,
i = R.length;
if (t)
do {
if (t[k] === n) {
for (; i--;) R[i]({
clientX: x.clientX,
clientY: x.clientY,
target: e,
rootEl: t
});
break
}
e = t
} while (t = t.parentNode);
s(f, "display", "")
}
},
_onTouchMove: function(e) {
if (w) {
var t = e.touches[0],
n = t.clientX - w.clientX,
i = t.clientY - w.clientY,
r = "translate3d(" + n + "px," + i + "px,0)";
x = t, s(f, "webkitTransform", r), s(f, "mozTransform", r), s(f, "msTransform", r), s(f, "transform", r), e.preventDefault()
}
},
_onDragStart: function(e, t) {
var n = e.dataTransfer;
if (this._offUpEvents(), t) {
var i, o = p.getBoundingClientRect(),
a = s(p);
f = p.cloneNode(!0), s(f, "top", o.top - S(a.marginTop, 10)), s(f, "left", o.left - S(a.marginLeft, 10)), s(f, "width", o.width), s(f, "height", o.height), s(f, "opacity", "0.8"), s(f, "position", "fixed"), s(f, "zIndex", "100000"), m.appendChild(f), i = f.getBoundingClientRect(), s(f, "width", 2 * o.width - i.width), s(f, "height", 2 * o.height - i.height), r(A, "touchmove", this._onTouchMove), r(A, "touchend", this._onDrop), r(A, "touchcancel", this._onDrop), this._loopId = setInterval(this._emulateDragOver, 150)
} else n.effectAllowed = "move", n.setData("Text", p.textContent), r(A, "drop", this._onDrop);
setTimeout(this._applyEffects)
},
_onDragOver: function(e) {
if (!P && b === this.options.group && (void 0 === e.rootEl || e.rootEl === this.el)) {
var t = this.el,
i = n(e.target, this.options.draggable, t);
if (0 === t.children.length || t.children[0] === f || t === e.target && d(t, e)) t.appendChild(p);
else if (i && i !== p && void 0 !== i.parentNode[k]) {
y !== i && (y = i, v = s(i), _ = i.getBoundingClientRect());
var r, o = _,
a = o.right - o.left,
l = o.bottom - o.top,
u = /left|right|inline/.test(v.cssFloat + v.display),
h = i.offsetWidth > p.offsetWidth,
m = i.offsetHeight > p.offsetHeight,
g = (u ? (e.clientX - o.left) / a : (e.clientY - o.top) / l) > .5,
w = i.nextElementSibling;
P = !0, setTimeout(c, 30), r = u ? i.previousElementSibling === p && !h || g && h : w !== p && !m || g && m, r && !w ? t.appendChild(p) : i.parentNode.insertBefore(p, r ? w : i)
}
}
},
_offUpEvents: function() {
o(A, "mouseup", this._onDrop), o(A, "touchmove", this._onTouchMove), o(A, "touchend", this._onDrop), o(A, "touchcancel", this._onDrop)
},
_onDrop: function(e) {
clearInterval(this._loopId), o(A, "drop", this._onDrop), o(A, "dragover", i), o(this.el, "dragend", this._onDrop), o(this.el, "dragstart", this._onDragStart), o(this.el, "selectstart", this._onTapStart), this._offUpEvents(), e && (e.preventDefault(), e.stopPropagation(), f && f.parentNode.removeChild(f), p && (u(p), a(p, this.options.ghostClass, !1), m.contains(p) ? p.nextSibling !== g && E(p, "update") : (E(m, "remove", p), E(p, "add")), E(p, "end")), m = p = f = g = w = x = y = v = b = null, this.options.store && this.options.store.set(this))
},
toArray: function() {
for (var e, t = [], i = this.el.children, r = 0, o = i.length; o > r; r++) e = i[r], n(e, this.options.draggable, this.el) && t.push(e.getAttribute("data-id") || h(e));
return t
},
sort: function(e) {
var t = {},
i = this.el;
this.toArray().forEach(function(e, r) {
var o = i.children[r];
n(o, this.options.draggable, i) && (t[e] = o)
}, this), e.forEach(function(e) {
t[e] && (i.removeChild(t[e]), i.appendChild(t[e]))
})
},
closest: function(e, t) {
return n(e, t || this.options.draggable, this.el)
},
destroy: function() {
var e = this.el,
t = this.options;
I.forEach(function(n) {
o(e, n.substr(2).toLowerCase(), t[n])
}), o(e, "mousedown", this._onTapStart), o(e, "touchstart", this._onTapStart), o(e, "selectstart", this._onTapStart), o(e, "dragover", this._onDragOver), o(e, "dragenter", this._onDragOver), Array.prototype.forEach.call(e.querySelectorAll("[draggable]"), function(e) {
e.removeAttribute("draggable")
}), R.splice(R.indexOf(this._onDragOver), 1), this._onDrop(), this.el = null
}
}, e.utils = {
on: r,
off: o,
css: s,
find: l,
bind: t,
closest: n,
toggleClass: a,
createEvent: M,
dispatchEvent: E
}, e.version = "0.5.2", e
}),
function() {
di.app.module("MemberApp.Views", function(e, t, n, i, r, o) {
var a;
return a = "#webplayer-region", e.EmptyView = i.ItemView.extend({
tagName: "li",
className: "drag-channels-msg",
message: "Drag any channels here to favorite them",
render: function() {
return this.$el.text(this.message)
}
}), e.ChannelItemView = i.ItemView.extend({
tagName: "li",
className: "channel-item",
template: "di/ui/member/favorite_channels_list_item",
modelEvents: {
"change:favorite_position": "render"
},
onRender: function() {
return this.$el.data("id", this.model.get("id"))
},
templateHelpers: {
channelArt: function() {
return AudioAddict.UI.img_uri(this, {
size: "36x36"
})
}
},
serializeData: function(e) {
return e = this.model.toJSON(), null == e.favorite_position && (e.favorite_position = null), e
}
}), e.ChannelListView = i.CollectionView.extend({
template: "di/ui/member/favorite_channels_list",
tagName: "ol",
childView: e.ChannelItemView,
emptyView: e.EmptyView,
className: function() {
return "channel-list " + this.options.listType
},
events: {
add: "onSortItemAdded",
update: "onSortOrderUpdated"
},
saveChanges: function() {
return t.commands.execute("favorites:save")
},
onSortItemAdded: function(e) {
var t, n;
return n = this.options.otherCollection.get(r(e.target).data("id")), t = r(e.target).index(), this.options.otherCollection.remove(n), this.collection.add(n, {
at: t
}), "favorites" === this.options.listType ? this.collection.each(function(e, t) {
return e.set({
favorite: !0,
favorite_position: t
})
}) : (n.set({
favorite: !1,
favorite_position: null
}), this.options.otherCollection.each(function(e, t) {
return e.set({
favorite_position: t
})
})), this.saveChanges()
},
onSortOrderUpdated: function(e) {
var t, n;
return "favorites" === this.options.listType ? (n = this.collection.get(r(e.target).data("id")), t = r(e.target).index(), this.collection.remove(n), this.collection.add(n, {
at: t
}), this.collection.each(function(e, t) {
return e.set({
favorite_position: t
})
}), this.saveChanges()) : void 0
},
onBeforeRender: function() {
var e;
return null != (e = this.sortable) && e.destroy(), this.sortable = new Sortable(this.el, {
group: "channels",
filter: ".drag-channels-msg"
})
}
}), e.FavoriteChannels = i.LayoutView.extend({
id: "member-favorite-channels",
template: "di/ui/member/favorite_channels",
regions: {
favoriteChannelsRegion: ".favorite-channels .region",
availableChannelsRegion: ".available-channels .region"
},
ui: {
favoritesColumn: ".favorite-channels",
availableColumn: ".available-channels",
emptyMessage: ".drag-channels-msg"
},
initialize: function() {
return this.initViewStateModel(), this.initCollections()
},
initViewStateModel: function() {
return this.viewStateModel = new n.Model({
position: "default"
}), this.listenTo(this.viewStateModel, "change:position", o.bind(this.onViewStateModelChanged, this))
},
initCollections: function() {
return this.allChannels = t.request("channel:entities"), this.listenTo(this.allChannels, "change:favorite", o.bind(this.onFavoriteChanged, this)), this.favoritesCollection = new n.Collection(this.allChannels.where({
favorite: !0
})), this.favoritesCollection.comparator = "favorite_position", this.favoritesCollection.sort(), this.availableCollection = new n.Collection(this.allChannels.where({
favorite: !1
}))
},
onBeforeShow: function() {
return this.favoriteChannelsRegion.show(new e.ChannelListView({
collection: this.favoritesCollection,
otherCollection: this.availableCollection,
listType: "favorites"
})), this.availableChannelsRegion.show(new e.ChannelListView({
collection: this.availableCollection,
otherCollection: this.favoritesCollection,
listType: "available"
})), this.ui.favoritesList = this.favoriteChannelsRegion.currentView.$el
},
onShow: function() {
return r(window).on({
"scroll.favoriteChannels": o.throttle(o.bind(this.checkScrollPosition, this), 100),
"resize.favoriteChannels": o.throttle(o.bind(this.checkFavoritesMaxHeight, this), 100)
}), this.checkScrollPosition()
},
onFavoriteChanged: function(e, t) {
return t ? -1 === this.favoritesCollection.indexOf(e) && (this.favoritesCollection.add(e, {
at: 0
}), this.availableCollection.remove(e)) : -1 === this.availableCollection.indexOf(e) && (this.availableCollection.add(e), this.favoritesCollection.remove(e)), this.checkFavoritesMaxHeight()
},
checkFavoritesMaxHeight: function() {
var e, t;
if (!(this.ui.favoritesColumn.height() > this.ui.availableColumn.height())) return this.heightAdjust || (this.ui.window = r(window), this.heightAdjust = 30, this.heightAdjust = this.ui.favoritesColumn.find(".column-title").outerHeight(), this.heightAdjust += parseInt(this.ui.favoritesList.css("padding-top")), this.heightAdjust += parseInt(this.ui.favoritesList.css("padding-bottom")), this.heightAdjust += r(a).height()), t = this.ui.window.height() - this.heightAdjust, e = this.favoriteChannelsRegion.currentView.$el.height(), e >= t && "default" !== this.viewStateModel.get("position") ? this.ui.favoritesList.css({
maxHeight: t
}).perfectScrollbar({
suppressScrollX: !0
}).addClass("with-scrollbar") : this.ui.favoritesList.css({
maxHeight: ""
}).perfectScrollbar("destroy").removeClass("with-scrollbar")
},
checkScrollPosition: function() {
var e, t, n, i, o;
return o = r(window).scrollTop(), t = this.ui.availableColumn.offset(), t.bottom = t.top + this.ui.availableColumn.outerHeight(), n = this.ui.favoritesColumn.outerHeight() + 10, e = this.ui.availableColumn.height(), i = this.ui.favoritesColumn.height(), o >= t.top && e > i ? o + n >= t.bottom ? this.viewStateModel.set("position", "fixed-bottom") : this.viewStateModel.set("position", "fixed-top") : this.viewStateModel.set("position", "default")
},
onViewStateModelChanged: function(e, t) {
var n, i, r, o;
switch (t) {
case "fixed-top":
this.ui.favoritesColumn.css({
left: this.ui.favoritesColumn.offset().left,
width: this.ui.favoritesColumn.width()
});
break;
case "fixed-bottom":
case "default":
this.ui.favoritesColumn.css({
width: "",
left: ""
})
}
for (o = ["fixed-top", "fixed-bottom", "default"], i = 0, r = o.length; r > i; i++) n = o[i], this.ui.favoritesColumn.removeClass(n);
return this.ui.favoritesColumn.addClass(t), this.checkFavoritesMaxHeight()
},
onBeforeDestroy: function() {
return this.ui.favoritesList.perfectScrollbar("destroy"), r(window).off(".favoriteChannels")
}
})
})
}.call(this),
function() {
di.app.module("MemberApp.Views", function(e, t, n, i, r, o) {
return e.Header = i.ItemView.extend({
id: "member-header",
template: "di/ui/member/header",
modelEvents: {
"change:section_path": "setActiveNavOnModelChange"
},
ui: {
nav: ".member-header-nav"
},
events: {
"click @ui.nav a[href]": "setActiveNavOnClick"
},
onShow: function() {
return o.delay(function(e) {
return function() {
return e.$el.addClass("show")
}
}(this), 100)
},
setActiveNavOnModelChange: function() {
return this.setActiveNav(this.model.get("section_path"))
},
setActiveNavOnClick: function(e) {
return r(e.currentTarget).parent().is(".active") ? void e.preventDefault() : (this.setActiveNav(r(e.currentTarget).attr("href")), t.trigger("member:navigate"))
},
setActiveNav: function(e) {
var t;
return this.ui.nav.find("li.active").removeClass("active"), t = this.$el.find('a[href="' + e + '"]').closest("li"), t.addClass("active")
}
})
})
}.call(this),
function() {
di.app.module("MemberApp.Views", function(e, t, n, i, r, o) {
var a;
return a = new n.Model({}), e.PlayerSettings = e.BaseMemberView.extend({
id: "member-player-settings",
template: "di/ui/member/player_settings",
ui: {
webplayerQualitySelect: "#webplayer-quality",
qualitySavedMsg: ".quality-saved-msg",
extenalFileTypRadios: 'input[name="external_filetype"]',
externalPlaylistContent: 'input[name="external_playlist_content"]',
externalChannelSelector: "#external-channel-selector",
externalQualitySelector: "#external-quality-selector",
downloadPlaylist: ".download-playlist",
hardwareChannelSelector: "#hardware-channel-selector",
hardwareQualitySelector: "#hardware-quality-selector",
listenKeyForm: ".listen-key-form",
listenKeyActions: ".listen-key-actions"
},
events: {
"change @ui.webplayerQualitySelect": "updatePlayerQuality",
"change @ui.extenalFileTypRadios": "updateExternalFileType",
"change @ui.externalPlaylistContent": "updateExternalPlaylistContent",
"change @ui.externalChannelSelector": "updateExternalChannel",
"change @ui.externalQualitySelector": "updateExternalQuality",
"change @ui.hardwareChannelSelector": "updateHardwareChannel",
"change @ui.hardwareQualitySelector": "updateHardwareQuality",
"click @ui.downloadPlaylist": "downloadPlaylist",
"ajax:beforeSend @ui.listenKeyForm": "showListenKeySpinner",
"ajax:success @ui.listenKeyForm": "updateListenKey"
},
modelEvents: {
change: "render"
},
templateHelpers: {
streamSetConfigs: function(e) {
var n;
return null == e && (e = "webplayer"), n = t.request("streamSetConfig:entities", {
format_name: e
}), n.toJSON()
},
channels: function() {
var e;
return e = t.request("channel:entities").toJSON(), e = o.sortBy(e, function(e) {
return e.name
})
},
hardwareServers: function() {
var e;
return e = t.request("playlists:entity", {
channel: this.hardware_channel_key,
quality: this.hardware_quality
}), e.get("servers").length || e.once("change:servers", function() {
return a.set("render", new Date)
}), e.get("servers")
},
hardwarePlaylistUrl: function() {
var e, n, i;
return n = t.request("playlists:listen_url"), e = this.listenKey(), i = [n, this.hardware_quality, this.hardware_channel_key].join("/"), i += ".pls?listen_key=" + e
},
listenKey: function() {
return t.request("currentUser").get("listen_key")
},
listenKeyUpdated: function() {
var e;
return e = a.get("listen_key_updated"), a.set("listen_key_updated", !1), e
},
isPremium: function() {
return null != t.request("currentUser").currentSubscription()
}
},
initialize: function() {
return this.model = new di.model.PlayerSettings, this.listenTo(a, "change:render", o.bind(this.render, this))
},
onDomRefresh: function() {
return this.$el.find("select").each(function(e, t) {
var n, i;
return i = r(t), n = i.find("option"), i.chosen({
disable_search_threshold: 10
}), 1 === n.length ? i.next(".chzn-container").addClass("disabled") : void 0
})
},
updatePlayerQuality: function(e) {
var t, n;
return t = r(e.currentTarget), n = t.val(), this.model.set("speed", n), this.model.save(), this.ui.qualitySavedMsg.addClass("visible"), o.delay(function(e) {
return function() {
return e.ui.qualitySavedMsg.removeClass("visible")
}
}(this), 3e3)
},
updateExternalFileType: function(e) {
var t, n;
return t = r(e.currentTarget), n = t.val(), this.model.set("external_filetype", n)
},
updateExternalPlaylistContent: function(e) {
var t, n;
return t = r(e.currentTarget), n = t.val(), "favorites" === n ? this.model.set("external_channel_key", "favorites") : this.model.set("external_channel_key", "")
},
updateExternalChannel: function(e) {
var t, n;
return t = r(e.currentTarget), n = t.val(), this.model.set("external_channel_key", n)
},
updateExternalQuality: function(e) {
var t, n;
return t = r(e.currentTarget), n = t.val(), this.model.set("external_quality", n)
},
updateHardwareChannel: function(e) {
var t, n;
return t = r(e.currentTarget), n = t.val(), this.model.set("hardware_channel_key", n), this.model.save()
},
updateHardwareQuality: function(e) {
var t, n;
return t = r(e.currentTarget), n = t.val(), this.model.set("hardware_quality", n), this.model.save()
},
downloadPlaylist: function() {
var e, n, i, r;
return n = "/playlist?", e = t.request("currentUser"), i = e.isPremiumSubscriber() ? "premium" : "public", r = ["channel_key=" + this.model.get("external_channel_key"), "subscription=" + i, "file_type=" + this.model.get("external_filetype"), "quality=" + this.model.get("external_quality")], n += r.join("&"), window.open(n, "_blank"), this.model.save()
},
showListenKeySpinner: function() {
return this.ui.listenKeyActions.attr("data-state", "submitting")
},
updateListenKey: function(e, n) {
var i;
return i = t.request("currentUser"), i.set("listen_key", n.listen_key), a.set("listen_key_updated", !0), this.ui.listenKeyActions.attr("data-state", "success"), o.delay(function() {
return function() {
return a.set("render", new Date)
}
}(this), 1500)
},
onBeforeDestroy: function() {
return this.$el.find("select").chosen("destroy")
}
})
})
}.call(this),
function(e) {
var t;
t = function() {
function e() {}
return e.prototype.setup = function(e, t, n, i) {
var r, o;
return null == n && (n = 1), o = t.w / e.w, r = t.h / e.h, this.minZoom = (null != i ? i.fitWidth : void 0) && !(null != i ? i.fitHeight : void 0) ? o : (null != i ? i.fitHeight : void 0) && !(null != i ? i.fitWidth : void 0) ? r : (null != i ? i.fitWidth : void 0) && (null != i ? i.fitHeight : void 0) ? r > o ? o : r : r > o ? r : o, this.maxZoom = this.minZoom < 1 / n ? 1 / n : this.minZoom
}, e.prototype.getZoom = function(e) {
return this.minZoom && this.maxZoom ? e * (this.maxZoom - this.minZoom) + this.minZoom : null
}, e.prototype.getSliderPos = function(e) {
return this.minZoom && this.maxZoom ? this.minZoom === this.maxZoom ? 0 : (e - this.minZoom) / (this.maxZoom - this.minZoom) : null
}, e.prototype.isZoomable = function() {
return this.minZoom && this.maxZoom ? this.minZoom !== this.maxZoom : null
}, e.prototype.fixZoom = function(e) {
return e < this.minZoom ? this.minZoom : e > this.maxZoom ? this.maxZoom : e
}, e
}();
var n;
n = function() {
function n(t, i) {
var r;
this.element = t, this.$el = e(this.element), r = {
$fileInput: this.$("input.cropit-image-input"),
$preview: this.$(".cropit-image-preview"),
$zoomSlider: this.$("input.cropit-image-zoom-input"),
$previewContainer: this.$(".cropit-image-preview-container")
}, this.options = e.extend({}, n._DEFAULTS, r, i), this.init()
}
return n._DEFAULTS = {
exportZoom: 1,
imageBackground: !1,
imageBackgroundBorderWidth: 0,
imageState: null,
allowCrossOrigin: !1,
fitWidth: !1,
fitHeight: !1
}, n.PREVIEW_EVENTS = function() {
return ["mousedown", "mouseup", "mouseleave", "touchstart", "touchend", "touchcancel", "touchleave"].map(function(e) {
return "" + e + ".cropit"
}).join(" ")
}(), n.PREVIEW_MOVE_EVENTS = "mousemove.cropit touchmove.cropit", n.ZOOM_INPUT_EVENTS = function() {
return ["mousemove", "touchmove", "change"].map(function(e) {
return "" + e + ".cropit"
}).join(" ")
}(), n.prototype.init = function() {
var n, i, r, o;
return this.image = new Image, this.options.allowCrossOrigin && (this.image.crossOrigin = "Anonymous"), this.$fileInput = this.options.$fileInput.attr({
accept: "image/*"
}), this.$preview = this.options.$preview.css({
backgroundRepeat: "no-repeat"
}), this.$zoomSlider = this.options.$zoomSlider.attr({
min: 0,
max: 1,
step: .01
}), this.previewSize = {
w: this.options.width || this.$preview.width(),
h: this.options.height || this.$preview.height()
}, this.options.width && this.$preview.width(this.previewSize.w), this.options.height && this.$preview.height(this.previewSize.h), this.options.imageBackground && (e.isArray(this.options.imageBackgroundBorderWidth) ? this.imageBgBorderWidthArray = this.options.imageBackgroundBorderWidth : (this.imageBgBorderWidthArray = [], [0, 1, 2, 3].forEach(function(e) {
return function(t) {
return e.imageBgBorderWidthArray[t] = e.options.imageBackgroundBorderWidth
}
}(this))), n = this.options.$previewContainer, this.$imageBg = e("<img />").addClass("cropit-image-background").attr("alt", "").css("position", "absolute"), this.$imageBgContainer = e("<div />").addClass("cropit-image-background-container").css({
position: "absolute",
zIndex: 0,
left: -this.imageBgBorderWidthArray[3] + window.parseInt(this.$preview.css("border-left-width")),
top: -this.imageBgBorderWidthArray[0] + window.parseInt(this.$preview.css("border-top-width")),
width: this.previewSize.w + this.imageBgBorderWidthArray[1] + this.imageBgBorderWidthArray[3],
height: this.previewSize.h + this.imageBgBorderWidthArray[0] + this.imageBgBorderWidthArray[2]
}).append(this.$imageBg), this.imageBgBorderWidthArray[0] > 0 && this.$imageBgContainer.css({
overflow: "hidden"
}), n.css("position", "relative").prepend(this.$imageBgContainer), this.$preview.css("position", "relative"), this.$preview.hover(function(e) {
return function() {
return e.$imageBg.addClass("cropit-preview-hovered")
}
}(this), function(e) {
return function() {
return e.$imageBg.removeClass("cropit-preview-hovered")
}
}(this))), this.initialOffset = {
x: 0,
y: 0
}, this.initialZoom = 0, this.initialZoomSliderPos = 0, this.imageLoaded = !1, this.moveContinue = !1, this.zoomer = new t, this.bindListeners(), this.$zoomSlider.val(this.initialZoomSliderPos), this.setOffset((null != (i = this.options.imageState) ? i.offset : void 0) || this.initialOffset), this.zoom = (null != (r = this.options.imageState) ? r.zoom : void 0) || this.initialZoom, this.loadImage((null != (o = this.options.imageState) ? o.src : void 0) || null)
}, n.prototype.bindListeners = function() {
return this.$fileInput.on("change.cropit", this.onFileChange.bind(this)), this.$preview.on(n.PREVIEW_EVENTS, this.onPreviewEvent.bind(this)), this.$zoomSlider.on(n.ZOOM_INPUT_EVENTS, this.onZoomSliderChange.bind(this))
}, n.prototype.unbindListeners = function() {
return this.$fileInput.off("change.cropit"), this.$preview.off(n.PREVIEW_EVENTS), this.$zoomSlider.off(n.ZOOM_INPUT_EVENTS)
}, n.prototype.reset = function() {
return this.zoom = this.initialZoom, this.offset = this.initialOffset
}, n.prototype.onFileChange = function() {
var e, t, n;
return "function" == typeof(n = this.options).onFileChange && n.onFileChange(), t = new FileReader, e = this.$fileInput.get(0).files[0], (null != e ? e.type.match("image") : void 0) ? (this.setImageLoadingClass(), t.readAsDataURL(e), t.onload = this.onFileReaderLoaded.bind(this), t.onerror = this.onFileReaderError.bind(this)) : void 0
}, n.prototype.onFileReaderLoaded = function(e) {
return this.reset(), this.loadImage(e.target.result)
}, n.prototype.onFileReaderError = function() {
var e;
return "function" == typeof(e = this.options).onFileReaderError ? e.onFileReaderError() : void 0
}, n.prototype.loadImage = function(e) {
var t;
return this.imageSrc = e, this.imageSrc ? ("function" == typeof(t = this.options).onImageLoading && t.onImageLoading(), this.setImageLoadingClass(), this.image.onload = this.onImageLoaded.bind(this), this.image.onerror = this.onImageError.bind(this), this.image.src = this.imageSrc) : void 0
}, n.prototype.onImageLoaded = function() {
var e;
return this.setImageLoadedClass(), this.setOffset(this.offset), this.$preview.css("background-image", "url(" + this.imageSrc + ")"), this.options.imageBackground && this.$imageBg.attr("src", this.imageSrc), this.imageSize = {
w: this.image.width,
h: this.image.height
}, this.setupZoomer(), this.imageLoaded = !0, "function" == typeof(e = this.options).onImageLoaded ? e.onImageLoaded() : void 0
}, n.prototype.onImageError = function() {
var e;
return "function" == typeof(e = this.options).onImageError ? e.onImageError() : void 0
}, n.prototype.setImageLoadingClass = function() {
return this.$preview.removeClass("cropit-image-loaded").addClass("cropit-image-loading")
}, n.prototype.setImageLoadedClass = function() {
return this.$preview.removeClass("cropit-image-loading").addClass("cropit-image-loaded")
}, n.prototype.getEventPosition = function(e) {
var t, n, i, r;
return (null != (t = e.originalEvent) && null != (n = t.touches) ? n[0] : void 0) && (e = null != (i = e.originalEvent) && null != (r = i.touches) ? r[0] : void 0), e.clientX && e.clientY ? {
x: e.clientX,
y: e.clientY
} : void 0
}, n.prototype.onPreviewEvent = function(t) {
return this.imageLoaded ? (this.moveContinue = !1, this.$preview.off(n.PREVIEW_MOVE_EVENTS), "mousedown" === t.type || "touchstart" === t.type ? (this.origin = this.getEventPosition(t), this.moveContinue = !0, this.$preview.on(n.PREVIEW_MOVE_EVENTS, this.onMove.bind(this))) : e(document.body).focus(), t.stopPropagation(), !1) : void 0
}, n.prototype.onMove = function(e) {
var t;
return t = this.getEventPosition(e), this.moveContinue && t && this.setOffset({
x: this.offset.x + t.x - this.origin.x,
y: this.offset.y + t.y - this.origin.y
}), this.origin = t, e.stopPropagation(), !1
}, n.prototype.setOffset = function(e) {
return this.offset = this.fixOffset(e), this.$preview.css("background-position", "" + this.offset.x + "px " + this.offset.y + "px"), this.options.imageBackground ? this.$imageBg.css({
left: this.offset.x + this.imageBgBorderWidthArray[3],
top: this.offset.y + this.imageBgBorderWidthArray[0]
}) : void 0
}, n.prototype.fixOffset = function(e) {
var t;
return this.imageLoaded ? (t = {
x: e.x,
y: e.y
}, this.imageSize.w * this.zoom <= this.previewSize.w ? t.x = 0 : t.x > 0 ? t.x = 0 : t.x + this.imageSize.w * this.zoom < this.previewSize.w && (t.x = this.previewSize.w - this.imageSize.w * this.zoom), this.imageSize.h * this.zoom <= this.previewSize.h ? t.y = 0 : t.y > 0 ? t.y = 0 : t.y + this.imageSize.h * this.zoom < this.previewSize.h && (t.y = this.previewSize.h - this.imageSize.h * this.zoom), t.x = this.round(t.x), t.y = this.round(t.y), t) : e
}, n.prototype.onZoomSliderChange = function() {
var e;
if (this.imageLoaded) return this.zoomSliderPos = Number(this.$zoomSlider.val()), e = this.zoomer.getZoom(this.zoomSliderPos), this.setZoom(e)
}, n.prototype.enableZoomSlider = function() {
var e;
return this.$zoomSlider.removeAttr("disabled"), "function" == typeof(e = this.options).onZoomEnabled ? e.onZoomEnabled() : void 0
}, n.prototype.disableZoomSlider = function() {
var e;
return this.$zoomSlider.attr("disabled", !0), "function" == typeof(e = this.options).onZoomDisabled ? e.onZoomDisabled() : void 0
}, n.prototype.setupZoomer = function() {
return this.zoomer.setup(this.imageSize, this.previewSize, this.options.exportZoom, this.options), this.zoom = this.fixZoom(this.zoom), this.setZoom(this.zoom), this.isZoomable() ? this.enableZoomSlider() : this.disableZoomSlider()
}, n.prototype.setZoom = function(e) {
var t, n, i, r, o;
return e = this.fixZoom(e), o = this.round(this.imageSize.w * e), r = this.round(this.imageSize.h * e), i = this.zoom, t = this.previewSize.w / 2 - (this.previewSize.w / 2 - this.offset.x) * e / i, n = this.previewSize.h / 2 - (this.previewSize.h / 2 - this.offset.y) * e / i, this.zoom = e, this.setOffset({
x: t,
y: n
}), this.zoomSliderPos = this.zoomer.getSliderPos(this.zoom), this.$zoomSlider.val(this.zoomSliderPos), this.$preview.css("background-size", "" + o + "px " + r + "px"), this.options.imageBackground ? this.$imageBg.css({
width: o,
height: r
}) : void 0
}, n.prototype.fixZoom = function(e) {
return this.zoomer.fixZoom(e)
}, n.prototype.isZoomable = function() {
return this.zoomer.isZoomable()
}, n.prototype.getCroppedImageData = function(t) {
var n, i, r, o, a;
return this.imageSrc ? (o = {
type: "image/png",
quality: .75,
originalSize: !1,
fillBg: "#fff"
}, t = e.extend({}, o, t), r = {
w: this.previewSize.w,
h: this.previewSize.h
}, this.options.fitHeight && !this.options.fitWidth && this.imageSize.w * this.zoom < this.previewSize.w ? r.w = this.imageSize.w * this.zoom : this.options.fitWidth && !this.options.fitHeight && this.imageSize.h * this.zoom < this.previewSize.h && (r.h = this.imageSize.h * this.zoom), a = t.originalSize ? 1 / this.zoom : this.options.exportZoom, n = e("<canvas />").attr({
width: r.w * a,
height: r.h * a
}).get(0), i = n.getContext("2d"), "image/jpeg" === t.type && (i.fillStyle = t.fillBg, i.fillRect(0, 0, n.width, n.height)), i.drawImage(this.image, this.offset.x * a, this.offset.y * a, this.zoom * a * this.imageSize.w, this.zoom * a * this.imageSize.h), n.toDataURL(t.type, t.quality)) : null
}, n.prototype.getImageState = function() {
return {
src: this.imageSrc,
offset: this.offset,
zoom: this.zoom
}
}, n.prototype.getImageSrc = function() {
return this.imageSrc
}, n.prototype.getOffset = function() {
return this.offset
}, n.prototype.getZoom = function() {
return this.zoom
}, n.prototype.getImageSize = function() {
return this.imageSize ? {
width: this.imageSize.w,
height: this.imageSize.h
} : null
}, n.prototype.getPreviewSize = function() {
return {
width: this.previewSize.w,
height: this.previewSize.h
}
}, n.prototype.setPreviewSize = function(e) {
return (null != e ? e.width : void 0) > 0 && (null != e ? e.height : void 0) > 0 ? (this.previewSize = {
w: e.width,
h: e.height
}, this.$preview.css({
width: this.previewSize.w,
height: this.previewSize.h
}), this.options.imageBackground && this.$imageBgContainer.css({
width: this.previewSize.w + this.imageBgBorderWidthArray[1] + this.imageBgBorderWidthArray[3],
height: this.previewSize.h + this.imageBgBorderWidthArray[0] + this.imageBgBorderWidthArray[2]
}), this.imageLoaded ? this.setupZoomer() : void 0) : void 0
}, n.prototype.disable = function() {
return this.unbindListeners(), this.disableZoomSlider(), this.$el.addClass("cropit-disabled")
}, n.prototype.reenable = function() {
return this.bindListeners(), this.enableZoomSlider(), this.$el.removeClass("cropit-disabled")
}, n.prototype.round = function(e) {
return Math.round(1e5 * e) / 1e5
}, n.prototype.$ = function(e) {
return this.$el ? this.$el.find(e) : null
}, n
}();
var i, r;
i = "cropit", r = {
init: function(t) {
return this.each(function() {
var r;
return e.data(this, i) ? void 0 : (r = new n(this, t), e.data(this, i, r))
})
},
destroy: function() {
return this.each(function() {
return e.removeData(this, i)
})
},
isZoomable: function() {
var e;
return e = this.first().data(i), null != e ? e.isZoomable() : void 0
},
"export": function(e) {
var t;
return t = this.first().data(i), null != t ? t.getCroppedImageData(e) : void 0
},
imageState: function() {
var e;
return e = this.first().data(i), null != e ? e.getImageState() : void 0
},
imageSrc: function(t) {
var n;
return null != t ? this.each(function() {
var n;
return n = e.data(this, i), null != n && n.reset(), null != n ? n.loadImage(t) : void 0
}) : (n = this.first().data(i), null != n ? n.getImageSrc() : void 0)
},
offset: function(t) {
var n;
return null != t && null != t.x && null != t.y ? this.each(function() {
var n;
return n = e.data(this, i), null != n ? n.setOffset(t) : void 0
}) : (n = this.first().data(i), null != n ? n.getOffset() : void 0)
},
zoom: function(t) {
var n;
return null != t ? this.each(function() {
var n;
return n = e.data(this, i), null != n ? n.setZoom(t) : void 0
}) : (n = this.first().data(i), null != n ? n.getZoom() : void 0)
},
imageSize: function() {
var e;
return e = this.first().data(i), null != e ? e.getImageSize() : void 0
},
previewSize: function(t) {
var n;
return null != t ? this.each(function() {
var n;
return n = e.data(this, i), null != n ? n.setPreviewSize(t) : void 0
}) : (n = this.first().data(i), null != n ? n.getPreviewSize() : void 0)
},
disable: function() {
return this.each(function() {
var t;
return t = e.data(this, i), t.disable()
})
},
reenable: function() {
return this.each(function() {
var t;
return t = e.data(this, i), t.reenable()
})
}
}, e.fn.cropit = function(e) {
return r[e] ? r[e].apply(this, [].slice.call(arguments, 1)) : r.init.apply(this, arguments)
}
}(window.jQuery),
function() {
di.app.module("MemberApp.Views", function(e, t, n, i, r, o) {
var a, s, l;
return a = ";base64,", l = {
"default": {
"class": ""
},
submitting: {
avatar: {
"class": "submitting",
message: "Updating your Avatar Info..."
},
profile: {
"class": "submitting",
message: "Updating your Profile Info..."
}
},
success: {
avatar: {
"class": "success",
message: '<i class="icon-check-circle"></i> Your Avatar has been successfully updated.'
},
profile: {
"class": "success",
message: '<i class="icon-check-circle"></i> Your Profile Information has been successfully updated.'
}
}
}, s = null, e.Profile = e.BaseMemberView.extend({
id: "member-profile",
template: "di/ui/member/profile",
ui: {
memberAvatar: ".member-avatar",
memberAvatarImg: ".member-avatar-img",
memberAvatarTools: ".member-avatar-tools",
avatarEditControls: ".member-avatar-edit-controls",
avatarUploadControls: ".member-avatar-upload-controls",
uploadImgIE: ".upload-img-ie",
saveAvatarIE: ".save-avatar-ie",
saveAvatar: ".member-avatar-save",
removeAvatar: ".remove-avatar",
avatarFileInputIE: ".member-avatar-file-input-ie",
avatarFileInput: ".member-avatar-file-input",
avatarBase64Input: ".member-avatar-base64-input",
memberAvatarForm: "form.member_avatar",
editProfileForm: "form.edit_member",
statusMsg: "#status-msg",
gigyaErrors: ".gigya-errors"
},
events: {
"click @ui.uploadImgIE": "showInputField",
"click @ui.saveAvatar": "saveAvatar",
"click @ui.removeAvatar": "removeAvatar",
"change @ui.avatarFileInputIE": "showSaveButton",
"click @ui.saveAvatarIE": "saveAvatarIE",
"ajax:error @ui.memberAvatarForm": "ajaxErrorAvatar",
"ajax:success @ui.memberAvatarForm": "ajaxSuccessAvatar",
"ajax:beforeSend @ui.editProfileForm": "ajaxSendingProfile",
"ajax:error @ui.editProfileForm": "ajaxErrorProfile",
"ajax:success @ui.editProfileForm": "ajaxSuccessProfile",
"ajax:complete @ui.editProfileForm": "ajaxCompleteProfile"
},
modelEvents: {
change: "render"
},
templateHelpers: {
avatar: function() {
var e;
return e = location.protocol + "//" + location.host + this.default_avatar_url, this.avatar_url || "http://www.gravatar.com/avatar/" + this.email_md5 + "?s=100&d=" + encodeURIComponent(e)
},
isOldIE: function() {
return r("html").hasClass("lt-ie10")
}
},
behaviors: {
ParsleyValidation: {}
},
initialize: function() {
return this.listenTo(this, "render", o.bind(this.checkAvatar, this)), r(document).on("social.Auth.error.member-profile", o.bind(this.socialAuthError, this))
},
onRender: function() {
return this.setAvatarFormURL(), this.ui.avatarEditControls.hide(), this.ui.memberAvatarTools.cropit({
height: 100,
width: 100,
onImageLoaded: function(e) {
return function() {
return e.ui.memberAvatarImg.hide(), e.ui.avatarEditControls.show(), e.ui.avatarUploadControls.hide()
}
}(this)
})
},
checkAvatar: function() {
var e;
if (Modernizr.backgroundsize) return e = this.ui.memberAvatarImg[0], this.ui.memberAvatarImg.hide(), e.complete || 0 !== e.naturalWidth ? this.showAvatar() : this.ui.memberAvatarImg.on("load", function(e) {
return function() {
return e.showAvatar()
}
}(this))
},
showAvatar: function() {
return this.ui.memberAvatar.css({
"background-image": 'url("' + this.ui.memberAvatarImg.attr("src") + '")'
})
},
setAvatarFormURL: function() {
return this.ui.memberAvatarForm.attr("action", t.options.api.url + "members/" + this.model.get("id") + "/avatar")
},
showInputField: function() {
return this.ui.uploadImgIE.addClass("show-input-field")
},
showSaveButton: function() {
return this.ui.saveAvatarIE.removeClass("hide")
},
saveAvatarIE: function() {
var e, t;
return this.ui.memberAvatarForm.find('input[name="_method"]').val("post"), this.ui.memberAvatarForm.attr("action", this._avatarApiURL()), this.ui.memberAvatarForm.attr("enctype", "multipart/form-data"), this.ui.memberAvatarForm.attr("target", "avatar-upload-frame"), t = this.ui.memberAvatarForm.find('iframe[name="avatar-upload-frame"]'), e = setInterval(function(n) {
return function() {
var i;
return i = t[0].contentWindow.location.href, /member\/avatar\/result/.test(i) ? (clearInterval(e), n.updateAvatarIE(i)) : void 0
}
}(this), 100), this.setState("submitting.avatar", this.ui.memberAvatarForm), this.ui.memberAvatarForm.submit()
},
updateAvatarIE: function(e) {
var t, n, i;
return i = e.match(/json\=(.*?)$/)[1], t = decodeURIComponent(i), n = JSON.parse(t), this.model.set("avatar_url", n.url), this.model.trigger("change")
},
saveAvatar: function(e) {
var t, n, i;
return e.preventDefault(), t = this.ui.memberAvatarTools.cropit("export", {
type: "image/jpeg",
quality: 1
}), n = this._convertBase64toBlob(t), i = new FormData, i.append("image", n), r.ajax(this._avatarApiURL(), {
data: i,
cache: !1,
contentType: !1,
processData: !1,
type: "POST",
beforeSend: o.bind(this.ajaxSendingAvatar, this),
success: o.bind(this.ajaxSuccessAvatar, this),
error: o.bind(this.ajaxErrorAvatar, this)
})
},
_convertBase64toBlob: function(e) {
var t, n, i, r, o, a, s, l, u, c, d;
for (l = e.match(/^data:(.*?);base64/)[1], d = 512, t = e.match(/;base64,(.*?)$/)[1], u = 0, o = window.atob(t), r = []; u < o.length;) {
for (c = o.slice(u, u + d), a = new Array(c.length), s = 0; s < c.length;) a[s] = c.charCodeAt(s), s++;
i = new Uint8Array(a), r.push(i), u += d
}
return n = new Blob(r, {
type: l
})
},
_avatarApiURL: function() {
return t.options.api.url + "/members/" + this.model.get("id") + "/avatar?api_key=" + this.model.get("api_key")
},
removeAvatar: function() {
return r.ajax(this._avatarApiURL(), {
type: "delete",
data: {
image: {
"delete": 1
}
},
beforeSend: o.bind(this.ajaxSendingAvatar, this),
success: o.bind(this.ajaxSuccessAvatar, this),
error: o.bind(this.ajaxErrorAvatar, this)
})
},
ajaxSendingAvatar: function() {
return this.setState("submitting.avatar", this.ui.memberAvatarForm)
},
ajaxErrorAvatar: function() {
return this.setState("default", this.ui.memberAvatarForm)
},
ajaxSuccessAvatar: function(e) {
return this.setState("success.avatar", this.ui.memberAvatarForm), this.model.set(e, {
silent: !0
}), o.delay(function(e) {
return function() {
return e.model.trigger("change")
}
}(this), 2e3)
},
ajaxSendingProfile: function(e, t) {
return this.ui.editProfileForm.trigger("validate"), this.ui.editProfileForm[0].validator.isValid() ? this.setState("submitting.profile", this.ui.editProfileForm) : t.abort()
},
ajaxErrorProfile: function() {
return this.setState("default", this.ui.editProfileForm)
},
ajaxSuccessProfile: function(e, n) {
var i;
return null != n.verify_action ? (t.commands.execute("modal:verifyAction"), i = t.Modals.currentView, i.on("verified", function(e) {
return function(t) {
return null != t.errors ? e.displayProfileErrors(t.errors) : e.displaySuccess(), i.destroy()
}
}(this)), i.on("cancelled", function(e) {
return function() {
return e.setState("default", e.ui.editProfileForm)
}
}(this))) : (console.info(n), null != n.errors ? this.displayProfileErrors(n.errors) : this.displaySuccess())
},
displayProfileErrors: function(e) {
var t, n, i, r, o, a, s;
this.setState("default", this.ui.editProfileForm), this.removeProfileErrors(), s = [];
for (o in e) r = e[o], n = this.ui.editProfileForm.find('[name="member[' + o + ']"]').closest(".field-group"), t = n.find(".parsley-errors-list"), t.empty(), t.addClass("filled"), a = o.charAt(0).toUpperCase() + o.slice(1), s.push(function() {
var e, n, o;
for (o = [], e = 0, n = r.length; n > e; e++) i = r[e], o.push(t.append("<li>" + a + " " + i + "</li>"));
return o
}());
return s
},
removeProfileErrors: function() {
return this.ui.editProfileForm.find(".parsley-errors-list.filled").each(function(e, t) {
return r(t).removeClass("filled").empty()
})
},
displaySuccess: function() {
return this.setState("success.profile", this.ui.editProfileForm), this.removeProfileErrors(), o.delay(function(e) {
return function() {
return e.$el.find('[type="password"]').val(""), e.setState("default", e.ui.editProfileForm)
}
}(this), 3e3)
},
ajaxCompleteProfile: function() {},
socialAuthError: function(e, t, n) {
return this.ui.gigyaErrors.empty(), this.ui.gigyaErrors.append('<li class="error">' + n + "</li>"), this.ui.gigyaErrors.addClass("filled")
},
setState: function(e, t) {
var n, i, r, o;
return null == t && (t = this.$el), e.indexOf(".") > -1 && (o = e.split("."), e = o[0], r = o[1]), n = t.find("#status-msg"), i = l[e], null != r && (i = i[r]), t.attr("data-state", e), null != i.message && n.html("<p>" + i.message + "</p>"), n.attr("class", i["class"])
},
onBeforeDestroy: function() {
return r(document).off("social.Auth.error.member-profile"), this.ui.memberAvatarTools.cropit("disable")
}
})
})
}.call(this),
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.provide("di.model.CurrencySymbols"), di.model.CurrencySymbols = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
return t(n, e), n.prototype.defaults = {
AED: {
symbol: "AED",
symbol_native: "\u062f.\u0625.\u200f",
decimal_digits: 2,
rounding: 0,
code: "AED"
},
AFN: {
symbol: "AFN",
symbol_native: "\u060b",
decimal_digits: 0,
rounding: 0,
code: "AFN"
},
ALL: {
symbol: "ALL",
symbol_native: "Lek",
decimal_digits: 0,
rounding: 0,
code: "ALL"
},
AMD: {
symbol: "AMD",
symbol_native: "\u0564\u0580.",
decimal_digits: 0,
rounding: 0,
code: "AMD"
},
AOA: {
symbol: "AOA",
symbol_native: "Kz",
decimal_digits: 2,
rounding: 0,
code: "AOA"
},
ARS: {
symbol: "ARS",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "ARS"
},
AUD: {
symbol: "AU$",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "AUD"
},
AWG: {
symbol: "AWG",
symbol_native: "Afl.",
decimal_digits: 2,
rounding: 0,
code: "AWG"
},
AZN: {
symbol: "AZN",
symbol_native: "\u043c\u0430\u043d.",
decimal_digits: 2,
rounding: 0,
code: "AZN"
},
BAM: {
symbol: "BAM",
symbol_native: "KM",
decimal_digits: 2,
rounding: 0,
code: "BAM"
},
BBD: {
symbol: "BBD",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "BBD"
},
BDT: {
symbol: "BDT",
symbol_native: "\u09f3",
decimal_digits: 2,
rounding: 0,
code: "BDT"
},
BGN: {
symbol: "BGN",
symbol_native: "\u043b\u0432.",
decimal_digits: 2,
rounding: 0,
code: "BGN"
},
BHD: {
symbol: "BHD",
symbol_native: "\u062f.\u0628.\u200f",
decimal_digits: 3,
rounding: 0,
code: "BHD"
},
BIF: {
symbol: "BIF",
symbol_native: "FBu",
decimal_digits: 0,
rounding: 0,
code: "BIF"
},
BMD: {
symbol: "BMD",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "BMD"
},
BND: {
symbol: "BND",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "BND"
},
BOB: {
symbol: "BOB",
symbol_native: "Bs",
decimal_digits: 2,
rounding: 0,
code: "BOB"
},
BRL: {
symbol: "R$",
symbol_native: "R$",
decimal_digits: 2,
rounding: 0,
code: "BRL"
},
BWP: {
symbol: "BWP",
symbol_native: "P",
decimal_digits: 2,
rounding: 0,
code: "BWP"
},
BYR: {
symbol: "BYR",
symbol_native: "BYR",
decimal_digits: 0,
rounding: 0,
code: "BYR"
},
BZD: {
symbol: "BZD",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "BZD"
},
CAD: {
symbol: "CA$",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "CAD"
},
CDF: {
symbol: "CDF",
symbol_native: "FrCD",
decimal_digits: 2,
rounding: 0,
code: "CDF"
},
CHF: {
symbol: "CHF",
symbol_native: "CHF",
decimal_digits: 2,
rounding: .05,
code: "CHF"
},
CLP: {
symbol: "CLP",
symbol_native: "$",
decimal_digits: 0,
rounding: 0,
code: "CLP"
},
CNY: {
symbol: "CN\xa5",
symbol_native: "CN\xa5",
decimal_digits: 2,
rounding: 0,
code: "CNY"
},
COP: {
symbol: "COP",
symbol_native: "$",
decimal_digits: 0,
rounding: 0,
code: "COP"
},
CRC: {
symbol: "CRC",
symbol_native: "\u20a1",
decimal_digits: 0,
rounding: 0,
code: "CRC"
},
CVE: {
symbol: "CVE",
symbol_native: "CVE",
decimal_digits: 2,
rounding: 0,
code: "CVE"
},
CZK: {
symbol: "CZK",
symbol_native: "K\u010d",
decimal_digits: 2,
rounding: 0,
code: "CZK"
},
DJF: {
symbol: "DJF",
symbol_native: "Fdj",
decimal_digits: 0,
rounding: 0,
code: "DJF"
},
DKK: {
symbol: "DKK",
symbol_native: "kr",
decimal_digits: 2,
rounding: 0,
code: "DKK"
},
DOP: {
symbol: "DOP",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "DOP"
},
DZD: {
symbol: "DZD",
symbol_native: "\u062f.\u062c.\u200f",
decimal_digits: 2,
rounding: 0,
code: "DZD"
},
EGP: {
symbol: "EGP",
symbol_native: "\u062c.\u0645.\u200f",
decimal_digits: 2,
rounding: 0,
code: "EGP"
},
ERN: {
symbol: "ERN",
symbol_native: "Nfk",
decimal_digits: 2,
rounding: 0,
code: "ERN"
},
ETB: {
symbol: "ETB",
symbol_native: "\u1265\u122d",
decimal_digits: 2,
rounding: 0,
code: "ETB"
},
EUR: {
symbol: "\u20ac",
symbol_native: "\u20ac",
decimal_digits: 2,
rounding: 0,
code: "EUR"
},
GBP: {
symbol: "\xa3",
symbol_native: "\xa3",
decimal_digits: 2,
rounding: 0,
code: "GBP"
},
GEL: {
symbol: "GEL",
symbol_native: "GEL",
decimal_digits: 2,
rounding: 0,
code: "GEL"
},
GHS: {
symbol: "GHS",
symbol_native: "GHS",
decimal_digits: 2,
rounding: 0,
code: "GHS"
},
GNF: {
symbol: "GNF",
symbol_native: "FG",
decimal_digits: 0,
rounding: 0,
code: "GNF"
},
GTQ: {
symbol: "GTQ",
symbol_native: "Q",
decimal_digits: 2,
rounding: 0,
code: "GTQ"
},
GYD: {
symbol: "GYD",
symbol_native: "GYD",
decimal_digits: 0,
rounding: 0,
code: "GYD"
},
HKD: {
symbol: "HK$",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "HKD"
},
HNL: {
symbol: "HNL",
symbol_native: "L",
decimal_digits: 2,
rounding: 0,
code: "HNL"
},
HRK: {
symbol: "HRK",
symbol_native: "kn",
decimal_digits: 2,
rounding: 0,
code: "HRK"
},
HUF: {
symbol: "HUF",
symbol_native: "Ft",
decimal_digits: 0,
rounding: 0,
code: "HUF"
},
IDR: {
symbol: "IDR",
symbol_native: "Rp",
decimal_digits: 0,
rounding: 0,
code: "IDR"
},
ILS: {
symbol: "\u20aa",
symbol_native: "\u20aa",
decimal_digits: 2,
rounding: 0,
code: "ILS"
},
INR: {
symbol: "\u20b9",
symbol_native: "\u20b9",
decimal_digits: 2,
rounding: 0,
code: "INR"
},
IQD: {
symbol: "IQD",
symbol_native: "\u062f.\u0639.\u200f",
decimal_digits: 0,
rounding: 0,
code: "IQD"
},
IRR: {
symbol: "IRR",
symbol_native: "\ufdfc",
decimal_digits: 0,
rounding: 0,
code: "IRR"
},
ISK: {
symbol: "ISK",
symbol_native: "kr",
decimal_digits: 0,
rounding: 0,
code: "ISK"
},
JMD: {
symbol: "JMD",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "JMD"
},
JOD: {
symbol: "JOD",
symbol_native: "\u062f.\u0623.\u200f",
decimal_digits: 3,
rounding: 0,
code: "JOD"
},
JPY: {
symbol: "\xa5",
symbol_native: "\uffe5",
decimal_digits: 0,
rounding: 0,
code: "JPY"
},
KES: {
symbol: "KES",
symbol_native: "Ksh",
decimal_digits: 2,
rounding: 0,
code: "KES"
},
KHR: {
symbol: "KHR",
symbol_native: "\u17db",
decimal_digits: 2,
rounding: 0,
code: "KHR"
},
KMF: {
symbol: "KMF",
symbol_native: "CF",
decimal_digits: 0,
rounding: 0,
code: "KMF"
},
KRW: {
symbol: "\u20a9",
symbol_native: "\u20a9",
decimal_digits: 0,
rounding: 0,
code: "KRW"
},
KWD: {
symbol: "KWD",
symbol_native: "\u062f.\u0643.\u200f",
decimal_digits: 3,
rounding: 0,
code: "KWD"
},
KZT: {
symbol: "KZT",
symbol_native: "\u20b8",
decimal_digits: 2,
rounding: 0,
code: "KZT"
},
LBP: {
symbol: "LBP",
symbol_native: "\u0644.\u0644.\u200f",
decimal_digits: 0,
rounding: 0,
code: "LBP"
},
LKR: {
symbol: "LKR",
symbol_native: "\u0dbb\u0dd4.",
decimal_digits: 2,
rounding: 0,
code: "LKR"
},
LRD: {
symbol: "LRD",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "LRD"
},
LTL: {
symbol: "LTL",
symbol_native: "Lt",
decimal_digits: 2,
rounding: 0,
code: "LTL"
},
LVL: {
symbol: "LVL",
symbol_native: "Ls",
decimal_digits: 2,
rounding: 0,
code: "LVL"
},
LYD: {
symbol: "LYD",
symbol_native: "\u062f.\u0644.\u200f",
decimal_digits: 3,
rounding: 0,
code: "LYD"
},
MAD: {
symbol: "MAD",
symbol_native: "\u062f.\u0645.\u200f",
decimal_digits: 2,
rounding: 0,
code: "MAD"
},
MDL: {
symbol: "MDL",
symbol_native: "MDL",
decimal_digits: 2,
rounding: 0,
code: "MDL"
},
MGA: {
symbol: "MGA",
symbol_native: "MGA",
decimal_digits: 0,
rounding: 0,
code: "MGA"
},
MKD: {
symbol: "MKD",
symbol_native: "MKD",
decimal_digits: 2,
rounding: 0,
code: "MKD"
},
MMK: {
symbol: "MMK",
symbol_native: "K",
decimal_digits: 0,
rounding: 0,
code: "MMK"
},
MOP: {
symbol: "MOP",
symbol_native: "MOP",
decimal_digits: 2,
rounding: 0,
code: "MOP"
},
MUR: {
symbol: "MUR",
symbol_native: "MUR",
decimal_digits: 0,
rounding: 0,
code: "MUR"
},
MXN: {
symbol: "MX$",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "MXN"
},
MYR: {
symbol: "MYR",
symbol_native: "RM",
decimal_digits: 2,
rounding: 0,
code: "MYR"
},
MZN: {
symbol: "MZN",
symbol_native: "MTn",
decimal_digits: 2,
rounding: 0,
code: "MZN"
},
NAD: {
symbol: "NAD",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "NAD"
},
NGN: {
symbol: "NGN",
symbol_native: "\u20a6",
decimal_digits: 2,
rounding: 0,
code: "NGN"
},
NIO: {
symbol: "NIO",
symbol_native: "C$",
decimal_digits: 2,
rounding: 0,
code: "NIO"
},
NOK: {
symbol: "NOK",
symbol_native: "kr",
decimal_digits: 2,
rounding: 0,
code: "NOK"
},
NPR: {
symbol: "NPR",
symbol_native: "\u0928\u0947\u0930\u0942",
decimal_digits: 2,
rounding: 0,
code: "NPR"
},
NZD: {
symbol: "NZ$",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "NZD"
},
OMR: {
symbol: "OMR",
symbol_native: "\u0631.\u0639.\u200f",
decimal_digits: 3,
rounding: 0,
code: "OMR"
},
PAB: {
symbol: "PAB",
symbol_native: "B/.",
decimal_digits: 2,
rounding: 0,
code: "PAB"
},
PEN: {
symbol: "PEN",
symbol_native: "S/.",
decimal_digits: 2,
rounding: 0,
code: "PEN"
},
PHP: {
symbol: "PHP",
symbol_native: "\u20b1",
decimal_digits: 2,
rounding: 0,
code: "PHP"
},
PKR: {
symbol: "PKR",
symbol_native: "\u20a8",
decimal_digits: 0,
rounding: 0,
code: "PKR"
},
PLN: {
symbol: "PLN",
symbol_native: "z\u0142",
decimal_digits: 2,
rounding: 0,
code: "PLN"
},
PYG: {
symbol: "PYG",
symbol_native: "\u20b2",
decimal_digits: 0,
rounding: 0,
code: "PYG"
},
QAR: {
symbol: "QAR",
symbol_native: "\u0631.\u0642.\u200f",
decimal_digits: 2,
rounding: 0,
code: "QAR"
},
RON: {
symbol: "RON",
symbol_native: "RON",
decimal_digits: 2,
rounding: 0,
code: "RON"
},
RSD: {
symbol: "RSD",
symbol_native: "\u0434\u0438\u043d.",
decimal_digits: 0,
rounding: 0,
code: "RSD"
},
RUB: {
symbol: "RUB",
symbol_native: "\u0440\u0443\u0431.",
decimal_digits: 2,
rounding: 0,
code: "RUB"
},
RWF: {
symbol: "RWF",
symbol_native: "FR",
decimal_digits: 0,
rounding: 0,
code: "RWF"
},
SAR: {
symbol: "SAR",
symbol_native: "\u0631.\u0633.\u200f",
decimal_digits: 2,
rounding: 0,
code: "SAR"
},
SDG: {
symbol: "SDG",
symbol_native: "SDG",
decimal_digits: 2,
rounding: 0,
code: "SDG"
},
SEK: {
symbol: "SEK",
symbol_native: "kr",
decimal_digits: 2,
rounding: 0,
code: "SEK"
},
SGD: {
symbol: "SGD",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "SGD"
},
SOS: {
symbol: "SOS",
symbol_native: "SOS",
decimal_digits: 0,
rounding: 0,
code: "SOS"
},
STD: {
symbol: "STD",
symbol_native: "Db",
decimal_digits: 0,
rounding: 0,
code: "STD"
},
SYP: {
symbol: "SYP",
symbol_native: "\u0644.\u0633.\u200f",
decimal_digits: 0,
rounding: 0,
code: "SYP"
},
THB: {
symbol: "\u0e3f",
symbol_native: "\u0e3f",
decimal_digits: 2,
rounding: 0,
code: "THB"
},
TND: {
symbol: "TND",
symbol_native: "\u062f.\u062a.\u200f",
decimal_digits: 3,
rounding: 0,
code: "TND"
},
TOP: {
symbol: "TOP",
symbol_native: "T$",
decimal_digits: 2,
rounding: 0,
code: "TOP"
},
TRY: {
symbol: "TRY",
symbol_native: "TL",
decimal_digits: 2,
rounding: 0,
code: "TRY"
},
TTD: {
symbol: "TTD",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "TTD"
},
TWD: {
symbol: "NT$",
symbol_native: "NT$",
decimal_digits: 2,
rounding: 0,
code: "TWD"
},
TZS: {
symbol: "TZS",
symbol_native: "TSh",
decimal_digits: 0,
rounding: 0,
code: "TZS"
},
UAH: {
symbol: "UAH",
symbol_native: "\u20b4",
decimal_digits: 2,
rounding: 0,
code: "UAH"
},
UGX: {
symbol: "UGX",
symbol_native: "USh",
decimal_digits: 0,
rounding: 0,
code: "UGX"
},
USD: {
symbol: "$",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "USD"
},
UYU: {
symbol: "UYU",
symbol_native: "$",
decimal_digits: 2,
rounding: 0,
code: "UYU"
},
UZS: {
symbol: "UZS",
symbol_native: "UZS",
decimal_digits: 0,
rounding: 0,
code: "UZS"
},
VEF: {
symbol: "VEF",
symbol_native: "Bs.F.",
decimal_digits: 2,
rounding: 0,
code: "VEF"
},
VND: {
symbol: "\u20ab",
symbol_native: "\u20ab",
decimal_digits: 0,
rounding: 0,
code: "VND"
},
XAF: {
symbol: "FCFA",
symbol_native: "FCFA",
decimal_digits: 0,
rounding: 0,
code: "XAF"
},
XOF: {
symbol: "CFA",
symbol_native: "CFA",
decimal_digits: 0,
rounding: 0,
code: "XOF"
},
YER: {
symbol: "YER",
symbol_native: "\u0631.\u064a.\u200f",
decimal_digits: 0,
rounding: 0,
code: "YER"
},
ZAR: {
symbol: "ZAR",
symbol_native: "R",
decimal_digits: 2,
rounding: 0,
code: "ZAR"
},
ZMK: {
symbol: "ZMK",
symbol_native: "ZK",
decimal_digits: 0,
rounding: 0,
code: "ZMK"
}
}, n
}(Backbone.Model)
}.call(this),
function() {
di.app.module("MemberApp.Views", function(e, t, n, i, r, o) {
var a;
return a = new di.model.CurrencySymbols, e.Subscription = i.LayoutView.extend({
id: "member-subscription",
template: "di/ui/member/subscription",
ui: {
editSubscription: ".edit-subscription",
editTerm: ".edit-term",
termInstruction: ".term.instruction",
upadatePaymentInfo: ".update-payment-info",
paymentInfo: ".payment-info",
removePaymentMethod: ".remove-payment-method"
},
regions: {
editSubscriptionForm: ".edit-subscription-form-region",
editTermForm: ".edit-term-form-region",
paymentMethodForm: ".billing-form-region",
removePaymentMethodForm: ".remove-payment-method-form-region"
},
events: {
"click @ui.editSubscription": "showEditSubscriptionForm",
"click @ui.editTerm": "showEditTermForm",
"click @ui.upadatePaymentInfo": "showPaymentMethodForm",
"click @ui.removePaymentMethod": "showRemovePaymentMethodForm"
},
modelEvents: {
change: "render"
},
templateHelpers: {
activeSubscription: function() {
var e;
return e = o.find(this.subscriptions, function(e) {
return e["active?"]
}), null != e ? e : {}
},
isPremium: function() {
var e;
return e = this.activeSubscription(), null == e.id && (e = this.expiredSubscription()), null == e.id ? !1 : !0
},
isTrial: function() {
var e, t;
return e = this.activeSubscription(), null == e.id ? !1 : (t = di.model.Subscription.find(e.id), t.isTrial())
},
expiredSubscription: function() {
var e, t;
return t = o.sortBy(this.subscriptions, function(e) {
return moment(e.expires_on)
}), null != this.activeSubscription().id ? !1 : t.length ? (e = o.find(t, function(e) {
var t;
return null == (null != e && null != (t = e.plan) ? t.trial_duration_days : void 0)
}), null == e && (e = !1), e) : !1
},
expiredDate: function() {
var e;
return e = this.expiredSubscription(), moment(e.expires_on).format("MMMM D, YYYY")
},
hasPaymentMethod: function() {
var e, t, n;
return null != (null != (e = this.payment_method) ? e.id : void 0) && null != (null != (t = this.payment_method) && null != (n = t.payment_type) ? n.key : void 0)
},
canAutoRenew: function() {
return this.hasPaymentMethod() && !this.isTrial
},
showPaymentMethod: function() {
return this.hasPaymentMethod() ? !0 : null == this.activeSubscription().id || this.isTrial ? !1 : !0
},
trialLabel: function() {
var e;
return e = this.plan.trial_duration_days
},
titleize: function(e) {
var t, n, i, r, o;
for (i = e.split(" "), t = [], r = 0, o = i.length; o > r; r++) n = i[r], t.push(n.charAt(0).toUpperCase() + n.toLowerCase().slice(1));
return t.join(" ")
},
dateFormat: function(e, t) {
return moment(e).format(t)
},
currencySymbol: function() {
return null != a.get(subscription.currency) ? a.get(subscription.currency).symbol_native : "(USD) $"
},
planPrice: function() {
return (1 * this.activeSubscription().plan_price).toFixed(2)
},
daysLeft: function() {
var e, t, n;
return n = moment(), t = moment(this.activeSubscription().expires_on), e = t.diff(n, "days"), this.pluralize(e, "day")
},
subscriptionTerm: function() {
var e, t;
return e = this.activeSubscription(), t = e.term_unit, e.term_duration > 1 && (t = this.pluralize(e.term_duration, e.term_unit)), t
},
pluralize: function(e, t) {
return t = 1 === e ? t : t + "s", e + " " + t
}
},
showEditSubscriptionForm: function() {
var e, n, i;
return i = this.model.get("subscriptions").find(function(e) {
return e.get("active?")
}), n = this.getRegion("editSubscriptionForm"), e = t.request("billing:form", {
form: "EditSubscriptionForm",
model: i
}), this.listenTo(e, "submission:successful", function(e) {
return function(t) {
return i.set("auto_renew", t), o.delay(function() {
return e.model.trigger("change")
}, 2e3)
}
}(this)), n.show(e), this.listenToOnce(e, "close:form", function() {
return n.empty()
})
},
showEditTermForm: function() {
var e, n, i;
return i = this.model.get("subscriptions").find(function(e) {
return e.get("active?")
}), n = this.getRegion("editTermForm"), e = t.request("billing:form", {
form: "SubscriptionTermForm",
model: i
}), this.ui.editTerm.hide(), this.ui.termInstruction.hide(), this.listenToOnce(e, "destroy", function(e) {
return function() {
return e.ui.editTerm.show(), e.ui.termInstruction.show()
}
}(this)), this.listenToOnce(e, "submission:successful", function(e) {
return function(t) {
var r;
return r = di.model.Subscription.findOrCreate(t, {
parse: !0
}), i.set(r, {
silent: !0
}), o.delay(function() {
return n.empty(), e.model.trigger("change")
}, 2e3)
}
}(this)), n.show(e), this.listenToOnce(e, "close:form", function() {
return n.empty()
})
},
showPaymentMethodForm: function() {
var e, n;
return n = this.getRegion("paymentMethodForm"), e = t.request("billing:form", {
form: "PaymentMethodForm",
model: this.model.get("payment_method")
}), this.ui.paymentInfo.hide(), this.listenToOnce(e, "destroy", function(e) {
return function() {
return e.ui.paymentInfo.show()
}
}(this)), this.listenToOnce(e, "submission:successful", function(e) {
return function(t) {
return e.model.set("payment_method", t, {
parse: !0,
silent: !0
}), o.delay(function() {
return n.empty(), e.model.trigger("change")
}, 2e3)
}
}(this)), n.show(e), this.listenToOnce(e, "close:form", function() {
return n.empty()
})
},
showRemovePaymentMethodForm: function() {
var e, n;
return n = this.getRegion("removePaymentMethodForm"), e = t.request("billing:form", {
form: "RemovePaymentMethodForm"
}), this.ui.upadatePaymentInfo.hide(), this.listenToOnce(e, "destroy", function(e) {
return function() {
return e.ui.upadatePaymentInfo.show()
}
}(this)), this.listenToOnce(e, "submission:successful", function(e) {
return function() {
return e.model.set("payment_method", {}, {
parse: !0,
silent: !0
}), o.delay(function() {
return n.empty(), e.model.trigger("change")
}, 2e3)
}
}(this)), n.show(e), this.listenToOnce(e, "close:form", function() {
return n.empty()
})
}
})
})
}.call(this),
function() {}.call(this);
var swfobject = di.swfobject = function() {
function e() {
if (!W && document.getElementsByTagName("body")[0]) {
try {
var e, t = y("span");
t.style.display = "none", e = N.getElementsByTagName("body")[0].appendChild(t), e.parentNode.removeChild(e), e = null, t = null
} catch (n) {
return
}
W = !0;
for (var i = j.length, r = 0; i > r; r++) j[r]()
}
}
function t(e) {
W ? e() : j[j.length] = e
}
function n(e) {
if (typeof B.addEventListener !== E) B.addEventListener("load", e, !1);
else if (typeof N.addEventListener !== E) N.addEventListener("load", e, !1);
else if (typeof B.attachEvent !== E) _(B, "onload", e);
else if ("function" == typeof B.onload) {
var t = B.onload;
B.onload = function() {
t(), e()
}
} else B.onload = e
}
function i() {
var e = N.getElementsByTagName("body")[0],
t = y(I);
t.setAttribute("style", "visibility: hidden;"), t.setAttribute("type", R);
var n = e.appendChild(t);
if (n) {
var i = 0;
! function o() {
if (typeof n.GetVariable !== E) try {
var a = n.GetVariable("$version");
a && (a = a.split(" ")[1].split(","), G.pv = [v(a[0]), v(a[1]), v(a[2])])
} catch (s) {
G.pv = [8, 0, 0]
} else if (10 > i) return i++, void setTimeout(o, 10);
e.removeChild(t), n = null, r()
}()
} else r()
}
function r() {
var e = H.length;
if (e > 0)
for (var t = 0; e > t; t++) {
var n = H[t].id,
i = H[t].callbackFn,
r = {
success: !1,
id: n
};
if (G.pv[0] > 0) {
var u = g(n);
if (u)
if (!b(H[t].swfVersion) || G.wk && G.wk < 312)
if (H[t].expressInstall && a()) {
var c = {};
c.data = H[t].expressInstall, c.width = u.getAttribute("width") || "0", c.height = u.getAttribute("height") || "0", u.getAttribute("class") && (c.styleclass = u.getAttribute("class")), u.getAttribute("align") && (c.align = u.getAttribute("align"));
for (var d = {}, h = u.getElementsByTagName("param"), p = h.length, f = 0; p > f; f++) "movie" !== h[f].getAttribute("name").toLowerCase() && (d[h[f].getAttribute("name")] = h[f].getAttribute("value"));
s(c, d, n, i)
} else l(u), i && i(r);
else x(n, !0), i && (r.success = !0, r.ref = o(n), r.id = n, i(r))
} else if (x(n, !0), i) {
var m = o(n);
m && typeof m.SetVariable !== E && (r.success = !0, r.ref = m, r.id = m.id), i(r)
}
}
}
function o(e) {
var t = null,
n = g(e);
return n && "OBJECT" === n.nodeName.toUpperCase() && (t = typeof n.SetVariable !== E ? n : n.getElementsByTagName(I)[0] || n), t
}
function a() {
return !q && b("6.0.65") && (G.win || G.mac) && !(G.wk && G.wk < 312)
}
function s(e, t, n, i) {
var r = g(n);
if (n = m(n), q = !0, S = i || null, T = {
success: !1,
id: n
}, r) {
"OBJECT" === r.nodeName.toUpperCase() ? (C = u(r), A = null) : (C = r, A = n), e.id = D, (typeof e.width === E || !/%$/.test(e.width) && v(e.width) < 310) && (e.width = "310"), (typeof e.height === E || !/%$/.test(e.height) && v(e.height) < 137) && (e.height = "137");
var o = G.ie ? "ActiveX" : "PlugIn",
a = "MMredirectURL=" + encodeURIComponent(B.location.toString().replace(/&/g, "%26")) + "&MMplayerType=" + o + "&MMdoctitle=" + encodeURIComponent(N.title.slice(0, 47) + " - Flash Player Installation");
if (typeof t.flashvars !== E ? t.flashvars += "&" + a : t.flashvars = a, G.ie && 4 != r.readyState) {
var s = y("div");
n += "SWFObjectNew", s.setAttribute("id", n), r.parentNode.insertBefore(s, r), r.style.display = "none", p(r)
}
d(e, t, n)
}
}
function l(e) {
if (G.ie && 4 != e.readyState) {
e.style.display = "none";
var t = y("div");
e.parentNode.insertBefore(t, e), t.parentNode.replaceChild(u(e), t), p(e)
} else e.parentNode.replaceChild(u(e), e)
}
function u(e) {
var t = y("div");
if (G.win && G.ie) t.innerHTML = e.innerHTML;
else {
var n = e.getElementsByTagName(I)[0];
if (n) {
var i = n.childNodes;
if (i)
for (var r = i.length, o = 0; r > o; o++) 1 == i[o].nodeType && "PARAM" === i[o].nodeName || 8 == i[o].nodeType || t.appendChild(i[o].cloneNode(!0))
}
}
return t
}
function c(e, t) {
var n = y("div");
return n.innerHTML = "<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'><param name='movie' value='" + e + "'>" + t + "</object>", n.firstChild
}
function d(e, t, n) {
var i, r = g(n);
if (n = m(n), G.wk && G.wk < 312) return i;
if (r) {
var o, a, s, l = y(G.ie ? "div" : I);
typeof e.id === E && (e.id = n);
for (s in t) t.hasOwnProperty(s) && "movie" !== s.toLowerCase() && h(l, s, t[s]);
G.ie && (l = c(e.data, l.innerHTML));
for (o in e) e.hasOwnProperty(o) && (a = o.toLowerCase(), "styleclass" === a ? l.setAttribute("class", e[o]) : "classid" !== a && "data" !== a && l.setAttribute(o, e[o]));
G.ie ? z[z.length] = e.id : (l.setAttribute("type", R), l.setAttribute("data", e.data)), r.parentNode.replaceChild(l, r), i = l
}
return i
}
function h(e, t, n) {
var i = y("param");
i.setAttribute("name", t), i.setAttribute("value", n), e.appendChild(i)
}
function p(e) {
var t = g(e);
t && "OBJECT" === t.nodeName.toUpperCase() && (G.ie ? (t.style.display = "none", function n() {
if (4 == t.readyState) {
for (var e in t) "function" == typeof t[e] && (t[e] = null);
t.parentNode.removeChild(t)
} else setTimeout(n, 10)
}()) : t.parentNode.removeChild(t))
}
function f(e) {
return e && e.nodeType && 1 === e.nodeType
}
function m(e) {
return f(e) ? e.id : e
}
function g(e) {
if (f(e)) return e;
var t = null;
try {
t = N.getElementById(e)
} catch (n) {}
return t
}
function y(e) {
return N.createElement(e)
}
function v(e) {
return parseInt(e, 10)
}
function _(e, t, n) {
e.attachEvent(t, n), U[U.length] = [e, t, n]
}
function b(e) {
e += "";
var t = G.pv,
n = e.split(".");
return n[0] = v(n[0]), n[1] = v(n[1]) || 0, n[2] = v(n[2]) || 0, t[0] > n[0] || t[0] == n[0] && t[1] > n[1] || t[0] == n[0] && t[1] == n[1] && t[2] >= n[2] ? !0 : !1
}
function w(e, t, n, i) {
var r = N.getElementsByTagName("head")[0];
if (r) {
var o = "string" == typeof n ? n : "screen";
if (i && (P = null, M = null), !P || M != o) {
var a = y("style");
a.setAttribute("type", "text/css"), a.setAttribute("media", o), P = r.appendChild(a), G.ie && typeof N.styleSheets !== E && N.styleSheets.length > 0 && (P = N.styleSheets[N.styleSheets.length - 1]), M = o
}
P && (typeof P.addRule !== E ? P.addRule(e, t) : typeof N.createTextNode !== E && P.appendChild(N.createTextNode(e + " {" + t + "}")))
}
}
function x(e, t) {
if (Y) {
var n = t ? "visible" : "hidden",
i = g(e);
W && i ? i.style.visibility = n : "string" == typeof e && w("#" + e, "visibility:" + n)
}
}
function k(e) {
var t = /[\\\"<>\.;]/,
n = null !== t.exec(e);
return n && typeof encodeURIComponent !== E ? encodeURIComponent(e) : e
} {
var C, A, S, T, P, M, E = "undefined",
I = "object",
F = "Shockwave Flash",
O = "ShockwaveFlash.ShockwaveFlash",
R = "application/x-shockwave-flash",
D = "SWFObjectExprInst",
L = "onreadystatechange",
B = window,
N = document,
$ = navigator,
V = !1,
j = [],
H = [],
z = [],
U = [],
W = !1,
q = !1,
Y = !0,
K = !1,
G = function() {
var e = typeof N.getElementById !== E && typeof N.getElementsByTagName !== E && typeof N.createElement !== E,
t = $.userAgent.toLowerCase(),
n = $.platform.toLowerCase(),
i = /win/.test(n ? n : t),
r = /mac/.test(n ? n : t),
o = /webkit/.test(t) ? parseFloat(t.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : !1,
a = "Microsoft Internet Explorer" === $.appName,
s = [0, 0, 0],
l = null;
if (typeof $.plugins !== E && typeof $.plugins[F] === I) l = $.plugins[F].description, l && typeof $.mimeTypes !== E && $.mimeTypes[R] && $.mimeTypes[R].enabledPlugin && (V = !0, a = !1, l = l.replace(/^.*\s+(\S+\s+\S+$)/, "$1"), s[0] = v(l.replace(/^(.*)\..*$/, "$1")), s[1] = v(l.replace(/^.*\.(.*)\s.*$/, "$1")), s[2] = /[a-zA-Z]/.test(l) ? v(l.replace(/^.*[a-zA-Z]+(.*)$/, "$1")) : 0);
else if (typeof B.ActiveXObject !== E) try {
var u = new ActiveXObject(O);
u && (l = u.GetVariable("$version"), l && (a = !0, l = l.split(" ")[1].split(","), s = [v(l[0]), v(l[1]), v(l[2])]))
} catch (c) {}
return {
w3: e,
pv: s,
wk: o,
ie: a,
win: i,
mac: r
}
}();
! function() {
G.w3 && ((typeof N.readyState !== E && ("complete" === N.readyState || "interactive" === N.readyState) || typeof N.readyState === E && (N.getElementsByTagName("body")[0] || N.body)) && e(), W || (typeof N.addEventListener !== E && N.addEventListener("DOMContentLoaded", e, !1), G.ie && (N.attachEvent(L, function t() {
"complete" === N.readyState && (N.detachEvent(L, t), e())
}), B == top && ! function n() {
if (!W) {
try {
N.documentElement.doScroll("left")
} catch (t) {
return void setTimeout(n, 0)
}
e()
}
}()), G.wk && ! function i() {
return W ? void 0 : /loaded|complete/.test(N.readyState) ? void e() : void setTimeout(i, 0)
}()))
}()
}
j[0] = function() {
V ? i() : r()
};
! function() {
G.ie && window.attachEvent("onunload", function() {
for (var e = U.length, t = 0; e > t; t++) U[t][0].detachEvent(U[t][1], U[t][2]);
for (var n = z.length, i = 0; n > i; i++) p(z[i]);
for (var r in G) G[r] = null;
G = null;
for (var o in swfobject) swfobject[o] = null;
swfobject = null
})
}();
return {
registerObject: function(e, t, n, i) {
if (G.w3 && e && t) {
var r = {};
r.id = e, r.swfVersion = t, r.expressInstall = n, r.callbackFn = i, H[H.length] = r, x(e, !1)
} else i && i({
success: !1,
id: e
})
},
getObjectById: function(e) {
return G.w3 ? o(e) : void 0
},
embedSWF: function(e, n, i, r, o, l, u, c, h, p) {
var f = m(n),
g = {
success: !1,
id: f
};
G.w3 && !(G.wk && G.wk < 312) && e && n && i && r && o ? (x(f, !1), t(function() {
i += "", r += "";
var t = {};
if (h && typeof h === I)
for (var m in h) t[m] = h[m];
t.data = e, t.width = i, t.height = r;
var y = {};
if (c && typeof c === I)
for (var v in c) y[v] = c[v];
if (u && typeof u === I)
for (var _ in u)
if (u.hasOwnProperty(_)) {
var w = K ? encodeURIComponent(_) : _,
k = K ? encodeURIComponent(u[_]) : u[_];
typeof y.flashvars !== E ? y.flashvars += "&" + w + "=" + k : y.flashvars = w + "=" + k
}
if (b(o)) {
var C = d(t, y, n);
t.id == f && x(f, !0), g.success = !0, g.ref = C, g.id = C.id
} else {
if (l && a()) return t.data = l, void s(t, y, n, p);
x(f, !0)
}
p && p(g)
})) : p && p(g)
},
switchOffAutoHideShow: function() {
Y = !1
},
enableUriEncoding: function(e) {
K = typeof e === E ? !0 : e
},
ua: G,
getFlashPlayerVersion: function() {
return {
major: G.pv[0],
minor: G.pv[1],
release: G.pv[2]
}
},
hasFlashPlayerVersion: b,
createSWF: function(e, t, n) {
return G.w3 ? d(e, t, n) : void 0
},
showExpressInstall: function(e, t, n, i) {
G.w3 && a() && s(e, t, n, i)
},
removeSWF: function(e) {
G.w3 && p(e)
},
createCSS: function(e, t, n, i) {
G.w3 && w(e, t, n, i)
},
addDomLoadEvent: t,
addLoadEvent: n,
getQueryParamValue: function(e) {
var t = N.location.search || N.location.hash;
if (t) {
if (/\?/.test(t) && (t = t.split("?")[1]), !e) return k(t);
for (var n = t.split("&"), i = 0; i < n.length; i++)
if (n[i].substring(0, n[i].indexOf("=")) == e) return k(n[i].substring(n[i].indexOf("=") + 1))
}
return ""
},
expressInstallCallback: function() {
if (q) {
var e = g(D);
e && C && (e.parentNode.replaceChild(C, e), A && (x(A, !0), G.ie && (C.style.display = "block")), S && S(T)), q = !1
}
},
version: "2.3"
}
}();
NS("AudioAddict.API").Channels = function(e, t, n) {
if (!(this instanceof arguments.callee)) return $.log(LogPrefix() + "AudioAddict.API.Channels: Forcing instantiation"), new AudioAddict.API.Channels(e, t, n);
$.log(LogPrefix() + "AudioAddict.API.Channels: Instantiating", arguments);
var i, r = NS("AudioAddict.API"),
o = e + "/" + t + "/",
a = "channel_filters",
s = "jsonp",
l = n || {};
this.getTimeout = function() {
return "undefined" == typeof i && (i = l.timeout >= 100 ? i = 1e3 * i : r.Default.timeout), i
}, this.allUrl = function() {
return o + a + "/key/default." + s
}, this.channelFilterUrl = function(e) {
return o + a + "/key/" + e + "." + s
}, this.getAll = function(e, t) {
$.log(LogPrefix() + "AudioAddict.API.Channels.getAll(): Fetching all channels\u2026"), $.ajax({
url: this.allUrl(),
dataType: "jsonp",
jsonpCallback: "_API_Channels_getAll",
timeout: this.getTimeout(),
success: e,
error: t || function(e, t) {
"timeout" == t && $.log(LogPrefix() + "AudioAddict.API.Channels.getAll(): Timed out!", e, t)
}
})
}, this.getChannelFilter = function(e, t, n) {
$.log(LogPrefix() + "AudioAddict.API.Channels.getChannelFilter(): Fetching channels for filter {" + e + "}\u2026"), $.ajax({
url: this.channelFilterUrl(e),
dataType: "jsonp",
jsonpCallback: "_API_Channels_getChannelFilter",
timeout: this.getTimeout(),
success: t,
error: n || function(e, t) {
"timeout" == t && $.log(LogPrefix() + "AudioAddict.API.Channels.getChannelFilter(): Timed out!", e, t)
}
})
}
}, NS("AudioAddict.API.Channels").getChannelById = function(e) {
return this._channels = this._channels || _.pluck(AudioAddict.API.Config.channels, "channel"), this._keysById = this._keysById || {}, this._keysById[e] = this._keysById[e] || _.findWhere(this._channels, {
id: e
}), this._keysById[e]
}, NS("AudioAddict.API.Channels").getChannelByKey = function(e) {
return this._channels = this._channels || _.pluck(AudioAddict.API.Config.channels, "channel"), this._idsByKey = this._idsByKey || {}, this._idsByKey[e] = this._idsByKey[e] || _.findWhere(this._channels, {
key: e
}), this._idsByKey[e]
}, NS("AudioAddict.API").Playlists = function(e, t) {
if (!(this instanceof arguments.callee)) return $.log(LogPrefix() + "AudioAddict.API.Playlists: Forcing instantiation"), new AudioAddict.API.Playlists(e, t);
$.log(LogPrefix() + "AudioAddict.API.Playlists: Instantiating", arguments);
var n, i = NS("AudioAddict.API"),
r = e,
o = i.Config.listenKey,
a = t || {};
a.streamset || (a.streamset = "webplayer"), a.ext || (a.ext = "jsonp"), this.getTimeout = function() {
return "undefined" == typeof n && (n = a.timeout >= 100 ? n = 1e3 * n : i.Default.timeout), n
}, this.appendListenKey = function(e) {
return null !== o ? e + "?listen_key=" + o : e
}, this.allUrl = function() {
var e = r + "/" + a.streamset + "." + a.ext;
return this.appendListenKey(e)
}, this.channelUrl = function(e) {
var t = r + "/" + a.streamset + "/" + e + "." + a.ext;
return this.appendListenKey(t)
}, this.getAll = function(e, t) {
$.log(LogPrefix() + "AudioAddict.API.Playlists.getAll(): Fetching playlists for all channels\u2026"), $.ajax({
url: this.allUrl(),
dataType: "jsonp",
jsonpCallback: "_API_Playlists_getAll",
timeout: this.getTimeout(),
success: e,
error: t || function(e, t) {
"timeout" == t && $.log(LogPrefix() + "AudioAddict.API.Playlists.getAll(): Timed out!", e, t)
}
})
}, this.getChannel = function(e, t, n) {
$.log(LogPrefix() + "AudioAddict.API.Playlists.getChannel(): Fetching playlists for channel {" + e + "}\u2026"), $.ajax({
url: this.channelUrl(e),
dataType: "jsonp",
cache: !0,
jsonpCallback: "_API_Playlists_getChannel",
timeout: this.getTimeout(),
success: t,
error: n || function(e, t) {
"timeout" == t && $.log(LogPrefix() + "AudioAddict.API.Playlists.getChannel(): Timed out!", e, t)
}
})
}
}, window.Channel = Class.extend({
init: function(e) {
if ("undefined" == typeof e) throw "AudioAddict.WP.Channel: FATAL: No parameters provided";
if (!e.channels) throw "AudioAddict.WP.Channel: FATAL: channels not provided";
var t = this;
t.channels = e.channels, t.channelsByKey = {}, t.channelsById = {}, t.assetsByKey = {}, t.changedTs = null, $.each(t.channels, function() {
this.channel ? (t.channelsByKey[this.channel.key] = this.channel, t.channelsById[this.channel.id] = this.channel) : (t.channelsByKey[this.key] = this, t.channelsById[this.id] = this)
}), e.assets && $.each(e.assets.channel_assets, function() {
t.channelsByKey[this.key] && (t.channelsByKey[this.key].assets = this.assets[0])
}), $.log(LogPrefix() + "AudioAddict.WP.Channel: Initialized")
},
set: function(e, t) {
return !this.channelsByKey[e] || this.channel && this.channel.key === e ? ($(document).trigger("Channel.Set", {
id: t
}), !1) : (this.changedTs = getUnixTimestamp(), this.channel = this.channelsByKey[e], $.log(LogPrefix() + "AudioAddict.WP.Channel: Channel set to {" + e + "}", this.channel), $(document).trigger("Channel.Set", this.channel), di.eventbus.trigger("webplayer:channel:change", this.channel), this.channel)
},
get: function() {
return this.channel
},
getByKey: function(e) {
return this.channelsByKey[e]
},
getById: function(e) {
return this.channelsById[e]
},
getLastChangedTimestamp: function() {
return this.changedTs
}
}), di.provide("di.math.ExponentialBackoff"), di.math.ExponentialBackoff = function(e, t) {
if (1 > e) throw "Initial value must be greater than zero.";
if (e > t) throw "Max value must be be equal to or greater than the initial value.";
this.initialValue_ = e, this.maxValue_ = t, this.currValue_ = e
}, di.math.ExponentialBackoff.prototype.currCount_ = 0, di.math.ExponentialBackoff.prototype.reset = function() {
this.currValue_ = this.initialValue_, this.currCount_ = 0
}, di.math.ExponentialBackoff.prototype.getValue = function() {
return this.currValue_
}, di.math.ExponentialBackoff.prototype.getMaxValue = function() {
return this.maxValue_
}, di.math.ExponentialBackoff.prototype.getCount = function() {
return this.currCount_
}, di.math.ExponentialBackoff.prototype.backoff = function() {
this.currValue_ = Math.min(this.maxValue_, 2 * this.currValue_), this.currCount_++
},
function(e, t, n) {
function i(e) {
function t(e) {
return s ? e && e.type === s.type && e.track === s.track : !1
}
function i() {
var e = getUnixTimestamp(),
i = [];
n.each(o, function() {
this.started < e && !this.isJingle && !t(this) && (!this.ended || this.ended <= e + 25) ? i.push(this) : p.log("removing track from trackHistory: ", this)
}), o = i.slice(0, l)
}
function r() {
i(), p.log("sending metadata-history-update with tracks:", o), n(document).trigger("metadata-history-update", [o])
}
e = e || {};
var o = [],
a = null,
s = null,
l = e.maxHistory || 40;
this.load = function(e) {
o = e.slice(0), r()
}, this.trackStarted = function(e) {
s = e, a = getUnixTimestamp(), p.log("New now playing track: ", s), i()
}, this.trackComplete = function(e) {
var t = getUnixTimestamp();
return e.type === s.type && e.track === s.track && 5 > t - a ? void p.log("ad caused early track-complete event, ignoring:", e) : e.isJingle ? void p.log("Track too short, ignoring", e) : (o.unshift(e), void r())
}
}
function r(e, t) {
var i = {
started: getUnixTimestamp()
};
if (p.log("AudioAddict.WP.Metadata: Flash metadata received", t), t.audiosamplerate) p.log("Flash metadata is a premium track"), i = n.extend(i, {
type: "track",
track: t.title,
apiDependent: !0
});
else if (t.adw_ad) {
if (p.log("Flash metadata is an AdsWizz ad"), i = n.extend(i, {
type: "advertisement",
provider: "adswizz",
banner: !0,
track: S,
apiDependent: !1,
duration: parseInt(t.durationMilliseconds, 10)
}), "string" == typeof t.metadata) {
var r = t.metadata.indexOf("adswizzContext=");
i.context = -1 !== r ? t.metadata.slice(r + 15) : null
}
} else t.StreamTitle && t.StreamTitle.indexOf("TSTAG") > -1 || (t.StreamTitle ? (p.log("Flash metadata is a public track"), i = n.extend(i, {
type: "track",
track: t.StreamTitle,
apiDependent: !0
})) : (p.log("Flash metadata is unrecognised"), i = n.extend(i, {
type: "track",
track: "Track Information Unavailable",
apiDependent: !1,
accurate: !1
})));
return p.log("Flash metadata: {" + i.track + "}"), k && s(k, i) || C && s(C, i) ? (p.log("Flash metadata is duplicate of the current or previous track; ignoring {" + k.track + "}"), p.log("Resetting timecode for accuracy"), g.wp.timecode.reset(), !1) : (k = i, void(i.apiDependent ? o(i) : c(i)))
}
function o(e) {
var t = function() {
var n = a(e);
n ? (c(n), E.getCount() > 0 && di.analytics.trackNonInteractiveEvent("WP.Error", "api-dependent track resolved after retries", JSON.stringify({
retries: E.getCount(),
item: {
type: n.type,
id: n.track_id || n.id || n.track || n
}
}))) : (0 === E.getCount() && c(e), p.log("No match found in history. Retrying API (#" + (E.getCount() + 1) + ") in " + E.getValue() / 1e3 + "s"), p.resolverTimeoutId = setTimeout(function() {
h(t)
}, E.getValue()), E.backoff())
};
p.resolverTimeoutId && (clearTimeout(p.resolverTimeoutId), p.resolverTimeoutId = null), E.reset(), clearTimeout(b), b = null, v = y, h(t)
}
function a(e) {
var t = _.map(_.pluck(w, "track"), O),
n = O(F(e.track));
window._forceTrackHistoryNoMatch && (n += Math.random().toString());
var i = t ? t.indexOf(n) : -1,
r = w[i];
return r ? (p.log("Found match {" + n + "} amongst API results"), 0 === i && T && (p.log("Using existing local start time:", e.started), r.started = e.started, r.ended = r.started + r.length)) : p.log("ERROR: Could not find {" + n + "} amongst API metadata; using Flash metadata only"), r
}
function s(e, t) {
return "track" === e.type ? e.track === t.track : e.provider === t.provider && "adswizz" === e.provider ? !1 : e.track === t.track && e.provider === t.provider
}
function l() {
var e = I[g.wp.member.getAccess()][g.wp.streamlist.getCurrentBitrate()];
return "undefined" == typeof e ? 0 : e
}
function u(e) {
{
var t;
n.extend(!0, {}, e)
}
"advertisement" === e.type && (e.length = e.duration, e.url = null, e.banner = null, e.track = F(e.track), 0 === e.track.trim().length && (e.track = S), "undefined" == typeof e.provider && (e.provider = "internal"), "internal" === e.provider && (e.url = A, e.track.indexOf(" - ") > -1 && (t = e.track.split(" - "), e.track = t[0], e.url = t[1]), "object" == typeof e.ad && (e.ad.banner && e.ad.banner.length > 0 && (e.banner = e.ad.banner), e.ad.url && e.ad.url.length > 0 && (e.url = e.ad.url)))), e.isJingle = "track" == e.type && e.length > 0 && e.length < 30, e.timeDeterminate = !0, e.started ? e.started += l() : (e.started = getUnixTimestamp(), e.timeDeterminate = !1), e.length ? e.ended = e.started + e.length : (e.length = 0, e.ended = null, e.timeDeterminate = !1), e.normalized = !0
}
function c(e) {
if (T || (T = !0), p.log("Metadata parsed", e), x && (x = null), e.normalized || u(e), e.timeDeterminate && e.ended < getUnixTimestamp() && (p.log("end time for current track is in the past, time is indeterminate"), e.timeDeterminate = !1), "track" == e.type) {
if (g.wp.adManager && g.wp.adManager.isExternal()) return p.log("External ad is playing {" + g.wp.adManager.type() + "}, deferring track change", e), x = e, void n(document).on("ad-end", d);
p.log("External ad is NOT playing, triggering track begin event", e), P.trackStarted(e), n(document).trigger("metadata-track", [e]), di.eventbus.trigger("webplayer:track:begin", e)
} else p.log("Triggering ad event", e), n(document).trigger("ad-new", [e]);
null != C && (C.ended || (C.ended = Math.floor((Date.now() - 100) / 1e3)), p.log("Triggering track end event", C), P.trackComplete(C), n(document).trigger("metadata-track-complete", [C]), p.log("Triggering track end event: complete")), C = e
}
function d(e, t) {
p.log("External ad ended; triggering deferred track change", x, e, t), n(document).off("ad-end", d), x ? c(x) : p.log("Deferred track change information unavailable")
}
function h(e) {
var t = g.wp.getState();
if ("connected" !== t) return p.log("Not allowed to query the API because player is currently {" + t + "}"), !1;
var i = function(t) {
v = y;
var i = "premium" === g.wp.member.getAccess();
p.log("API metadata received", t), w = [], n(t).each(function() {
this.started -= g.wp.timeKeeper.serverTimeOffsetSec, u(this), ("advertisement" != this.type || !i && this.url) && w.push(this)
}), e(), P.load(w), n(document).trigger("metadata-load", [w])
},
r = function(e) {
if (p.log("track history request failed"), v--, 429 === e.statusCode()) p.log("ERROR: 429 reponse code; halting requests");
else if (v > -1) {
var t = Math.round(29e3 * Math.random() + 1e3);
p.log("retry " + (y - v) + "/" + y + " in: " + t / 1e3 + " seconds"), b = setTimeout(function() {
M.getChannel(m, i, r)
}, t)
} else p.log(y + " retries exahusted")
};
M.getChannel(m, i, r)
}
var p, f, m, g = (NS("AudioAddict.Util"), NS("AudioAddict.WP")),
y = 3,
v = y,
b = null,
w = [],
x = null,
k = null,
C = null,
A = "",
S = "Sponsored Message",
T = !1,
P = null,
M = new AudioAddict.API.TrackHistory(AudioAddict.API.Config.url, AudioAddict.API.Config.network),
E = new di.math.ExponentialBackoff(Math.round(500 + 1e3 * Math.random()), 12e4),
I = {
"public": {
40: 26,
64: 26
},
premium: {
40: 12,
64: 7,
96: 3,
128: 1
}
},
F = _.memoize(function(e) {
return (e || "").replace(/ADWTAG_\d{5}_START=0|TSTAG_\d{2}|\[SJ247\]/g, "")
}),
O = _.memoize(function(e) {
return e.replace(/[^A-z]/g, "").toLowerCase()
});
NS(e).Metadata = t.extend({
NS: e + ".Metadata",
_required: ["url"],
init: function(e) {
p = this, f = e.url, A = NS("AudioAddict.API").Static.urlPremium, P = new i, n(document).on("player-metadata", r), n(document).on("Channel.Set", function(e, t) {
m = t.id
}), n(document).on("wp-disconnect wp-stop", function() {
k = C = x = null, T = !1
}), p.log("Initialized")
}
})
}("AudioAddict.WP", AudioAddict.Modules.Base, jQuery), NS("AudioAddict.WP").Error = {
BufferTimeout: 1,
FlashBlocked: 2
},
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.provide("AudioAddict.WP.Streamlist"), AudioAddict.WP.Streamlist = function(e) {
function n(e) {
this.delegateEventMaps(), this.settings = new o, this.settings.set(e)
}
var i, r, o, a, s, l;
return t(n, e), r = 10, a = "stream:ready", s = "stream:timeout", l = "stream:unavailable", o = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
var i;
return t(n, e), i = "webplayer", n.prototype.defaults = {
channel: void 0,
access: null,
listenKey: "",
speed: null,
streamsets: null
}, n.prototype.getStreamset = function() {
var e, t;
return e = this.getSpeeds(), t = e[this.get("speed")] || _.first(_.values(e))
}, n.prototype.getStreamsetKey = function() {
return this.getStreamset().key
}, n.prototype.getBitrate = function() {
return this.getStreamset().bitrate
}, n.prototype.getSpeeds = function() {
return this.get("streamsets")[this.get("access")][i]
}, n.prototype.getChannelKey = function() {
var e;
return e = this.get("channel"), e ? e.get("key") : void 0
}, n
}(Backbone.Model), i = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
var i, r, o;
return t(n, e), o = "pub", r = ".flv", i = "com_adswizz_synchro_decorateUrl", n.prototype.initialize = function(e) {
this.settings = e
}, n.prototype.path = function() {
var e;
return e = "listen/" + this.settings.getStreamsetKey() + "/" + this.settings.getChannelKey(), this.settings.get("listenKey") && (e += "?listen_key=" + this.settings.get("listenKey")), e
}, n.prototype.parse = function(e) {
var t;
return t = this.settings.get("listenKey") ? this.settings.get("listenKey") + "&" : "", _.map(e, function(e) {
var n, a, s, l;
if (s = e.replace(r, "").split("?"), n = s[0], a = {
type: r
}, l = n + "?" + t + $.param(a), l.indexOf(o) > -1) try {
l = window[i](l)
} catch (u) {}
return {
url: l
}
})
}, n
}(di.mixOf(Backbone.Collection, di.api.Adapter)), n.prototype.logger = new di.log.Console("AudioAddict.WP.Streamlists"), n.prototype.documentEvents = {
"member-access": "onAccessChanged_",
"member-listenkey": "onListenKeyChanged_",
"member-speed": "onSpeedChanged_"
}, n.prototype.onAccessChanged_ = function(e, t) {
return this.settings.set({
access: t
})
}, n.prototype.onListenKeyChanged_ = function(e, t) {
return this.settings.set({
listenKey: t
})
}, n.prototype.onSpeedChanged_ = function(e, t) {
return this.settings.set({
speed: t
})
}, n.prototype.fetchStreamlists_ = function(e) {
return null == e && (e = 0), null == this.apiPlaylistsCollection && (this.apiPlaylistsCollection = new i(this.settings)), this.apiPlaylistsCollection.fetch({
success: function(e) {
return function(t) {
var n;
return t.length < 1 ? (e.logger.log("Empty streamlist received, giving up"), e.trigger(l), e.promise.rejectWith(null, [l])) : (n = t.sample().get("url"), e.trigger(a, n), e.promise.resolveWith(null, [n]))
}
}(this),
error: function(t) {
return function() {
return ++e < r ? (t.logger.log("attempting to fetch another streamlist..."), t.fetchStreamlists_(e)) : (t.logger.log("Failed to fetch streamlists, giving up"), t.trigger(s), t.promise.rejectWith(null, [s]))
}
}(this)
})
}, n.prototype.getStreamForChannel = function(e) {
return e ? (this.promise = new $.Deferred, this.settings.set({
channel: e
}), this.fetchStreamlists_(), this.promise) : void 0
}, n.prototype.getSpeeds = function() {
return this.settings.getSpeeds()
}, n.prototype.getCurrentBitrate = function() {
return this.settings.getBitrate()
}, n
}(di.mixin.EventMapper)
}.call(this),
function() {
var e, t = {}.hasOwnProperty,
n = function(e, n) {
function i() {
this.constructor = e
}
for (var r in n) t.call(n, r) && (e[r] = n[r]);
return i.prototype = n.prototype, e.prototype = new i, e.__super__ = n.prototype, e
};
di.provide("AudioAddict.WP.WebPlayer"), e = function() {
function e() {}
var t, n, i, r;
return t = swfobject.getFlashPlayerVersion(), n = {
major: 10,
minor: 2
}, i = 0 === t.major, r = t.major < n.major || t.major === n.major && t.minor < n.minor, e.prototype.enforce = function() {
return Modernizr.addTest("flash", !(i || r)), i ? di.app.commands.execute("flash:error", "install") : r ? di.app.commands.execute("flash:error", "update") : $.log("Flash Version: " + t.major + "." + t.minor + "." + t.release)
}, e
}(), AudioAddict.WP.WebPlayer = function(t) {
function i(e) {
var t;
this.options = e, this.delegateEventMaps(), $.log(" "), $.log("\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513"), $.log("\u2503 \u2588\u2593\u2592\u2591 WebPlayer 4.0 \u2591\u2592\u2593\u2588 \u2503"), $.log("\u2520\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2528"), $.log("\u2503 \xa9 AudioAddict Inc \u2503"), $.log("\u2503 All Rights Reserved \u2503"), $.log("\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251b"), $.log(" "), this.flashPolicy.enforce(), "public" === AudioAddict.API.Config.access && (AudioAddict.webplayer.adblocks.initialize(), AudioAddict.webplayer.ui.ads.initialize()), di.app.commands.setHandler("webplayer:reconnect", this.play, this), di.app.commands.setHandler("webplayer:unmute", this.unMute, this), di.app.commands.setHandler("webplayer:mute", this.mute, this), di.app.commands.setHandler("webplayer:setVolume", this.setVolume, this), di.app.commands.setHandler("webplayer:audio:start", this.play, this), di.app.commands.setHandler("webplayer:audio:stop", this.stop, this), di.app.reqres.setHandler("webplayer:state", this.getState, this), t = new AudioAddict.Modules.PlayerSettings({
authenticated: AudioAddict.API.Config.authenticated,
access: AudioAddict.API.Config.access,
listenUrl: AudioAddict.API.Config.listenUrl,
listenKey: AudioAddict.API.Config.listenKey,
streams: AudioAddict.API.Streamsets
}), this.member = new Member({
access: AudioAddict.API.Config.access,
listenKey: AudioAddict.API.Config.listenKey,
speed: t.getBitrate()
}), this.streamlist = new AudioAddict.WP.Streamlist({
access: AudioAddict.API.Config.access,
listenKey: AudioAddict.API.Config.listenKey,
listenUrl: AudioAddict.API.Config.listenUrl,
streamsets: AudioAddict.API.Streamsets,
speed: t.getBitrate()
}), this.listenTo(this.streamlist, "stream:timeout", this.onConnectTimeout), this.listenTo(this.streamlist, "stream:unavailable", this.onConnectTimeout), new AudioAddict.WP.Metadata({
url: "http://api.audioaddict.com/v1/" + AudioAddict.API.Config.network + "/track_history/channel/{id}.jsonp"
}), new Ping({
url: AudioAddict.API.Config.url + "/ping.jsonp",
interval: h
}), this.timeKeeper = new TimeKeeper, this.adapter = new Player, this.adapter.init({
bufferTimeoutDuration: s,
swfPath: g,
swfContainer: m,
playerId: p,
onError: _.bind(this.onError, this),
onConnect: _.bind(this.onConnect, this),
onReady: _.bind(this.onAdapterReady, this)
})
}
var r, o, a, s, l, u, c, d, h, p, f, m, g, y;
return n(i, t), h = 900, s = 1e4, d = "disconnected", u = "connecting", l = "connected", f = "stopped", c = 3e5, r = 6e4, y = 1, p = "player", m = "player-swf", g = "/assets/webplayer/AudioAddict.WP2-1d5c7214cbd6f665907e5a77c73c09d7.swf", o = "#sponsor", a = 18e4, i.prototype.model = new Backbone.Model({
state: d,
stream: null
}), i.prototype.modelEvents = {
"change:state": "onStateChanged"
}, i.prototype.logger = new di.log.Console("AudioAddict.WP.WebPlayer"), i.prototype.flashPolicy = new e, i.prototype.initChannel = function() {
var e;
return this.channel = new Channel({
channels: di.app.options.channels
}), (e = di.app.request("webplayer:channel")) ? this.channel.set(e.get("key"), e.get("id")) : void 0
}, i.prototype.initAdManager = function() {
return this.adManager = new AdManager({
canvas: o,
cutoff: a,
providers: {
internal: "ad.int" !== AudioAddict.WP.debug,
adswizz: "ad.aw" !== AudioAddict.WP.debug
}
})
}, i.prototype.showConnectTimeoutModal = function() {
throw di.app.commands.execute("webplayer:modal:connectiontimeout"), new Error("Connection timed out")
}, i.prototype.onDisconnect = function() {
return this.stop(), this.model.set({
state: d
})
}, i.prototype.onConnect = function() {
return this.model.set({
state: l
})
}, i.prototype.onAdapterReady = function() {
return this.logger.log("Webplayer Adapter is OMG, ready!"), this.initChannel(), this.initAdManager(), this.adapter.ready = !0, clearTimeout(this.adapterTimeoutId)
}, i.prototype.onError = function(e, t) {
return null == t && (t = ""), e === AudioAddict.WP.Error.BufferTimeout ? (this.logger.log("onError(): Buffer timeout triggered"), this.onDisconnect(), this.connect()) : di.app.commands.execute("flash:error", "blocked")
}, i.prototype.play = function() {
return this.connect()
}, i.prototype.stop = function() {
var e;
if ((e = this.getState()) !== d && e !== f) return this.logger.log("stop"), this.model.set({
state: f
}), this.adManager.stop(), this.adapter.stop()
}, i.prototype.setVolume = function(e) {
var t;
return null != (t = this.adapter) ? t.setVolume(e) : void 0
}, i.prototype.getVolume = function() {
var e;
return null != (e = this.adapter) ? e.getVolume() : void 0
}, i.prototype.getPlayerVolume = function() {
return this.getVolume()
}, i.prototype.isMuted = function() {
return this.volumeProxy().isMuted()
}, i.prototype.muteToggle = function() {
return this.isMuted() ? this.unMute() : this.mute()
}, i.prototype.volumeProxy = function() {
try {
return this.adManager && this.adManager.isExternal() ? this.adManager : this.adapter
} catch (e) {
return this.adapter
}
}, i.prototype.mute = function() {
return this.volumeProxy().mute(), di.eventbus.trigger("webplayer:muted:change", !0)
}, i.prototype.unMute = function() {
return this.volumeProxy().unMute(), di.eventbus.trigger("webplayer:muted:change", !1)
}, i.prototype.fadeIn = function(e, t) {
return this.adapter.fadeIn(e || $.noop, t)
}, i.prototype.fadeOut = function(e) {
return this.adapter.fadeOut(e || $.noop)
}, i.prototype.tempMute = function() {
return this.adapter.tempMute()
}, i.prototype.tempUnMute = function() {
return this.adapter.tempUnMute()
}, i.prototype.onStateChanged = function(e, t) {
switch (t !== u && clearTimeout(this.connectTimeoutId), this.logger.log("state changed to: " + t), di.eventbus.trigger("webplayer:state:change", t), t) {
case u:
return this.adapter.ready || (this.adapterTimeoutId = setTimeout(this.flashPolicy.showFlashBlockError, r)), this.connectTimeoutId = setTimeout(_.bind(this.onConnectTimeout, this), c), $(document).trigger("wp-connecting"), di.eventbus.trigger("webplayer:connecting");
case d:
return $(document).trigger("wp-stop"), $(document).trigger("wp-disconnect"), di.eventbus.trigger("webplayer:stop"), di.eventbus.trigger("webplayer:stream:disconnect");
case l:
return $(document).trigger("wp-connect"), di.eventbus.trigger("webplayer:stream:connect");
case f:
return $(document).trigger("wp-stop"), di.eventbus.trigger("webplayer:stop")
}
}, i.prototype.onConnectTimeout = function() {
return this.showConnectTimeoutModal(), this.logger.log("connect attempt timeout reached, stopping.")
}, i.prototype.connect = function() {
var e;
return this.stop(), this.model.set({
state: u
}), e = this.getChannel(), e ? this.streamlist.getStreamForChannel(e).done(this.adapter.load) : void 0
}, i.prototype.getState = function() {
return this.model.get("state")
}, i.prototype.setLocale = function(e) {
return this.model.set("locale", e)
}, i.prototype.getLocale = function() {
return this.model.get("locale")
}, i.prototype.getChannel = function() {
return di.app.reqres.request("webplayer:channel")
}, i
}(di.mixin.EventMapper)
}.call(this), NS("AudioAddict.WP.AdManager.providers").adswizz = function(e) {
function t(e) {
return decodeURIComponent(e) === e ? encodeURIComponent(e) : e
}
function n(e) {
var n = a + "&context=" + ($.trim(t(e)) || "") + "&cb=" + Date.now();
$.log(LogPrefix() + "AudioAddict.WP.AdProvider_Adswizz: Setting banner url:", n), s.find("iframe")[0].src = n, s.show()
}
var i = "http://deliveryengine.di.adswizz.com/afr?zoneid=1",
r = null;
if (this.type = "adswizz", this.isReady = e.yes, this.isExternal = e.no, this.hasBanner = e.yes, this.begin = function(e) {
return $.log(LogPrefix() + "AudioAddict.WP.AdProvider_Adswizz: Beginning ad block"), clearTimeout(r), o = e, o.context && "" !== o.context ? (n(o.context), s.show(), $(document).trigger("ad-begin", [o]), di.eventbus.trigger("webplayer:ad:begin", o), this) : ($.log(LogPrefix() + "AudioAddict.WP.AdProvider_Adswizz: No ad context found."), !1)
}, this.end = function() {
return $.log(LogPrefix() + "AudioAddict.WP.AdProvider_Adswizz: Ending ad block"), s.find("iframe").attr("src", i), s.hide(), $(document).trigger("ad-end"), di.eventbus.trigger("webplayer:ad:end"), this
}, "undefined" == typeof e) throw "AudioAddict.WP.AdProvider_Adswizz: FATAL: Ad manager reference object not provided";
var o, a = (NS("AudioAddict.WP"), NS("AudioAddict.Ad").adswizz.baseUrl),
s = $('<div id="adprovider-adswizz" style="position: absolute; z-index: 2; top: 0; left: 0;"><iframe width="300" height="250" frameborder="0" scrolling="no"></iframe></div>').appendTo(e.canvas()).hide();
$.log(LogPrefix() + "AudioAddict.WP.AdProvider_Adswizz: Initialized")
}, NS("AudioAddict.WP.AdManager.providers")["default"] = function(e) {
if (this.type = "default", this.isReady = e.yes, this.isExternal = e.no, this.hasBanner = e.yes, this.begin = function() {
return $.log(LogPrefix() + "AudioAddict.WP.AdProvider_Default: Beginning ad"), t.show(), this
}, this.end = function() {
return $.log(LogPrefix() + "AudioAddict.WP.AdProvider_Default: Ending ad"), t.hide(), this
}, "undefined" == typeof e) throw "AudioAddict.WP.AdProvider_Default: FATAL: Ad manager reference object not provided";
var t = $("#adprovider-default").appendTo(e.canvas()).hide()
}, NS("AudioAddict.WP.AdManager.providers").internal = function(e) {
if (this.type = "internal", this.isReady = e.yes, this.isExternal = e.no, this.hasBanner = function() {
return t.banner
}, this.begin = function(r) {
return "undefined" != typeof r && r ? ($.log(LogPrefix() + "AudioAddict.WP.AdProvider_Internal: Beginning new ad"), t = r, t.banner && (i.html('<img border="0" style="position: relative;" src="' + t.banner + '"></div>'), t.url && (i.indexOf("<a href") > -1 && i.unwrap(), i.wrap('<a href="' + t.url + '" target="_blank">')), n = i.find("img").load(function() {
setTimeout(function() {
n.width() > e.canvas().width() && n.css("width", e.canvas().width()), n.height() > e.canvas().height() && n.css("height", e.canvas().height()), n.css("left", e.canvas().width() / 2 - n.width() / 2), n.css("top", e.canvas().height() / 2 - n.height() / 2), i.show()
}, 100)
})), $(document).trigger("ad-begin", [t]), di.eventbus.trigger("webplayer:ad:begin", t), this) : ($.log(LogPrefix() + "AudioAddict.WP.AdProvider_Internal: Ad is not support by this provider, aborting", r, t), $(document).trigger("ad-end"), di.eventbus.trigger("webplayer:ad:end"), this)
}, this.end = function() {
return $.log(LogPrefix() + "AudioAddict.WP.AdProvider_Internal: Ending ad"), t.banner && i.hide().empty(), $(document).trigger("ad-end"), di.eventbus.trigger("webplayer:ad:end"), this
}, "undefined" == typeof e) throw "AudioAddict.WP.AdProvider_Internal: FATAL: Ad manager reference object not provided";
var t, n, i = $('<div id="adprovider-internal" style="position: absolute; z-index: 1; top: 0; left: 0;"></div>').appendTo(e.canvas()).hide();
$.log(LogPrefix() + "AudioAddict.WP.AdProvider_Internal: Initialized")
},
function() {
var e, t, n, i, r, o, a, s;
s = "AudioAddict.webplayer.adblocks", r = di.provide(s), r.initialized || (i = 5, e = "webplayer:adblock:begin", t = "webplayer:adblock:durationupdate", n = "webplayer:adblock:end", a = new di.log.Console(s), r.adBlockPlaying_ = !1, r.gracePeriodTimer_ = null, r.adBlockBegin = function(t) {
return r.adBlockPlaying_ = !0, a.log("Ad block begun"), di.eventbus.trigger(e, t)
}, r.adBlockDurationUpdate = function(e) {
return a.log("Received duration update for ad block, {" + e + "} secs remaining + {" + i + "} secs grace period"), di.eventbus.trigger(t, e + i)
}, r.adBlockEnd = function() {
return r.adBlockPlaying_ = !1, a.log("Ad gap grace period (if applicable) over, ad block ended"), di.eventbus.trigger(n)
}, r.hasVisual_ = function(e) {
return !("internal" === (null != e ? e.provider : void 0) && null === e.banner && e.url.indexOf("/premium") < 0)
}, r.adBegin_ = function(e, t) {
var n;
return r.adBlockPlaying_ && r.gracePeriodTimer_.reset(), t || !r.adBlockPlaying_ ? r.hasVisual_(e) ? (n = "preroll" === ("function" == typeof e.get ? e.get("position") : void 0), r.adBlockPlaying_ || r.adBlockBegin(n), t > 0 ? r.adBlockDurationUpdate(t) : void 0) : void a.log("Ad has no visual part, so not starting ad block") : void 0
}, r.adEnd_ = function() {
return r.adBlockPlaying_ ? r.gracePeriodTimer_.start() : void 0
}, r.prerollEnd_ = function() {
return r.gracePeriodTimer_.reset(), r.adBlockEnd()
}, o = {
"webplayer:ad:begin": r.adBegin_,
"webplayer:ad:end webplayer:track:begin": r.adEnd_,
"webplayer:ads:preroll-end": r.prerollEnd_
}, r.initialize = function() {
return di.eventbus.bind(o), null == r.gracePeriodTimer_ && (r.gracePeriodTimer_ = new di.date.Timer(1e3 * i, r.adBlockEnd)), r.initialized = !0, a.log("Initialized.")
}, r.destroy = function() {
var e;
return di.eventbus.unbind(o), null != (e = r.gracePeriodTimer_) && e.reset(), r.adBlockPlaying_ = !1, r.initialized = !1, a.log("Destroyed.")
})
}.call(this),
function(e) {
e.fn.serializeJSON = function() {
var t = {};
return e.map(e(this).serializeArray(), function(e) {
t[e.name] = e.value
}), t
}
}(jQuery),
function(e) {
function t(e, t) {
return this.stop().animate({
top: e
}, this.data("settings").duration, t)
}
function n() {
return this.find(".errors").empty()
}
var i = {
duration: 300,
panelClass: ".panel",
closeClass: ".panel-close",
saveClass: ".panel-save",
forceVisible: !1,
spinOpt: {
lines: 9,
length: 7,
width: 4,
radius: 14,
corners: 1,
trail: 75,
speed: 1.2,
shadow: "on"
}
},
r = [],
o = {
init: function(t) {
var r = {},
a = this.outerHeight(!0),
s = this;
return e.extend(!0, r, i, t), this.find(r.closeClass).unbind("click").click(function(t) {
e(this).attr("disabled") || o.hide.call(s), t.preventDefault()
}), r.save && this.find(r.saveClass).unbind("click").click(function(e) {
e.preventDefault();
var t = s.find(":input").serializeJSON();
(!r.beforeSave || r.beforeSave.call(s, t)) && (n.call(s), r.save.call(s, t) && s.panel("hide"))
}), this.data("initialized", !0), this.data("height", a), this.data("settings", r), this
},
wait: function(e) {
var t = this.find(".wait");
0 === t.length && (t = this.prepend('<div class="overlay wait"><div class="spin"></div></div>').find(".wait"));
var n = t.is(":visible");
return "undefined" == typeof e && (e = !n), e && !n ? t.fadeIn().find(".spin").spin(this.data("settings").spinOpt) : !e && n && (t.is(":animated") ? t.hide() : t.fadeOut(), t.find(".spin").spin(!1)), this.data("waiting", t.is(":visible"))
},
error: function(t) {
var n = this.find(".errors");
return 0 !== n.length && (n.empty(), "string" == typeof t && (t = [t]), e.each(t, function(e, t) {
n.append("<li>" + t + "</li>")
})), this
},
message: function(e, t, n) {
var i = this,
r = this.find(".message");
0 === r.length && (r = this.prepend('<div class="overlay message"><h1></h1><p></p><div class="buttons"><button class="button main-button panel-save">OK</button></div></div>').find(".message"));
var o = (r.is(":visible"), r.find("p")),
a = r.find("h1"),
s = r.find(".panel-save");
return o.html(t), a.html(e), r.fadeIn(200, function() {
i.data("waiting") && i.panel("wait", !1)
}), s.click(function() {
s.unbind("click"), "function" == typeof n && n.call(i) || n ? i.panel("hide", function() {
r.hide(), o.empty(), a.empty()
}) : (r.fadeOut(), o.empty(), a.empty())
}), this
},
show: function(n) {
var i, o = 0,
a = 1;
i = _.partition(r, function(t) {
return e(t).is(".forced")
});
for (var s = 0; s < i[a].length; s++) e(i[a][s]).panel("hide");
r = i[o], this.show(), r.push(this);
try {
this.data("settings").show.call(this)
} catch (l) {}
return t.call(this, "-" + this.data("height"), n)
},
hide: function(e) {
n.call(this);
try {
this.data("settings").hide.call(this)
} catch (i) {}
var r = this;
return t.call(this, 0, function() {
r.data("settings").forceVisible || r.hide();
try {
e.call(r)
} catch (t) {}
})
},
toggle: function() {
return o[this.is(":visible") ? "hide" : "show"].call(this)
}
};
e.fn.panel = function(t) {
return 0 === this.length ? e.error("unable to locate element") : t && "object" != typeof t ? o[t] ? ("undefined" == typeof this.data("initialized") && o.init.call(this, {}), o[t].apply(this, Array.prototype.slice.call(arguments, 1))) : void e.error("Method " + t + " does not exist on jQuery.panel") : o.init.apply(this, arguments)
}
}(jQuery),
function() {
var e, t, n, i;
i = "AudioAddict.webplayer.ui.ads", e = di.provide(i), e.initialized || (n = new di.log.Console(i), e.panelId = "panel-ad", e.closeSelector = ".panel-close", e.remainingTimeSelector = ".remaining-time", e.fallbackDelay = 180, e.$panel = null, e.$closeButton = null, e.$closeButtonTimer = null, e.initialized = !1, e.uiInitialized_ = !1, e.secondsRemaining_ = null, e.countdownTimer_ = null, e.fallbackTimer_ = null, e.initializeUi_ = function() {
return e.$panel = $("#" + e.panelId), e.$closeButton = e.$panel.find(e.closeSelector), e.$closeButtonTimer = e.$panel.find(e.remainingTimeSelector), e.$panel.exists() ? e.$closeButton.exists() ? (n.log("Initialized UI components"), e.uiInitialized_ = !0) : (n.log("Close button with selector {" + e.closeSelector + " not found, failed UI init."), !1) : (n.log("Panel element with id {" + e.panelId + "} not found, failed UI init."), !1)
}, e.forceAdPanel_ = function() {
var t;
return null != (t = e.$panel) ? t.show() : void 0
}, e.clearCountdown_ = function() {
return e.$closeButton.hasClass("timer") && n.log("Removing close button countdown"), e.secondsRemaining_ = null, e.$closeButtonTimer.text(""), e.$closeButton.removeClass("timer"), null != e.countdownTimer_ ? (n.log("Clearing countdown timer"), e.countdownTimer_.reset(), e.countdownTimer_.off(), e.countdownTimer_ = null) : void 0
}, e.countdownTick_ = function() {
return e.$closeButtonTimer.text(e.secondsRemaining_ + ""), e.secondsRemaining_ -= 1
}, e.enableClosing_ = function() {
return e.$closeButton.removeClass("pending").removeAttr("disabled")
}, e.fallbackAdBlockEnd_ = function() {
return e.clearCountdown_(), n.log("Fallback timeout reached, making ad panel closeable"), e.enableClosing_(), e.fallbackTimer_.reset()
}, e.adblockBegin = function(t) {
return e.uiInitialized_ || e.initializeUi_() ? (n.log("Ad block begun, showing ad panel"), e.fallbackTimer_.reset(), e.fallbackTimer_.start(), e.$panel.toggleClass("preroll", t), e.jqueryPanelDisabled || e.$panel.panel("show"), e.$closeButton.addClass("pending").removeClass("timer").attr("disabled", "disabled")) : void 0
}, e.adblockDurationUpdate = function(t) {
return e.uiInitialized_ || e.initializeUi_() ? (e.clearCountdown_(), n.log("Received duration update, displaying countdown for {" + t + "} seconds"), e.$closeButton.addClass("timer"), e.secondsRemaining_ = t, e.countdownTimer_ = new di.date.Timer(1e3, t), e.countdownTimer_.on(di.date.Timer.TICK, e.countdownTick_), e.countdownTimer_.on(di.date.Timer.COMPLETE, e.clearCountdown_), e.countdownTimer_.start(), e.countdownTick_()) : void 0
}, e.prerollEnd = function() {
return e.enableClosing_(), e.jqueryPanelDisabled ? void 0 : e.$panel.panel("hide")
}, e.adblockEnd = function() {
return e.uiInitialized_ || e.initializeUi_() ? (e.fallbackTimer_.reset(), e.clearCountdown_(), n.log("Ad block ended, enabling close button"), e.enableClosing_()) : void 0
}, t = {
"webplayer:stream:connect": e.forceAdPanel_,
"webplayer:adblock:begin": e.adblockBegin,
"webplayer:adblock:durationupdate": e.adblockDurationUpdate,
"webplayer:adblock:end": e.adblockEnd,
"webplayer:ads:preroll-end": e.prerollEnd
}, e.initialize = function() {
return e.initialized ? void n.log("Already initialized, not initializing again.") : (di.eventbus.on(t), e.fallbackTimer_ = new di.date.Timer(1e3 * e.fallbackDelay, e.fallbackAdBlockEnd_), e.initialized = !0, n.log("Initialized."))
}, e.destroy = function() {
return e.initialized ? (di.eventbus.off(t), e.fallbackTimer_.reset(), e.clearCountdown_(), e.$panel = e.$closeButton = e.$closeButtonTimer = null, e.uiInitialized_ = !1, e.initialized = !1, n.log("Destroyed.")) : void 0
})
}.call(this),
function() {
di.app.module("WebplayerApp.Adapters", function(e, t, n, i, r, o) {
var a, s;
return s = {
IcecastPlayer: !1,
OnDemandPlayer: !1
}, a = {
allAdpatersReady: function() {
return e.options.legacy || s.OnDemandPlayer && s.IcecastPlayer
},
onAdapterReady: function(e) {
return console.info("Adapter Ready: " + e), s[e] = !0, a.allAdpatersReady() ? (t.WebplayerApp.model.set("ready", !0), t.vent.trigger("webplayer:ready")) : void 0
}
}, this.addInitializer(function(e) {
return this.options = e, t.vent.on("webplayer:adapter:ready", o.bind(a.onAdapterReady, this))
})
})
}.call(this),
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.provide("di.model.Ad"), di.model.Ad = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
return t(n, e), n.prototype.defaults = {
width: 300,
height: 250
}, n.prototype.initialize = function() {
var e, t;
return null == (e = this.attributes).width && (e.width = 300), null != (t = this.attributes).height ? t.height : t.height = 250
}, n
}(Backbone.RelationalModel)
}.call(this),
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.provide("di.collection.Ads"), di.collection.Ads = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
return t(n, e), n.prototype.model = di.model.Ad, n
}(Backbone.Collection)
}.call(this),
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.provide("di.model.AdRuleset"), di.model.AdRuleset = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
return t(n, e), n.prototype.relations = [{
type: "HasMany",
key: "ads",
keySource: "blocks",
keyDestination: "ads",
relatedModel: di.model.Ad,
relatedCollection: di.collection.Ads
}], n
}(Backbone.RelationalModel)
}.call(this),
function() {
var e = function(e, t) {
return function() {
return e.apply(t, arguments)
}
},
t = {}.hasOwnProperty,
n = function(e, n) {
function i() {
this.constructor = e
}
for (var r in n) t.call(n, r) && (e[r] = n[r]);
return i.prototype = n.prototype, e.prototype = new i, e.__super__ = n.prototype, e
};
di.provide("di.collection.AdRulesets"), di.collection.AdRulesets = function(t) {
function i() {
return this.parse = e(this.parse, this), i.__super__.constructor.apply(this, arguments)
}
return n(i, t), i.prototype.logger = new di.log.Console("di.collection.AdRulesets"), i.prototype.path = "ads/webplayer", i.prototype.model = di.model.AdRuleset, i.prototype.initialize = function(e, t) {
if (null == t.countryCode) throw "AdRulesets: missing countryCode";
return this.countryCode = t.countryCode
}, i.prototype.findRulesets = function(e) {
var t;
return t = this.logger, this.filter(function(t) {
return null == t.get("channel_id") ? !0 : t.get("channel_id") === e
})
}, i.prototype.parse = function(e) {
return this.logger.log("Parsing server response; filtering by country"), _.reject(e, function(e) {
return function(t) {
return null != t.country_code && t.country_code !== e.countryCode
}
}(this))
}, i
}(di.collection.Base)
}.call(this),
function() {
var e = function(e, t) {
return function() {
return e.apply(t, arguments)
}
},
t = {}.hasOwnProperty,
n = function(e, n) {
function i() {
this.constructor = e
}
for (var r in n) t.call(n, r) && (e[r] = n[r]);
return i.prototype = n.prototype, e.prototype = new i, e.__super__ = n.prototype, e
};
di.provide("di.application.module.webplayer.ads.provider.Base"), di.application.module.webplayer.ads.provider.Base = function(t) {
function i() {
return this.volumeChanged_ = e(this.volumeChanged_, this), i.__super__.constructor.apply(this, arguments)
}
return n(i, t), i.prototype.logger = new di.log.Console("di.module.weplayer.ads.provider.Base"), i.prototype.eventbusEvents = {
"webplayer:volume:change": "volumeChanged_"
}, i.prototype.activeAd = null, i.prototype.pendingAd = null, i.prototype.startAd = function(e) {
if (this.logger.log("Ad triggered for provider {" + this.moduleName + "}"), !(e instanceof di.model.Ad)) throw new TypeError("Ad requested is not properly formatted, should be di.model.Ad");
if (e.get("network") !== this.moduleName) throw new TypeError("Ad passed does not match provider. " + e.get("network") + " vs " + this.moduleName);
return "preroll" === e.get("position") && di.eventbus.trigger("webplayer:ad:preroll-loading"), this.pendingAd = e
}, i.prototype.stopAd = function() {
return this.logger.log("Stopping any active ads for provider {" + this.moduleName + "}")
}, i.prototype.adBegin_ = function() {
return this.logger.log("Ad begun for provider {" + this.moduleName + "}, dispatching event."), this.activeAd = this.pendingAd, this.pendingAd = null, di.eventbus.trigger("webplayer:ad:begin", this.activeAd)
}, i.prototype.adEnd_ = function() {
return this.activeAd ? (di.eventbus.trigger("webplayer:ad:end", this.activeAd), this.activeAd = null) : void 0
}, i.prototype.noAdsAvailable_ = function() {
return this.activeAd || this.pendingAd ? (di.eventbus.trigger("webplayer:ad:none_available", this.activeAd || this.pendingAd), this.activeAd && (this.activeAd = null), this.pendingAd ? this.pendingAd = null : void 0) : void 0
}, i.prototype.getWebplayerVolume_ = function() {
return this.app.request("webplayer:volume")
}, i.prototype.volumeChanged_ = function(e) {
return "function" == typeof this.onVolumeChanged ? this.onVolumeChanged(e) : void 0
}, i
}(di.application.module.Base)
}.call(this), window.Modernizr = function(e, t, n) {
function i(e) {
_.cssText = e
}
function r(e, t) {
return i(x.join(e + ";") + (t || ""))
}
function o(e, t) {
return typeof e === t
}
function a(e, t) {
return !!~("" + e).indexOf(t)
}
function s(e, t) {
for (var i in e) {
var r = e[i];
if (!a(r, "-") && _[r] !== n) return "pfx" == t ? r : !0
}
return !1
}
function l(e, t, i) {
for (var r in e) {
var a = t[e[r]];
if (a !== n) return i === !1 ? e[r] : o(a, "function") ? a.bind(i || t) : a
}
return !1
}
function u(e, t, n) {
var i = e.charAt(0).toUpperCase() + e.slice(1),
r = (e + " " + C.join(i + " ") + i).split(" ");
return o(t, "string") || o(t, "undefined") ? s(r, t) : (r = (e + " " + A.join(i + " ") + i).split(" "), l(r, t, n))
}
function c() {
f.input = function(n) {
for (var i = 0, r = n.length; r > i; i++) M[n[i]] = n[i] in b;
return M.list && (M.list = !!t.createElement("datalist") && !!e.HTMLDataListElement), M
}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")), f.inputtypes = function(e) {
for (var i, r, o, a = 0, s = e.length; s > a; a++) b.setAttribute("type", r = e[a]), i = "text" !== b.type, i && (b.value = w, b.style.cssText = "position:absolute;visibility:hidden;", /^range$/.test(r) && b.style.WebkitAppearance !== n ? (g.appendChild(b), o = t.defaultView, i = o.getComputedStyle && "textfield" !== o.getComputedStyle(b, null).WebkitAppearance && 0 !== b.offsetHeight, g.removeChild(b)) : /^(search|tel)$/.test(r) || (i = /^(url|email)$/.test(r) ? b.checkValidity && b.checkValidity() === !1 : b.value != w)), P[e[a]] = !!i;
return P
}("search tel url email datetime date month week time datetime-local number range color".split(" "))
}
var d, h, p = "2.8.3",
f = {},
m = !0,
g = t.documentElement,
y = "modernizr",
v = t.createElement(y),
_ = v.style,
b = t.createElement("input"),
w = ":)",
x = ({}.toString, " -webkit- -moz- -o- -ms- ".split(" ")),
k = "Webkit Moz O ms",
C = k.split(" "),
A = k.toLowerCase().split(" "),
S = {
svg: "http://www.w3.org/2000/svg"
},
T = {},
P = {},
M = {},
E = [],
I = E.slice,
F = function(e, n, i, r) {
var o, a, s, l, u = t.createElement("div"),
c = t.body,
d = c || t.createElement("body");
if (parseInt(i, 10))
for (; i--;) s = t.createElement("div"), s.id = r ? r[i] : y + (i + 1), u.appendChild(s);
return o = ["&#173;", '<style id="s', y, '">', e, "</style>"].join(""), u.id = y, (c ? u : d).innerHTML += o, d.appendChild(u), c || (d.style.background = "", d.style.overflow = "hidden", l = g.style.overflow, g.style.overflow = "hidden", g.appendChild(d)), a = n(u, e), c ? u.parentNode.removeChild(u) : (d.parentNode.removeChild(d), g.style.overflow = l), !!a
},
O = function(t) {
var n = e.matchMedia || e.msMatchMedia;
if (n) return n(t) && n(t).matches || !1;
var i;
return F("@media " + t + " { #" + y + " { position: absolute; } }", function(t) {
i = "absolute" == (e.getComputedStyle ? getComputedStyle(t, null) : t.currentStyle).position
}), i
},
R = function() {
function e(e, r) {
r = r || t.createElement(i[e] || "div"), e = "on" + e;
var a = e in r;
return a || (r.setAttribute || (r = t.createElement("div")), r.setAttribute && r.removeAttribute && (r.setAttribute(e, ""), a = o(r[e], "function"), o(r[e], "undefined") || (r[e] = n), r.removeAttribute(e))), r = null, a
}
var i = {
select: "input",
change: "input",
submit: "form",
reset: "form",
error: "img",
load: "img",
abort: "img"
};
return e
}(),
D = {}.hasOwnProperty;
h = o(D, "undefined") || o(D.call, "undefined") ? function(e, t) {
return t in e && o(e.constructor.prototype[t], "undefined")
} : function(e, t) {
return D.call(e, t)
}, Function.prototype.bind || (Function.prototype.bind = function(e) {
var t = this;
if ("function" != typeof t) throw new TypeError;
var n = I.call(arguments, 1),
i = function() {
if (this instanceof i) {
var r = function() {};
r.prototype = t.prototype;
var o = new r,
a = t.apply(o, n.concat(I.call(arguments)));
return Object(a) === a ? a : o
}
return t.apply(e, n.concat(I.call(arguments)))
};
return i
}), T.canvas = function() {
var e = t.createElement("canvas");
return !!e.getContext && !!e.getContext("2d")
}, T.webgl = function() {
return !!e.WebGLRenderingContext
}, T.touch = function() {
var n;
return "ontouchstart" in e || e.DocumentTouch && t instanceof DocumentTouch ? n = !0 : F(["@media (", x.join("touch-enabled),("), y, ")", "{#modernizr{top:9px;position:absolute}}"].join(""), function(e) {
n = 9 === e.offsetTop
}), n
}, T.geolocation = function() {
return "geolocation" in navigator
}, T.postmessage = function() {
return !!e.postMessage
}, T.hashchange = function() {
return R("hashchange", e) && (t.documentMode === n || t.documentMode > 7)
}, T.history = function() {
return !!e.history && !!history.pushState
}, T.draganddrop = function() {
var e = t.createElement("div");
return "draggable" in e || "ondragstart" in e && "ondrop" in e
}, T.websockets = function() {
return "WebSocket" in e || "MozWebSocket" in e
}, T.rgba = function() {
return i("background-color:rgba(150,255,150,.5)"), a(_.backgroundColor, "rgba")
}, T.backgroundsize = function() {
return u("backgroundSize")
}, T.borderimage = function() {
return u("borderImage")
}, T.borderradius = function() {
return u("borderRadius")
}, T.boxshadow = function() {
return u("boxShadow")
}, T.textshadow = function() {
return "" === t.createElement("div").style.textShadow
}, T.opacity = function() {
return r("opacity:.55"), /^0.55$/.test(_.opacity)
}, T.cssanimations = function() {
return u("animationName")
}, T.csscolumns = function() {
return u("columnCount")
}, T.cssgradients = function() {
var e = "background-image:",
t = "gradient(linear,left top,right bottom,from(#9f9),to(white));",
n = "linear-gradient(left top,#9f9, white);";
return i((e + "-webkit- ".split(" ").join(t + e) + x.join(n + e)).slice(0, -e.length)), a(_.backgroundImage, "gradient")
}, T.cssreflections = function() {
return u("boxReflect")
}, T.csstransforms = function() {
return !!u("transform")
}, T.csstransforms3d = function() {
var e = !!u("perspective");
return e && "webkitPerspective" in g.style && F("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}", function(t) {
e = 9 === t.offsetLeft && 3 === t.offsetHeight
}), e
}, T.csstransitions = function() {
return u("transition")
}, T.fontface = function() {
var e;
return F('@font-face {font-family:"font";src:url("https://")}', function(n, i) {
var r = t.getElementById("smodernizr"),
o = r.sheet || r.styleSheet,
a = o ? o.cssRules && o.cssRules[0] ? o.cssRules[0].cssText : o.cssText || "" : "";
e = /src/i.test(a) && 0 === a.indexOf(i.split(" ")[0])
}), e
}, T.generatedcontent = function() {
var e;
return F(["#", y, "{font:0/0 a}#", y, ':after{content:"', w, '";visibility:hidden;font:3px/1 a}'].join(""), function(t) {
e = t.offsetHeight >= 3
}), e
}, T.video = function() {
var e = t.createElement("video"),
n = !1;
try {
(n = !!e.canPlayType) && (n = new Boolean(n), n.ogg = e.canPlayType('video/ogg; codecs="theora"').replace(/^no$/, ""), n.h264 = e.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/, ""), n.webm = e.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/, ""))
} catch (i) {}
return n
}, T.audio = function() {
var e = t.createElement("audio"),
n = !1;
try {
(n = !!e.canPlayType) && (n = new Boolean(n), n.ogg = e.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ""), n.mp3 = e.canPlayType("audio/mpeg;").replace(/^no$/, ""), n.wav = e.canPlayType('audio/wav; codecs="1"').replace(/^no$/, ""), n.m4a = (e.canPlayType("audio/x-m4a;") || e.canPlayType("audio/aac;")).replace(/^no$/, ""))
} catch (i) {}
return n
}, T.localstorage = function() {
try {
return localStorage.setItem(y, y), localStorage.removeItem(y), !0
} catch (e) {
return !1
}
}, T.webworkers = function() {
return !!e.Worker
}, T.svg = function() {
return !!t.createElementNS && !!t.createElementNS(S.svg, "svg").createSVGRect
};
for (var L in T) h(T, L) && (d = L.toLowerCase(), f[d] = T[L](), E.push((f[d] ? "" : "no-") + d));
return f.input || c(), f.addTest = function(e, t) {
if ("object" == typeof e)
for (var i in e) h(e, i) && f.addTest(i, e[i]);
else {
if (e = e.toLowerCase(), f[e] !== n) return f;
t = "function" == typeof t ? t() : t, "undefined" != typeof m && m && (g.className += " " + (t ? "" : "no-") + e), f[e] = t
}
return f
}, i(""), v = b = null,
function(e, t) {
function n(e, t) {
var n = e.createElement("p"),
i = e.getElementsByTagName("head")[0] || e.documentElement;
return n.innerHTML = "x<style>" + t + "</style>", i.insertBefore(n.lastChild, i.firstChild)
}
function i() {
var e = v.elements;
return "string" == typeof e ? e.split(" ") : e
}
function r(e) {
var t = y[e[m]];
return t || (t = {}, g++, e[m] = g, y[g] = t), t
}
function o(e, n, i) {
if (n || (n = t), c) return n.createElement(e);
i || (i = r(n));
var o;
return o = i.cache[e] ? i.cache[e].cloneNode() : f.test(e) ? (i.cache[e] = i.createElem(e)).cloneNode() : i.createElem(e), !o.canHaveChildren || p.test(e) || o.tagUrn ? o : i.frag.appendChild(o)
}
function a(e, n) {
if (e || (e = t), c) return e.createDocumentFragment();
n = n || r(e);
for (var o = n.frag.cloneNode(), a = 0, s = i(), l = s.length; l > a; a++) o.createElement(s[a]);
return o
}
function s(e, t) {
t.cache || (t.cache = {}, t.createElem = e.createElement, t.createFrag = e.createDocumentFragment, t.frag = t.createFrag()), e.createElement = function(n) {
return v.shivMethods ? o(n, e, t) : t.createElem(n)
}, e.createDocumentFragment = Function("h,f", "return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&(" + i().join().replace(/[\w\-]+/g, function(e) {
return t.createElem(e), t.frag.createElement(e), 'c("' + e + '")'
}) + ");return n}")(v, t.frag)
}
function l(e) {
e || (e = t);
var i = r(e);
return v.shivCSS && !u && !i.hasCSS && (i.hasCSS = !!n(e, "article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")), c || s(e, i), e
}
var u, c, d = "3.7.0",
h = e.html5 || {},
p = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,
f = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,
m = "_html5shiv",
g = 0,
y = {};
! function() {
try {
var e = t.createElement("a");
e.innerHTML = "<xyz></xyz>", u = "hidden" in e, c = 1 == e.childNodes.length || function() {
t.createElement("a");
var e = t.createDocumentFragment();
return "undefined" == typeof e.cloneNode || "undefined" == typeof e.createDocumentFragment || "undefined" == typeof e.createElement
}()
} catch (n) {
u = !0, c = !0
}
}();
var v = {
elements: h.elements || "abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",
version: d,
shivCSS: h.shivCSS !== !1,
supportsUnknownElements: c,
shivMethods: h.shivMethods !== !1,
type: "default",
shivDocument: l,
createElement: o,
createDocumentFragment: a
};
e.html5 = v, l(t)
}(this, t), f._version = p, f._prefixes = x, f._domPrefixes = A, f._cssomPrefixes = C, f.mq = O, f.hasEvent = R, f.testProp = function(e) {
return s([e])
}, f.testAllProps = u, f.testStyles = F, g.className = g.className.replace(/(^|\s)no-js(\s|$)/, "$1$2") + (m ? " js " + E.join(" ") : ""), f
}(this, this.document), Modernizr.addTest("cors", !!(window.XMLHttpRequest && "withCredentials" in new XMLHttpRequest)), Modernizr.addTest("csscalc", function() {
var e = "width:",
t = "calc(10px);",
n = document.createElement("div");
return n.style.cssText = e + Modernizr._prefixes.join(t + e), !!n.style.length
}), Modernizr.addTest("cssfilters", function() {
var e = document.createElement("div");
return e.style.cssText = Modernizr._prefixes.join("filter:blur(2px); "), !!e.style.length && (void 0 === document.documentMode || document.documentMode > 9)
}), Modernizr.addTest("placeholder", function() {
return "placeholder" in (Modernizr.input || document.createElement("input")) && "placeholder" in (Modernizr.textarea || document.createElement("textarea"))
}),
function() {
var e = function(e, t) {
return function() {
return e.apply(t, arguments)
}
},
t = {}.hasOwnProperty,
n = function(e, n) {
function i() {
this.constructor = e
}
for (var r in n) t.call(n, r) && (e[r] = n[r]);
return i.prototype = n.prototype, e.prototype = new i, e.__super__ = n.prototype, e
};
di.provide("di.application.module.webplayer.ads.provider.Liverail"), di.application.module.webplayer.ads.provider.Liverail = function(t) {
function i() {
return this.onVolumeChanged = e(this.onVolumeChanged, this), this.abortStartAd_ = e(this.abortStartAd_, this), this.abortInitAd_ = e(this.abortInitAd_, this), this.lrAdLog_ = e(this.lrAdLog_, this), this.lrAdError_ = e(this.lrAdError_, this), this.lrAdClickThru_ = e(this.lrAdClickThru_, this), this.lrAdPaused_ = e(this.lrAdPaused_, this), this.lrAdStopped_ = e(this.lrAdStopped_, this), this.lrAdStarted_ = e(this.lrAdStarted_, this), this.lrAdLoaded_ = e(this.lrAdLoaded_, this), this.trackEvent_ = e(this.trackEvent_, this), i.__super__.constructor.apply(this, arguments)
}
var r, o, a, s, i;
return n(i, t), i.prototype.logger = new di.log.Console("ads.provider.Liverail"), r = "#sponsor", s = 25416, o = 1331, a = "Ads:LiveRail", i = i, i.INTERFACE_SCRIPT_URL = "http://cdn-static.liverail.com/js/LiveRail.AdManager-1.0.js", i.AD_LOAD_TIMEOUT = 5, i.AD_START_TIMEOUT = 2.5, i.prototype.startWithParent = !1, i.prototype.lrInterface_ = null, i.prototype.$lrIframe_ = null, i.prototype.$adContainer_ = null, i.prototype.$adPlayer_ = null, i.prototype.hasVideo_ = !1, i.prototype.adInitTimeout_ = null, i.prototype.adStartTimeout_ = null, i.prototype.adAborted_ = !1, i.prototype.lrEventMap_ = {
AdLoaded: "lrAdLoaded_",
AdStarted: "lrAdStarted_",
AdStopped: "lrAdStopped_",
AdPaused: "lrAdPaused_",
AdClickThru: "lrAdClickThru_",
AdError: "lrAdError_",
AdLog: "lrAdLog_"
}, i.prototype.trackEvent_ = function(e, t) {
var n, i;
return n = "clickThru" === e ? "trackEvent" : "trackNonInteractiveEvent", null == t && (i = null != this.activeAd ? this.activeAd : this.pendingAd, t = (null != i ? i.has("position") : void 0) ? i.get("position") : "unknown"), di.analytics[n](a, e, t)
}, i.prototype.lrAdLoaded_ = function() {
return this.adAborted_ ? void this.logger.log("Ad loaded, but too late for anyone to care.") : (this.trackEvent_("loaded"), null != this.adInitTimeout_ && clearTimeout(this.adInitTimeout_), this.adInitTimeout_ = null, this.lrInterface_.setAdVolume(this.getWebplayerVolume_() / 100), this.adStartTimeout_ && clearTimeout(this.adStartTimeout_), this.adStartTimeout_ = setTimeout(this.abortStartAd_, 1e3 * i.AD_START_TIMEOUT), this.lrInterface_.startAd())
}, i.prototype.lrAdStarted_ = function() {
return this.adAborted_ ? void 0 : (this.trackEvent_("started"), this.adStartTimeout_ && clearTimeout(this.adStartTimeout_), this.adStartTimeout_ = null, this.adBegin_())
}, i.prototype.lrAdStopped_ = function() {
var e;
return this.trackEvent_("stopped"), null != this.adInitTimeout_ && clearTimeout(this.adInitTimeout_), this.adInitTimeout_ = null, null != (e = this.$adPlayer_) && e.remove(), this.adEnd_()
}, i.prototype.lrAdPaused_ = function() {
return this.lrInterface_.resumeAd()
}, i.prototype.lrAdClickThru_ = function() {
return this.trackEvent_("clickThru")
}, i.prototype.lrAdError_ = function(e) {
var t;
return null != this.adInitTimeout_ && clearTimeout(this.adInitTimeout_), this.adInitTimeout_ = null, this.logger.log("Ad Error: " + e), null != (t = this.$adPlayer_) && t.remove(), this.noAdsAvailable_(), "No ads available." !== e ? this.trackEvent_("error", e) : void 0
}, i.prototype.lrAdLog_ = function(e) {
return null == di.env.production ? this.logger.log("Ad Log: " + e) : void 0
}, i.prototype.initLrSubscriptions_ = function() {
return null != this.lrInterface_ ? _.each(this.lrEventMap_, function(e) {
return function(t, n) {
return "function" == typeof e[t] ? e.lrInterface_.subscribe(e[t], n) : void 0
}
}(this)) : void 0
}, i.prototype.teardownLrSubscriptions_ = function() {
var e;
if (null != (null != (e = this.lrInterface_) ? e.unsubscribe : void 0)) return _.each(this.lrEventMap_, function(e) {
return function(t, n) {
return "function" == typeof e[t] ? e.lrInterface_.unsubscribe(e[t], n) : void 0
}
}(this))
}, i.prototype.initLiverail_ = function() {
return (null != this.lrIframe_ || null != this.lrInterface_) && this.teardownLiverail_(), this.logger.log("Initializing Liverail ad manager"), this.$lrIframe_ = $("<iframe>").hide().load(function(e) {
return function() {
var t, n, r, o, a, s;
return n = e.$lrIframe_[0].contentWindow, o = n.document.createElement("script"), o.src = i.INTERFACE_SCRIPT_URL, r = e, a = !1, s = function() {
var e;
if (!a && null != n.getVPAIDAd) return r.logger.log("DEBUG: liverail script in iframe onload"), a = !0, r.lrInterface_ = "function" == typeof n.getVPAIDAd ? n.getVPAIDAd() : void 0, "function" == typeof(e = r.lrInterface_).handshakeVersion && e.handshakeVersion("2.0"), null == r.lrInterface_ ? (r.logger.log("Error: Couldn't retrieve LiveRail interface. Aborting init."), r.$lrIframe_.remove(), void(r.$lrIframe_ = null)) : (r.initLrSubscriptions_(), r.logger.log("Liverail Ad manager initialized."))
}, t = function() {
return a ? void 0 : "loaded" !== o.readyState && "completed" !== o.readyState || null == n.getVPAIDAd ? setTimeout(t, 50) : s()
}, o.onload = function() {
return s()
}, t(), n.document.body.appendChild(o)
}
}(this)), this.$lrIframe_.appendTo(document.body)
}, i.prototype.teardownLiverail_ = function() {
var e, t;
if (null != this.$lrIframe_ || null != this.lrInterface_) return this.logger.log("Tearing down Liverail ad manager"), null != (e = this.lrInterface_) && "function" == typeof e.stopAd && e.stopAd(), this.teardownLrSubscriptions_(), null != (t = this.$adPlayer_) && t.remove(), this.$adPlayer_ = null, this.lrInterface_ = null, this.$lrIframe_.remove(), this.$lrIframe_ = null
}, i.prototype.setupAdElement_ = function(e) {
var t, n, i;
return this.logger.log("Setting up ad element for ", e), n = e.get("width"), t = e.get("height"), null != (i = this.$adPlayer_) && i.remove(), this.$adPlayer_ = $("<div>", {
"class": "adprovider-liverail"
}).css("width", n).css("height", t), this.hasVideo_ && this.$adPlayer_.append($("<video>").css("width", n).css("height", t)), this.$adContainer_.append(this.$adPlayer_), this.$adPlayer_[0]
}, i.prototype.startAd = function(e) {
var t, n, r, a, l;
return i.__super__.startAd.apply(this, arguments), n = this.setupAdElement_(e), this.adAborted_ = !1, t = this.app.request("webplayer:channel"), r = {}, a = {
slot: n,
LR_PUBLISHER_ID: null != di.env.production ? s : o,
LR_SCHEMA: "vast2-vpaid",
LR_CONTENT: 4,
LR_TITLE: t.get("name"),
LR_VIDEO_ID: t.get("id"),
LR_AUTOPLAY: 1,
LR_TAGS: "music," + t.get("key"),
LR_ENVIRONMENT: this.hasVideo_ ? "html5" : "flash"
}, this.hasVideo_ && (a.videoSlot = this.$adPlayer_.find("video")[0], a.videoSlotCanAutoPlay = !0), this.logger.log("Requesting an ad from LiveRail..."), this.adInitTimeout_ = setTimeout(this.abortInitAd_, 1e3 * i.AD_LOAD_TIMEOUT), null != (l = this.lrInterface_) && "function" == typeof l.initAd ? l.initAd(e.get("width"), e.get("height"), "normal", 600, r, a) : void 0
}, i.prototype.abortInitAd_ = function() {
var e;
return this.logger.log("Ad is taking too long to load, aborting."), this.adInitTimeout_ = null, null != (e = this.$adPlayer_) && e.remove(), this.noAdsAvailable_(), this.adAborted_ = !0
}, i.prototype.abortStartAd_ = function() {
var e;
return this.logger.log("Ad is taking too long to start playing, aborting."), this.lrInterface_.stopAd(), this.adStartTimeout_ = null, null != (e = this.$adPlayer_) && e.remove(), this.noAdsAvailable_(), this.adAborted_ = !0
}, i.prototype.stopAd = function() {
var e, t;
return i.__super__.stopAd.apply(this, arguments), null != (e = this.lrInterface_) && e.stopAd(), null != (t = this.$adPlayer_) && t.remove(), this.adEnd_()
}, i.prototype.onVolumeChanged = function(e) {
var t;
return null != (t = this.lrInterface_) && "function" == typeof t.setAdVolume ? t.setAdVolume(e / 100) : void 0
}, i.prototype.onStart = function() {
var e;
this.$adContainer_ = $(r);
try {
this.initLiverail_()
} catch (t) {
e = t, this.logger.log("Caught error on init liverail: ", e.message, e)
}
return this.hasVideo_ = Modernizr.video
}, i.prototype.onBeforeStop = function() {
return this.teardownLiverail_(), this.$adContainer_ = null, this.hasVideo_ = !1
}, i
}(di.application.module.webplayer.ads.provider.Base)
}.call(this),
function() {
var e = function(e, t) {
return function() {
return e.apply(t, arguments)
}
},
t = {}.hasOwnProperty,
n = function(e, n) {
function i() {
this.constructor = e
}
for (var r in n) t.call(n, r) && (e[r] = n[r]);
return i.prototype = n.prototype, e.prototype = new i, e.__super__ = n.prototype, e
};
di.provide("di.application.module.webplayer.Ads"), di.application.module.webplayer.Ads = function(t) {
function i() {
return this.onStart = e(this.onStart, this), this.adNoneAvailable_ = e(this.adNoneAvailable_, this), this.adEnded_ = e(this.adEnded_, this), this.initProviders_ = e(this.initProviders_, this), i.__super__.constructor.apply(this, arguments)
}
return n(i, t), i.prototype.logger = new di.log.Console("di.module.webplayer.Ads"), i.prototype.startWithParent = !1, i.prototype.eventbusEvents = {
"webplayer:ad:end": "adEnded_",
"webplayer:ad:none_available": "adNoneAvailable_"
}, i.prototype.collection = null, i.prototype.availableProviders_ = {}, i.prototype.adQueue_ = new di.collection.Ads, i.prototype.adQueueCurrentAd_ = null, i.prototype.initProviders_ = function() {
var e;
return e = [], this.collection.each(function(t) {
return t.get("ads").each(function(t) {
return e.indexOf(t.get("network")) > -1 ? void 0 : e.push(t.get("network"))
})
}), _.each(e, function(e) {
return function(t) {
var n;
return n = e.app.module("webplayer.ads." + t), n instanceof di.application.module.webplayer.ads.provider.Base ? (e.availableProviders_[t] = n, n.start()) : (e.logger.log("Warning: Ad found in AdRuleset which does not have a matching implemented provider module. These ads will be ignored. Network: {" + t + "}"), e.trackNonInteractiveEvent({
category: "WebplayerAds",
action: "MissingProviderModule",
label: t
}))
}
}(this))
}, i.prototype.teardownProviders_ = function() {
var e;
return e = _.keys(this.availableProviders_), _.each(e, function(e) {
return function(t) {
return e.availableProviders_[t].stop()
}
}(this))
}, i.prototype.prerollEnd_ = function() {
return this.logger.log("Finished all queued up prerolls, triggering event."), di.eventbus.trigger("webplayer:ads:preroll-end")
}, i.prototype.nextInQueue_ = function() {
var e;
return (e = 0 === this.adQueue_.length) ? (this.logger.log("Finished all ads in queue."), "preroll" === this.adQueueCurrentAd_.get("position") && this.prerollEnd_(), void(this.adQueueCurrentAd_ = null)) : (this.logger.log("Playing ad from queue, " + this.adQueue_.length + " to go (including this one)"), this.adQueueCurrentAd_ = this.adQueue_.shift(), this.startAd_(this.adQueueCurrentAd_))
}, i.prototype.adEnded_ = function(e) {
return null != e ? e === this.adQueueCurrentAd_ ? this.nextInQueue_() : "preroll" === ("function" == typeof e.get ? e.get("position") : void 0) ? this.prerollEnd_() : void 0 : void 0
}, i.prototype.adNoneAvailable_ = function() {
return this.adEnded_()
}, i.prototype.selectAds_ = function(e) {
var t, n, i, r, o;
return o = [], t = this.app.request("webplayer:channel").get("id"), r = this.collection.findRulesets(t), i = this.app.request("webplayer:isPlaying"), n = this.app.request("webplayer:isFirstTimeListener"), _.each(r, function(t) {
return function(r) {
var a;
return a = r.get("ads").where(e), o.push.apply(o, _.filter(a, function(e) {
return e.has("display_for_first_time_visits") && e.get("display_for_first_time_visits") === !1 && n ? !1 : "preroll" === e.get("position") && i ? !1 : _.has(t.availableProviders_, e.get("network"))
}))
}
}(this)), o
}, i.prototype.startAd_ = function(e) {
var t;
this.logger.log("Requesting ad from provider {" + e.get("network") + "}");
try {
return this.availableProviders_[e.get("network")].startAd(e)
} catch (n) {
return t = n, this.logger.log("startAd_ error: " + t.message)
}
}, i.prototype.requestAds = function(e) {
var t, n;
return t = this.selectAds_(e), 0 === this.adQueue.length && 0 === t.length && di.eventbus.trigger("webplayer:ad:none_available"), (n = this.adQueue_).push.apply(n, t), null == this.adQueueCurrentAd_ ? this.nextInQueue_() : void 0
}, i.prototype.requestAd = function(e) {
var t;
return t = this.selectAds_(e), 0 === t.length ? (di.eventbus.trigger("webplayer:ad:none_available"), void this.logger.log("requestAd: no relevant ads available")) : this.startAd_(_.sample(t))
}, i.prototype.stopAds = function() {
var e;
return e = _.keys(this.availableProviders_), _.each(e, function(e) {
return function(t) {
return e.availableProviders_[t].stopAd()
}
}(this)), this.adQueue_ = []
}, i.prototype.stopAd = function() {
return this.stopAds()
}, i.prototype.onStart = function() {
return this.collection = new di.collection.AdRulesets(null, {
countryCode: this.app.options.requestEnv.countryCode
}), this.collection.fetch({
success: this.initProviders_
})
}, i.prototype.onStop = function() {
return this.collection = null, this.teardownProviders_()
}, i
}(di.application.module.Base)
}.call(this),
function() {
di.app.module("WebplayerApp.IcecastPlayer", function(e, t, n, i, r, o) {
return e.Config = n.Model.extend({
attempts: 0,
url: "/webplayer3/config",
parse: function(e) {
return AudioAddict.API.Static = AudioAddict.API.Static || {}, AudioAddict.WP = AudioAddict.WP || {}, AudioAddict.Ad = AudioAddict.Ad || {}, o.extend(AudioAddict.API.Config, e.API.Config), o.extend(AudioAddict.API.Static, e.API.Static), o.extend(AudioAddict.WP, e.WP), o.extend(AudioAddict.Ad, e.Ad), e
},
initialize: function() {
return this.on("request", function(e) {
return function() {
return e.attempts++
}
}(this))
}
})
})
}.call(this),
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.provide("di.model.Channel"), di.model.Channel = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
return t(n, e), n
}(Backbone.Model)
}.call(this),
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.provide("di.model.Webplayer"), di.model.Webplayer = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
var i;
return t(n, e), i = 80, n.prototype.localStorageKey = "webplayer-0.1", n.prototype.previousLevel = i, n.prototype.defaults = {
ready: !1,
playerType: null,
volume: i,
muted: !1,
track: null,
ad: null,
channel: null,
showing: !1,
playing: !1,
connecting: !1,
firstTimeListener: !0,
hasPlayed: !1,
src: null,
currentTime: 0,
duration: 0 / 0,
loadProgress: 100,
seeking: !1
}, n.prototype.autosave = !0, n.prototype.modelEvents = {
"change:track": "onTrackChanged",
"change:playing": "onPlayingChanged",
"change:src": "onSrcChanged",
"change:volume": "onVolumeChanged"
}, n.prototype.initialize = function() {
return Marionette.bindEntityEvents(this, this, this.modelEvents)
}, n.prototype.onVolumeChanged = function(e, t) {
return "IcecastPlayer" === e.get("playerType") ? di.eventbus.trigger("webplayer:volume:change", t) : void 0
}, n.prototype.onSrcChanged = function(e, t) {
return di.app.commands.execute("webplayer:src", t)
}, n.prototype.onPlayingChanged = function(e, t) {
return t ? e.set({
firstTimeListener: !1,
hasPlayed: !0
}) : void 0
}, n.prototype.onTrackChanged = function(e) {
return e.set({
loadProgress: e.defaults.loadProgress,
currentTime: e.defaults.currentTime
})
}, n.prototype.setVolume = function(e) {
return this.previousLevel = Math.max(.1, this.get("volume")), this.set({
volume: e,
muted: 0 === e
})
}, n.prototype.toggleMute = function() {
return this.isMuted() ? this.set({
volume: this.previousLevel,
muted: !1
}) : (this.previousLevel = Math.max(1, this.get("volume")), this.set({
volume: 0,
muted: !0
}))
}, n.prototype.isMuted = function() {
return this.get("muted")
}, n.prototype.isPlaying = function() {
return this.get("playing")
}, n.prototype.toJSON = function() {
var e;
e = n.__super__.toJSON.call(this);
try {
e.track = e.track.toJSON()
} catch (t) {}
try {
e.channel = e.channel.toJSON()
} catch (t) {}
return e
}, n.prototype.parse = function(e) {
if (e) {
switch (e.playerType) {
case "OnDemandPlayer":
e.volume > 1 && (e.volume = e.volume / 100), e.channel = null, e.track && (e.track = di.app.request("track:entity", e.track));
break;
case "IcecastPlayer":
e.track = null, e.duration = 0 / 0, e.channel && (e.channel = di.app.request("channel:entity", e.channel.key), e.channel.set("playing", !1));
break;
default:
e.channel = null, e.track = null
}
e.showing = !1, e.ad = null, e.seeking = !1, e.ready = !1, e.src = null, e.hasPlayed = !1, e.playing = !1, e.connecting = !1, 0 === e.volume && (e.volume = i), e.muted = !1, e.progress = 0, e.currentTime = 0, e.loadProgress = 0, this.legacy && (e = _.omit(e, "channel"))
}
return e
}, n
}(Backbone.AmplifyStoreModel)
}.call(this),
function() {
di.app.module("WebplayerApp.IcecastPlayer.Views", function(e, t, n, i) {
return e.ChannelDetail = i.ItemView.extend({
template: "di/ui/webplayer/channel/detail",
modelEvents: {
"change:favorite": "render"
},
initialize: function() {
return this.listenTo(this.options.channelNavMenu, "change:open", function(e) {
return function(t) {
return e.ui.channelNavButton.toggleClass("open", t)
}
}(this))
},
onBeforeShow: function() {
return this.ui.channelNavButton.toggleClass("open", this.options.channelNavMenu.isOpen())
},
ui: {
favoriteButton: ".favorite",
channelNavButton: ".channel-nav"
},
events: {
"click @ui.favoriteButton": "onFavoriteClicked",
"click @ui.channelNavButton": "toggleMenuOpenClose"
},
toggleMenuOpenClose: function() {
return this.options.channelNavMenu.toggleOpenClose()
},
onFavoriteClicked: function() {
return this.model.toggleFavorite()
},
templateHelpers: {
imageSrc: function() {
return AudioAddict.UI.img_uri(this, {
size: "64x64"
})
},
favoriteClass: function() {
return this.favorite ? "icon-star" : "icon-star-empty"
},
tooltip: function() {
return this.favorite ? "Remove '" + this.name + "' from favorite channels" : "Add '" + this.name + "' to favorite channels"
}
}
})
})
}.call(this),
function() {
di.app.module("WebplayerApp.IcecastPlayer.Views", function(e, t, n, i, r, o) {
var a, s, l, u, c, d, h;
return l = 42, u = 190, s = 64, h = 64, c = 24, d = "channel-nav-visible", a = 500, e.ChannelNavMenuItem = i.ItemView.extend({
template: "di/ui/webplayer/channel/nav_item",
tagName: "li",
modelEvents: {
"change:favorite": "render",
"change:playing": "render"
},
ui: {
playButton: ".tune-in",
channelName: ".title"
},
events: {
"click @ui.playButton": "onPlayClicked",
"click @ui.channelName": "onChannelLinkClicked"
},
onChannelLinkClicked: function() {
return this.trigger("close:menu")
},
onPlayClicked: function() {
var e;
return e = t.request("webplayer:channel"), t.execute("webplayer:play:channel", this.model), this.model !== e ? this.trigger("close:menu") : void 0
},
templateHelpers: {
imageSrc: function() {
return AudioAddict.UI.img_uri(this, {
size: "30x30"
})
}
}
}), e.ChannelNavMenuColumn = i.CollectionView.extend({
tagName: "ul",
childView: e.ChannelNavMenuItem,
childEvents: {
"close:menu": function() {
return this.trigger("close:menu")
}
},
collectionEvents: {
"change:favorite": "onFavoriteChanged"
},
onFavoriteChanged: function() {
return this.trigger("change:favorite")
},
initialize: function() {
return this.collection = new n.Collection(o.values(this.model.toJSON()))
}
}), e.ChannelNavMenu = i.CompositeView.extend({
el: r("#channel-nav"),
childView: e.ChannelNavMenuColumn,
childViewContainer: ".wrap",
template: "di/ui/webplayer/channel/nav_menu",
collection: new n.Collection,
needsRender_: !0,
ui: {
wrap: ".wrap"
},
model: new n.Model({
open: !1
}),
modelEvents: {
"change:open": "onOpenChanged"
},
collectionEvents: {
reset: "render"
},
childEvents: {
"close:menu": "close",
"change:favorite": "buildCollection_"
},
events: {
mousenter: "abortAutoclose_",
mouseleave: "onMouseleave"
},
onOpenChanged: function(e, t) {
return this.abortAutoclose_(), r(document.body).toggleClass(d, t), this.trigger("change:open", t)
},
initialize: function() {
return r(window).on("resize.channelnav", o.debounce(o.bind(this.onResize, this), 1e3, {
leading: !0
})), this.buildCollection_()
},
onDestroy: function() {
return r(window).off("resize.channelnav")
},
abortAutoclose_: function() {
return this.autocloseId ? clearTimeout(this.autocloseId) : void 0
},
onMouseleave: function() {
return this.autocloseId = setTimeout(o.bind(this.close, this), a)
},
onRender: function() {
return this.needsRender_ = !1, this.ui.wrap.width(this.collection.length * u + c)
},
onResize: function() {
return this.close(!0), this.needsRender_ = !0
},
isOpen: function() {
return this.model.get("open")
},
getMaxHeight: function() {
return r(window).height() - (s + h + c)
},
getMaxWidth: function() {
return r(document.body).width() - c
},
getMaxRows: function() {
return Math.floor(this.getMaxHeight() / l)
},
getMaxCols: function() {
return Math.floor(this.getMaxWidth() / u)
},
getMaxNumItems: function() {
return this.getMaxRows() * this.getMaxCols()
},
canFitInViewport: function() {
return this.options.channels.length <= this.getMaxNumItems()
},
buildCollection_: function() {
var e, t, i, r, o, a, s, l, u, c;
for (t = new n.Collection(this.options.channels.where({
favorite: !0
})), t.comparator = "name", t.sort(), a = this.options.channels.clone(), a.remove(t.models), a.comparator = "name", a.sort(), o = t.slice().concat(a.slice()), s = this.getMaxCols(), l = Math.ceil(o.length / s), r = [], i = c = 0; s >= 0 ? s > c : c > s; i = s >= 0 ? ++c : --c) u = Math.min(i * l, o.length), e = Math.min((i + 1) * l, o.length), r.push(o.slice(u, e));
return this.collection.reset(r)
},
toggleOpenClose: function() {
return this.model.get("open") ? this.close() : this.open()
},
addVisibleClass_: function() {
return r(document.body).addClass(d)
},
removeVisibleClass_: function() {
return r(document.body).removeClass(d)
},
slideUp_: function() {
return this.$el.css("bottom", 0)
},
slideDown_: function() {
return this.$el.css("bottom", -1 * (this.$el.outerHeight() + c))
},
open: function() {
return this.canFitInViewport() ? (this.needsRender_ && this.buildCollection_(), this.slideUp_(), this.model.set({
open: !0
})) : t.commands.execute("xhrpages:navigate", Routes.channels_path())
},
close: function(e) {
return e === !0 ? this.$el.empty() : this.slideDown_(), this.model.set({
open: !1
})
}
})
})
}.call(this),
function() {
di.app.module("WebplayerApp.IcecastPlayer.Views", function(e, t) {
return e.ConnectionTimeoutModal = di.ui.Modal.extend({
image: null,
template: "di/ui/webplayer/modal/connection_timeout",
events: {
"click [data-reconnect]": "onTryReconnect"
},
onTryReconnect: function() {
return t.commands.execute("transportmanager:play")
}
}), e.FlashInstallModal = di.ui.Modal.extend({
image: null,
template: "di/ui/webplayer/modal/flash_install"
}), e.FlashUpdateModal = di.ui.Modal.extend({
image: null,
template: "di/ui/webplayer/modal/flash_update"
}), e.FlashBlockedModal = di.ui.Modal.extend({
image: null,
template: "di/ui/webplayer/modal/flash_blocked"
})
})
}.call(this),
function() {
di.app.module("WebplayerApp.IcecastPlayer.Views", function(e, t, n, i, r, o) {
return e.ActionsMenu = i.ItemView.extend({
template: "di/ui/webplayer/settings/actions_menu",
behaviors: {
Popdown: {},
Share: {}
},
modelEvents: {
"change:track": "render"
},
ui: {
share: ".icon-share"
},
events: {
"click @ui.share": "toggleSubMenu",
mouseleave: "onLeaveSubMenu"
},
onLeaveSubMenu: function() {
return this.collapseTimeout = setTimeout(o.bind(this.collapseSubMenu, this), 400)
},
collapseSubMenu: function() {
return this.$el.removeClass("expanded")
},
onRender: function() {
var e;
return e = this.model.get("track") && this.model.get("track").get("uri"), this.ui.share.toggleClass("disabled", !e)
},
toggleSubMenu: function() {
return clearTimeout(this.collapseTimeout), this.$el.toggleClass("expanded")
}
}), e.Settings = i.LayoutView.extend({
template: "di/ui/webplayer/settings",
regions: {
volumeRegion: ".volume-region",
actionMenu: ".actions-menu"
},
ui: {
settingsButton: ".preferences"
},
events: {
"click @ui.settingsButton": "onSettingsButtonClick"
},
onBeforeShow: function() {
return this.volumeRegion.show(new e.Volume({
model: this.model
})), this.actionMenu.show(new e.ActionsMenu({
model: this.model
}))
},
onSettingsButtonClick: function() {
return t.options.user.authenticated ? t.commands.execute("xhrpages:navigate", Routes.settings_path()) : t.execute("modal:gatekeeper", {
prompt: "You must be logged in to change player preferences"
})
}
})
})
}.call(this),
function() {
di.app.module("WebplayerApp.IcecastPlayer.Views.Track", function(e, t, n, i) {
var r;
return r = "[data-comments-region]", e.Actions = i.ItemView.extend({
template: "di/ui/webplayer/track/actions",
behaviors: {
Popdown: {},
Voting: {},
Share: {
scope: "track"
}
},
serializeData: function() {
var e;
return e = i.ItemView.prototype.serializeData.call(this), e || {
id: null
}
},
modelEvents: {
"change:uri": "render",
"change:votes": "render"
},
templateHelpers: t.Mixins.Voting.templateHelpers
})
})
}.call(this),
function() {
di.app.module("WebplayerApp.IcecastPlayer.Views.Track", function(e, t, n, i) {
return e.Artwork = i.ItemView.extend({
template: "di/ui/webplayer/track/artwork",
modelEvents: {
"change:track": "render",
"change:channel": "render"
},
templateHelpers: {
imageSrc: function() {
return AudioAddict.UI.img_uri(this.track, {
size: "46x46"
}) || AudioAddict.UI.img_uri(this.channel, {
size: "46x46"
})
}
}
})
})
}.call(this),
function() {
di.app.module("WebplayerApp.IcecastPlayer.Views.Track", function(e, t, n, i) {
var r, o, a;
return a = "icon-spinner3", o = "icon-play", r = "icon-pause", e.PlayButton = i.ItemView.extend({
template: "di/ui/webplayer/track/play_button",
modelEvents: {
"change:connecting": "render",
"change:track": "render",
"change:playing": "render",
"change:ad": "render"
},
events: {
click: "onPlayPauseClick"
},
behaviors: {
KeyCommands: {
" ": "onPlayPauseClick"
}
},
onPlayPauseClick: function(e) {
return e.preventDefault(), this.model.get("connecting") || this.model.get("ad") ? void 0 : t.execute("webplayer:play:channel", this.model.get("channel"))
},
templateHelpers: function() {
return {
iconClass: function() {
return this.ad || this.connecting ? a : this.playing ? r : o
},
ariaLabel: function() {
return this.connecting ? "connecting" : this.playing ? "stop" : "play"
},
ariaAttr: function() {
return this.connecting || this.ad ? "aria-disabled" : ""
}
}
}
})
})
}.call(this),
function() {
di.provide("di.date.format"), di.date.format.secondsToTimecode = function(e, t) {
var n, i, r;
return null == e && (e = 0), null == t && (t = {}), e = Math.ceil(Math.max(e, 0)), e > 0 ? (n = Math.floor(e / 3600), e -= 3600 * n, i = di.math.pad(Math.floor(e / 60)), r = di.math.pad(e - 60 * i), n = n > 0 ? di.math.pad(n) + ":" : t.includeZeroHours ? "00:" : "", n + i + ":" + r) : "00:00"
}
}.call(this),
function() {
di.app.module("WebplayerApp.IcecastPlayer.Views.Track", function(e, t, n, i, r, o) {
var a, s, l;
return a = "animated", l = di.date.format.secondsToTimecode, s = n.Model.extend({
initialize: function() {
var e, t;
return t = this.getUnixTime(), e = this.get("started") - 2, this.get("timeDeterminate") && e > t && this.set("timeDeterminate", !1), 100 === this.getPercentComplete() ? this.set("timeDeterminate", !1) : void 0
},
getUnixTime: function() {
return Math.ceil(Date.now() / 1e3)
},
getRemainingSeconds: function() {
return Math.ceil(this.get("ended") - this.getUnixTime())
},
getElapsedSeconds: function() {
var e;
return e = this.getUnixTime() - this.get("started"), 0 > e && (console.warn("ProgressStateModel: ELAPSED time is negative. Using indeterminate progress."), e = 0, this.set({
started: this.getUnixTime(),
timeDeterminate: !1
})), Math.max(0, e)
},
getDurationFormatted: function() {
return this.get("timeDeterminate") ? l(this.get("length")) : ""
},
getElapsedFormatted: function() {
var e;
return e = this.getElapsedSeconds(), this.get("timeDeterminate") && (e = Math.min(e, this.get("length"))), l(e)
},
getPercentComplete: function() {
var e;
return this.get("timeDeterminate") ? (e = this.getElapsedSeconds() / this.get("length") * 100, Math.round(1e3 * e) / 1e3) : 100
},
getDisplayTime: function() {
var e;
return e = this.getElapsedFormatted(), this.get("timeDeterminate") && (e += " / " + this.getDurationFormatted()), e
}
}), e.ProgressBar = i.ItemView.extend({
template: "di/ui/webplayer/track/progress_bar",
progressModel: new s,
modelEvents: {
"change:playing": "onPlayingChanged",
"change:track": "onTrackChanged",
"change:ad": "onAdChanged",
"change:connecting": "onConnectingChanged"
},
ui: {
progress: ".bar",
ticker: ".timecode"
},
updateTicker: function() {
return this.ui.ticker.html(this.model.get("playing") ? this.progressModel.getDisplayTime() : "")
},
onPlayingChanged: function(e, t) {
return t ? this.updateIntervalId = setInterval(o.bind(this.updateTicker, this), 1e3) : clearInterval(this.updateIntervalId), this.render()
},
onTrackChanged: function(e, t) {
return t ? (this.progressModel = new s(t.toJSON()), this.ui.progress.clearQueue(), this.render(), this.updateTicker(), this.updateProgress()) : void 0
},
onConnectingChanged: function() {
return this.toggleAnimated(!0)
},
onAdChanged: function(e, t) {
return t ? (this.progressModel = new s(t), this.ui.progress.clearQueue(), this.render(), this.updateTicker(), this.updateProgress()) : void 0
},
toggleAnimated: function(e) {
return e ? this.ui.progress.addClass(a).width("100%") : this.render()
},
updateProgress: function() {
var e;
return this.model.get("connecting") ? this.toggleAnimated(!0) : this.model.get("playing") ? (this.ui.progress.removeClass(a), e = this.progressModel.getPercentComplete(), this.ui.progress.toggleClass(a, 100 === e), this.ui.progress.width(e + "%"), 100 !== e ? this.ui.progress.animate({
width: "100%"
}, {
duration: 1e3 * this.progressModel.getRemainingSeconds(),
easing: "linear",
queue: !1
}) : void 0) : this.toggleAnimated(!1)
},
onDestroy: function() {
return clearInterval(this.updateIntervalId)
}
})
})
}.call(this),
function() {
di.app.module("WebplayerApp.IcecastPlayer.Views.Track", function(e, t, n, i, r, o) {
return e.TitleBar = di.ui.View.extend({
template: "di/ui/webplayer/track/title",
modelEvents: {
"change:track": "render",
"change:ad": "render",
"change:playing": "render",
"change:connecting": "render",
"change:volume": "onVolumeChanged"
},
onVolumeChanged: function(e, t) {
return this.status = 0 === t ? "Volume: Muted" : "Volume: " + t + "%", clearTimeout(this.timeoutId), this.timeoutId = setTimeout(function(e) {
return function() {
return e.status = null, e.render()
}
}(this), 2e3), this.render()
},
onBeforeDestroy: function() {
return clearTimeout(this.timeoutId)
},
serializeData: function() {
var e, t, n;
return e = this.model.toJSON(), e.status = this.status, e.ad && (o.isFunction(e.ad.toJSON) && (e.ad = e.ad.toJSON()), null == (t = e.ad).track && (t.track = "Sponsored Message"), null == (n = e.ad).url && (n.url = Routes.premium_path())), e
},
templateHelpers: {
statusText: function() {
return this.status ? this.status : this.connecting ? "connecting..." : this.playing ? void 0 : "stopped"
},
primaryText: function() {
var e;
return this.statusText() ? "" : (this.track && (e = "", this.track.artist && (e = this.track.artist.name || this.track.artist), e === this.track.title && (e = ""), e && (e += " - ")), e || "")
},
secondaryText: function() {
return this.statusText() ? "" : this.track ? this.track.title || this.track.track : this.ad ? this.ad.track : ""
}
}
})
})
}.call(this),
function() {}.call(this),
function() {
di.app.module("WebplayerApp.IcecastPlayer.Views", function(e, t, n, i, r) {
var o, a, s, l;
return a = 1, l = "icon-sound", s = "icon-mute", o = 5, e.Volume = i.ItemView.extend({
template: "di/ui/webplayer/settings/volume",
modelEvents: {
"change:volume": "invalidateView"
},
ui: {
muteToggleButton: "[data-toggle-mute]",
minButton: "[data-min-volume]",
maxButton: "[data-max-volume]",
sliderHandle: ".handle",
sliderContainer: ".progress-container",
sliderBar: ".progress-bar"
},
events: {
mousewheel: "onMousewheel",
mousemove: "onMousemove",
"mousedown @ui.sliderContainer": "onVolumeSliderClick",
"mousedown @ui.sliderHandle": "onSliderHandleClick",
"click @ui.muteToggleButton": "onMuteToggleClick",
"click @ui.minButton": "onMinVolumeClick",
"click @ui.maxButton": "onMaxVolumeClick"
},
behaviors: {
Popdown: {},
KeyCommands: {
"+": "keyVolumeUp",
"=": "keyVolumeUp",
"-": "keyVolumeDown"
}
},
limitVolume: function(e) {
return Math.min(100, Math.max(0, e))
},
keyVolumeUp: function() {
var e;
return e = this.model.get("volume") + o, this.model.setVolume(this.limitVolume(e))
},
keyVolumeDown: function() {
var e;
return e = this.model.get("volume") - o, this.model.setVolume(this.limitVolume(e))
},
onMousewheel: function(e, t) {
var n;
return e.preventDefault(), n = this.model.get("volume") + t * a, this.model.setVolume(this.limitVolume(n))
},
onMousemove: function(e) {
var t;
if (this.dragging) return t = e.clientX - this.handleOffset, this.model.setVolume(this.limitVolume(t))
},
invalidateView: function() {
return this.ui.muteToggleButton.toggleClass(s, this.model.isMuted()), this.ui.muteToggleButton.toggleClass(l, !this.model.isMuted()), this.ui.sliderHandle.css("left", this.model.get("volume") + "%"), this.ui.sliderBar.width(this.model.get("volume") + "%")
},
onVolumeSliderClick: function(e) {
return e.preventDefault(), this.startDrag(), e.offsetX = e.offsetX - 2 || e.clientX - this.ui.progressContainer.offset().left + 2, this.handleOffset = e.clientX - e.offsetX, this.model.setVolume(this.limitVolume(e.offsetX))
},
onSliderHandleClick: function(e) {
return e.preventDefault(), this.startDrag(), this.handleOffset = e.clientX - e.target.offsetLeft
},
onMuteToggleClick: function() {
return this.model.toggleMute()
},
onMinVolumeClick: function() {
return this.model.setVolume(0)
},
onMaxVolumeClick: function() {
return this.model.setVolume(100)
},
startDrag: function() {
return this.dragging = !0, r(document).one("mouseup", function(e) {
return function() {
return e.dragging = !1
}
}(this))
},
templateHelpers: {
iconClass: function() {
return 0 === this.volume ? s : l
}
}
})
})
}.call(this),
function() {
di.app.module("WebplayerApp.IcecastPlayer.Views", function(e, t, n, i) {
return e.WebplayerLayout = i.LayoutView.extend({
template: "di/ui/webplayer/webplayer_layout",
className: "wrap",
regions: {
trackRegion: ".track-region",
settingsRegion: ".settings-region",
channelRegion: ".channel-region"
},
modelEvents: {
"change:playerType": "onPlayerTypeChanged"
},
onPlayerTypeChanged: function(e, t) {
return "IcecastPlayer" !== t ? this.destroy() : void 0
},
onBeforeShow: function() {
return this.trackRegion.show(new e.TrackLayout({
model: this.model
})), this.settingsRegion.show(new e.Settings({
model: this.model
})), this.channelRegion.show(new e.ChannelLayout({
model: this.model
}))
}
}), e.TrackLayout = i.LayoutView.extend({
template: "di/ui/webplayer/track/track_layout",
modelEvents: {
"change:track": "onTrackChanged"
},
regions: {
controlsRegion: ".controls",
progressRegion: ".progress",
titleRegion: ".track-title",
artworkRegion: ".artwork",
actionsRegion: ".actions-container"
},
onBeforeShow: function() {
return this.controlsRegion.show(new e.Track.PlayButton({
model: this.model
})), this.progressRegion.show(new e.Track.ProgressBar({
model: this.model
})), this.titleRegion.show(new e.Track.TitleBar({
model: this.model
})), this.artworkRegion.show(new e.Track.Artwork({
model: this.model
})), this.actionsRegion.show(new e.Track.Actions({
template: "di/ui/webplayer/track/actions_disabled"
}))
},
onTrackChanged: function(t, n) {
return this.actionsRegion.show(n && n.get("uri") ? new e.Track.Actions({
model: n
}) : new e.Track.Actions({
template: "di/ui/webplayer/track/actions_disabled"
}))
}
}), e.ChannelLayout = i.LayoutView.extend({
template: "di/ui/webplayer/channel_layout",
modelEvents: {
"change:channel": "onChannelChanged"
},
regions: {
detailRegion: ".channel-detail"
},
onBeforeShow: function() {
return this.channelNavMenu = new e.ChannelNavMenu({
channels: t.request("channel:entities")
}), this.detailRegion.show(new e.ChannelDetail({
model: this.model.get("channel"),
channelNavMenu: this.channelNavMenu
}))
},
onChannelChanged: function(t, n) {
return this.detailRegion.show(new e.ChannelDetail({
model: n,
channelNavMenu: this.channelNavMenu
}))
}
})
})
}.call(this),
function() {
di.app.module("WebplayerApp.IcecastPlayer", function(e, t, n, i, r, o) {
var a, s, l, u, c;
return this.startWithParent = !1, u = 3, a = "ad-visible", l = "IcecastPlayer", c = new di.log.Console(l), s = {
playChannel: function(n) {
var i, r, a, u;
if (u = t.request("channel:entity", n), i = u && u === s.getCurrentChannel(), a = di.app.request("webplayer:isShowingAd"), r = s.getIsPlaying(), i) {
if (a) return;
if (r) return t.commands.execute("transportmanager:stop")
}
return t.commands.execute("transportmanager:stop"), e.model.set({
playerType: l,
channel: u
}), o.defer(function() {
return t.commands.execute("transportmanager:play")
})
},
getCurrentTrack: function() {
return e.model.get("track")
},
getCurrentChannel: function() {
return e.model.get("channel")
},
getIsReady: function() {
return e.model.get("ready")
},
getIsPlaying: function() {
return e.model.get("playing")
},
getVolume: function() {
return e.model.get("volume")
},
getIsMuted: function() {
return e.model.get("muted")
},
getIsFirstTimeListener: function() {
return e.model.get("firstTimeListener")
},
onVolumeChanged: function(e, n) {
return e.get("ready") === !0 ? t.commands.execute("webplayer:setVolume", n) : void 0
},
onAdapterReady: function() {
return s.attachCommandHandlers(), s.initVolume()
},
initVolume: function() {
var n;
if (e.model.get("playerType") === l) return n = s.getVolume(), 1 > n && (n = 100 * n), t.commands.execute("webplayer:setVolume", n), e.model.set({
volume: n
})
},
onPlaybackStarted: function() {
var n;
return e.model.set({
connecting: !1,
playing: !0
}), n = t.request("channel:entity", {
playing: !0
}), null != n && n.set("playing", !1), e.model.get("channel").set("playing", !0)
},
onPlaybackStopped: function() {
return e.model.get("playerType") === l ? (e.model.set({
connecting: !1,
playing: !1,
track: null,
ad: null
}), e.model.get("channel").set("playing", !1)) : void 0
},
onConnecting: function() {
return e.model.set({
playing: !1,
connecting: !0,
showing: !0
})
},
onAdStarted: function(t) {
return e.model.set({
playerType: l,
ad: t,
track: null,
playing: !0,
connecting: !1
})
},
onAdblockBegin: function() {
return r(document.body).addClass(a)
},
onAdblockEnd: function() {
return r(document.body).removeClass(a)
},
onTrackStarted: function(i) {
var r;
return i.track_id ? (r = t.request("trackHistory:entity", {
id: i.track_id,
channel_id: i.channel_id
}), r.set(i, {
silent: !0
})) : (console.warn("Warning: track lacks an ID:", i), r = new n.Model(i)), e.model.set({
track: r,
ad: null,
playing: !0,
connecting: !1
})
},
onChannelChanged: function(e, t) {
var n;
if (t) return n = t.toJSON(), AudioAddict.API.Config.channelId = t.get("id"), r(document).trigger("Channel.Set", n), r(document).trigger("Channel.Changed", n), AudioAddict.API.Config.channel = n.key
},
attachEventbusHandlers: function() {
return e.listenTo(di.eventbus, "webplayer:playback:start", s.onPlaybackStarted), e.listenTo(di.eventbus, "webplayer:playback:stop", s.onPlaybackStopped), e.listenTo(di.eventbus, "webplayer:track:begin", s.onTrackStarted), e.listenTo(di.eventbus, "webplayer:ad:begin", s.onAdStarted), e.listenTo(di.eventbus, "webplayer:connecting", s.onConnecting), e.listenTo(di.eventbus, "webplayer:adblock:begin", s.onAdblockBegin), e.listenTo(di.eventbus, "webplayer:adblock:end", s.onAdblockEnd)
},
attachModelEventHandlers: function() {
return e.listenTo(e.model, "change:channel", s.onChannelChanged), e.listenTo(e.model, "change:volume", s.onVolumeChanged), e.listenTo(e.model, "change:playerType", s.onPlayerTypeChanged)
},
attachCommandHandlers: function() {
return t.commands.getHandler("webplayer:play:channel") ? void 0 : t.commands.setHandlers({
"webplayer:play:channel": s.playChannel,
"webplayer:adpanel:close": s.onAdblockEnd
})
},
attachHandlers: function() {
return s.attachEventbusHandlers(), s.attachModelEventHandlers()
},
createAdapter: function() {
return e.player = AudioAddict.WP.wp = new AudioAddict.WP.WebPlayer
},
fetchConfig: function() {
if (!e.config || !e.config.ready) {
if (null == e.config && (e.config = new e.Config), e.config.attempts < u) return e.config.fetch().done(function() {
return e.config.ready = !0, s.createAdapter()
}).fail(s.fetchConfig);
throw "FATAL: unable to fetch webplayer config"
}
},
start: function() {
return s.fetchConfig(), t.vent.once("webplayer:ready", s.onAdapterReady)
},
startLegacy: function(n) {
return e.listenTo(di.eventbus, "webplayer:playback:start", s.onPlaybackStarted), e.listenTo(di.eventbus, "webplayer:playback:stop", s.onPlaybackStopped), t.vent.once("webplayer:ready", s.initVolume), t.commands.setHandler("webplayer:legacy:setVolume", function(t) {
return e.model.set("volume", t)
}), s.attachModelEventHandlers(), e.model.set({
playerType: l,
channel: t.request("channel:entity", n)
}), c.log("IcecastPlayer started {legacy mode}")
}
}, e.addInitializer(function(e) {
return this.options = e, this.model = this.options.model, this.options.legacy ? s.startLegacy(this.options.channelKey) : (AudioAddict.webplayer.ui.ads.jqueryPanelDisabled = !0, s.start())
}), e.startListening = function() {
return s.attachHandlers()
}
})
}.call(this),
function() {
di.app.module("WebplayerApp.OnDemandPlayer.Adapter", function(e, t, n, i, r, o) {
return e.Base = function() {
function e() {
t.commands.setHandlers({
"webplayer:play": o.bind(this.play, this),
"webplayer:pause": o.bind(this.pause, this),
"webplayer:stop": o.bind(this.stop, this),
"webplayer:volume": o.bind(this.setVolume, this),
"webplayer:mute:toggle": o.bind(this.muteToggle, this),
"webplayer:mute": o.bind(this.mute, this),
"webplayer:unmute": o.bind(this.unmute, this),
"webplayer:src": o.bind(this.src, this),
"webplayer:seek": o.bind(this.seek, this)
}), (this.initialize || r.noop).apply(this, arguments)
}
var i;
return o.extend(e.prototype, n.Events), i = function(e) {
throw new Error("" + e + " must be implemented")
}, e.prototype.play = function() {
return i("play")
}, e.prototype.pause = function() {
return i("pause")
}, e.prototype.stop = function() {
return i("stop")
}, e.prototype.mute = function() {
return i("mute")
}, e.prototype.unmute = function() {
return i("unmute")
}, e.prototype.muteToggle = function() {
return i("muteToggle")
}, e.prototype.getVolume = function() {
return i("getVolume")
}, e.prototype.setVolume = function() {
return i("setVolume")
}, e.prototype.seek = function() {
return i("seek")
}, e.prototype.src = function() {
return i("src")
}, e
}()
})
}.call(this),
function() {
var e;
di.provide("di.math.round10"), di.provide("di.math.floor10"), di.provide("di.math.ceil10"), e = function(e, t, n) {
return "undefined" == typeof n || 0 === +n ? Math[e](t) : (t = +t, n = +n, isNaN(t) || "number" != typeof n || n % 1 !== 0 ? 0 / 0 : (t = t.toString().split("e"), t = Math[e](+(t[0] + "e" + (t[1] ? +t[1] - n : -n))), t = t.toString().split("e"), +(t[0] + "e" + (t[1] ? +t[1] + n : n))))
}, di.math.round10 = function(t, n) {
return e("round", t, n)
}, di.math.floor10 = function(t, n) {
return e("floor", t, n)
}, di.math.ceil10 = function(t, n) {
return e("ceil", t, n)
}
}.call(this),
function() {
var e;
e = $("<object>").attr("type", "application/x-shockwave-flash").attr("name", "flashblockdetect").css({
position: "absolute",
left: "-5000px",
width: 10,
height: 10
}).appendTo(document.body), _.delay(function() {
var t, n;
if (n = !1, navigator.plugins["Shockwave Flash"]) e.exists() ? "none" === e[0].style.display ? n = !0 : $("div.flc-panel").exists() ? n = !0 : $("div[bginactive]").exists() ? n = !0 : e.hasClass("CTPnodisplay") && (n = !0) : n = !0;
else if (navigator.userAgent.indexOf("MSIE") > -1) try {
new ActiveXObject("ShockwaveFlash.ShockwaveFlash")
} catch (i) {
t = i, n = !0
}
return e.remove(), n ? (console.warn("Flash is blocked"), di.app.commands.execute("flash:error", "blocked")) : void 0
}, 1e3)
}.call(this),
function() {
di.provide("di.swf.Injector"), di.swf.Embed = function() {
function e(e) {
var n;
if (e.params = _.extend({}, t.params, e.params), e.attrs = _.extend({}, t.attrs, e.attrs), e.flashvars = _.extend({}, t.flashvars, e.flashvars), this.options = _.extend({}, t, e), null == (n = this.options.attrs).id && (n.id = _.uniqueId("swf")), this.options.target || (this.options.target = _.uniqueId("swf"), $("<div>").attr("id", this.options.target).appendTo(document.body)), !this.options.swfUrl) throw "swfUrl is required";
di.env.development && (this.options.swfUrl += "?_=" + Date.now()), this.enforcePolicy()
}
var t;
return t = {
swfUrl: null,
target: null,
swfWidth: 10,
swfHeight: 10,
hidden: !0,
minVersion: "10.2",
flashvars: {},
params: {
allownetworking: !0,
allowscriptaccess: !0,
wmode: "transparent",
allowfullscreen: !1
},
attrs: {},
success: $.noop,
error: $.noop
}, e.prototype.enforcePolicy = function() {
return this.hasFlash = swfobject.getFlashPlayerVersion().major > 0, this.hasMinVersion = this.hasFlash && swfobject.hasFlashPlayerVersion(this.options.minVersion), this.doEmbed()
}, e.prototype.doEmbed = function() {
var e;
return this.hasMinVersion || (e = "update"), this.hasFlash || (e = "install"), e ? (console.warn("swf embed failed; reason: " + e), this.options.error(e), di.app.commands.execute("flash:error", e)) : di.swfobject.embedSWF(this.options.swfUrl, this.options.target, this.options.swfWidth, this.options.swfHeight, this.options.minVersion, null, this.options.flashvars, this.options.params, this.options.attrs, _.bind(this.onSwfObjectComplete, this))
}, e.prototype.onSwfObjectComplete = function(e) {
var t;
return e.success ? (this.el = e.ref, this.options.hidden && $(this.el).css({
position: "absolute",
left: -1 * this.options.swfWidth,
top: 0
}), this.options.success(this.el)) : (t = "unknown", console.warn("swf embed failed; reason: " + t), this.options.error(t), void di.app.commands.execute("flash:error", t))
}, e
}()
}.call(this),
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.app.module("WebplayerApp.OnDemandPlayer.Adapter", function(e, n, i, r, o, a) {
return e.Flash = function(e) {
function n() {
return n.__super__.constructor.apply(this, arguments)
}
return t(n, e), n.prototype.type = "flash", n.prototype.initialize = function(e) {
var t, n;
return t = a.uniqueId("_flashJsBridge") + Date.now(), this.model = e.model, n = this, new di.swf.Embed({
swfUrl: e.swfUrl,
flashvars: {
callback: t
},
success: function(e) {
return n.el = e, a.defer(function() {
return n.trigger("ready", e)
})
}
}), window[t] = a.bind(this.flashJsBridge, this)
}, n.prototype.play = function() {
return this.el.play2()
}, n.prototype.pause = function() {
return this.el.pause()
}, n.prototype.stop = function() {
return this.el.stop2()
}, n.prototype.setPosition = function(e) {
return this.seek(e)
}, n.prototype.seek = function(e) {
return this.model.get("src") && this.el.canSeekTo(e) ? (this.model.set({
currentTime: e
}), this.el.seek(e)) : void 0
}, n.prototype.setVolume = function(e) {
return this.el.setVolume(e)
}, n.prototype.getVolume = function() {
return this.el.getVolume()
}, n.prototype.mute = function() {
return this.el.setMuted(!0)
}, n.prototype.unmute = function() {
return this.el.setMuted(!1)
}, n.prototype.muteToggle = function() {
return this.el.getMuted() ? this.unmute() : this.mute()
}, n.prototype.src = function(e) {
return a.isArray(e) || (e = [e]), this.el.setSrc(e)
}, n.prototype.flashJsBridge = function(e, t) {
switch (null == this.updateModel && (this.updateModel = function(e) {
return function(t) {
return a.defer(a.bind(e.model.set, e.model, t))
}
}(this)), e) {
case "loading":
return this.updateModel({
connecting: !0
});
case "timeupdate":
return this.updateModel({
currentTime: t,
connecting: !1
});
case "playing":
case "stopped":
case "paused":
return this.updateModel({
playing: "playing" === e,
connecting: !1
});
case "ended":
return this.updateModel({
ended: !0,
playing: !1,
connecting: !1,
currentTime: 0
});
case "seeking":
return this.updateModel({
seeking: t
});
case "volumechange":
return this.updateModel({
volume: t
});
case "progress":
return this.updateModel({
loadProgress: t
})
}
}, n
}(e.Base)
})
}.call(this),
function() {
var e = {}.hasOwnProperty,
t = function(t, n) {
function i() {
this.constructor = t
}
for (var r in n) e.call(n, r) && (t[r] = n[r]);
return i.prototype = n.prototype, t.prototype = new i, t.__super__ = n.prototype, t
};
di.app.module("WebplayerApp.OnDemandPlayer.Adapter", function(e, n, i, r, o, a) {
var s;
return e.HTML5 = function(e) {
function i() {
return i.__super__.constructor.apply(this, arguments)
}
return t(i, e), i.prototype.type = "html5", i.prototype.initialize = function(e) {
if (o.browser.msie || n.options.webplayer.html5AudioEnabled === !1) throw new Error("html5 audio not enabled");
if (!this.canPlayTypes(e.formats)) throw new Error("html5 audio formats not supported: " + this.unsupportedFormats.join(", "));
return this.model = e.model, this.el = this.createElement(), a.defer(function(e) {
return function() {
return e.trigger("ready", e.el)
}
}(this))
}, i.prototype.createElement = function() {
var e, t;
return e = o(document.createElement("audio")), t = a.bind(this.onAudioEvent_, this), a.each(s, function(n) {
return e.on(n, t)
}), e[0]
}, i.prototype.canPlayTypes = function(e) {
var t;
return e.length > 0 ? (t = a.filter(e, function(e) {
return Modernizr.audio && !!Modernizr.audio[e]
}), this.unsupportedFormats = a.difference(e, t), 0 === this.unsupportedFormats.length) : !1
}, i.prototype.play = function() {
return this.el.play()
}, i.prototype.pause = function() {
return this.el.pause()
}, i.prototype.stop = function() {
return this.el.pause(), this.el.src = ""
}, i.prototype.seek = function(e) {
return this.model.get("src") ? (this.model.get("playing") || o(this.el).one("canplay", a.bind(this.el.pause, this.el)), this.el.currentTime = e) : void 0
}, i.prototype.setVolume = function(e) {
var t;
return this.el.volume !== e ? (this.el.volume = e, t = this.el.muted, this.el.muted = 0 === e) : void 0
}, i.prototype.getVolume = function() {
return this.el.volume
}, i.prototype.mute = function() {
return this.el.muted ? void 0 : (this.prevVolume = this.getVolume(), this.setVolume(0))
}, i.prototype.unmute = function() {
return this.el.muted ? this.setVolume(this.prevVolume) : void 0
}, i.prototype.muteToggle = function() {
return this.el.muted ? this.unmute() : this.mute()
}, i.prototype.src = function(e) {
return e ? (this.stop(), a.isArray(e) || (e = [e]), this.el.src = a.first(a.filter(e, function(e) {
return e.indexOf("http") > -1
}))) : void 0
}, i.prototype.onAudioEvent_ = function(e) {
switch (e.type) {
case "canplay":
return this.model.get("ended") ? this.pause() : this.play();
case "timeupdate":
return this.model.set({
currentTime: this.el.currentTime
});
case "durationchange":
return this.model.set({
duration: this.el.duration
});
case "playing":
return this.model.set({
playing: !0,
connecting: !1
});
case "pause":
return this.model.set({
ended: !1,
playing: !1,
connecting: !1
});
case "ended":
return this.model.set({
ended: !0,
playing: !1,
currentTime: 0
}), this.seek(0);
case "loadstart":
return this.model.set({
src: this.el.src,
connecting: !0
});
case "volumechange":
return this.model.set({
volume: this.el.volume,
muted: 0 === this.el.volume
});
case "seeking":
return this.model.set({
seeking: !0
});
case "seeked":
return this.model.set({
seeking: !1,
connecting: !1
})
}
}, i
}(e.Base), s = ["canplay", "durationchange", "ended", "loadstart", "pause", "play", "playing", "progress", "seeking", "seeked", "timeupdate", "volumechange"]
})
}.call(this),
function() {
di.app.module("WebplayerApp.OnDemandPlayer", function(e, t) {
return e.addInitializer(function(n) {
var i;
if (!n.legacy) {
try {
this.adapter = new e.Adapter.HTML5({
model: t.WebplayerApp.model,
formats: ["mp3", "m4a"]
})
} catch (r) {
i = r, console.warn(i.message), this.adapter = new e.Adapter.Flash({
model: t.WebplayerApp.model,
swfUrl: t.options.webplayer.swfUrl
})
}
return this.adapter.once("ready", function(e) {
return function() {
return t.vent.trigger("webplayer:adapter:ready", "OnDemandPlayer"), di.analytics.trackNonInteractiveEvent({
category: "Webplayer.Adapter",
action: e.adapter.type
})
}
}(this))
}
})
})
}.call(this),
function() {
di.app.module("WebplayerApp.OnDemandPlayer.Views", function(e, t, n, i) {
var r, o, a;
return a = "icon-play", o = "icon-pause", r = "icon-spinner3", e.PlayButton = i.ItemView.extend({
template: "di/ui/webplayer/track/play_button",
modelEvents: {
"change:playing": "render"
},
events: {
click: "onPlayPauseClick"
},
behaviors: {
KeyCommands: {
" ": "onPlayPauseClick"
}
},
onPlayPauseClick: function(e) {
return e.preventDefault(), this.model.get("hasPlayed") ? t.commands.execute(this.model.get("playing") ? "webplayer:pause" : "webplayer:play") : t.commands.execute("webplayer:play:track", this.model.get("track").get("id"))
},
templateHelpers: function() {
return {
iconClass: function() {
return this.track ? this.connecting ? r : this.playing ? o : a : ""
},
ariaLabel: function() {
return this.playing ? "pause" : "play"
},
ariaAttr: function() {
return ""
}
}
}
})
})
}.call(this),
function() {
di.app.module("WebplayerApp.OnDemandPlayer.Views", function(e, t, n, i, r, o) {
return e.ProgressBar = i.ItemView.extend({
template: "di/ui/webplayer_ondemand/progress_bar",
className: "progress-wrap",
ui: {
playProgress: ".progress-play",
loadProgress: ".progress-load",
timecode: ".timecode"
},
modelEvents: {
"change:duration": "render",
"change:loadProgress": "onLoadProgressChange",
"change:playing": "onPlayingChange",
"change:seeking": "onSeekingChange",
"change:ended": "onEndedChanged",
"change:connecting": "onConnectingChanged"
},
events: {
click: "onScrubClick"
},
onPlayingChange: function(e, t) {
return this.updateTimecode(), t ? this.timecodeRefreshID = setInterval(o.bind(this.updateTimecode, this), 1e3) : clearInterval(this.timecodeRefreshID)
},
onConnectingChanged: function(e, t) {
return this.ui.playProgress.stop().toggleClass("animated", t)
},
onLoadProgressChange: function(e, t) {
return null == t && (t = 100), this.ui.loadProgress.width("" + t + "%")
},
onSeekingChange: function(e, t) {
return t ? void 0 : (this.updateProgressBar(), this.updateTimecode())
},
onEndedChanged: function(e, t) {
return t ? this.ui.playProgress.css("width", "0%") : void 0
},
updateTimecode: function() {
var e, t, n;
return e = Math.floor(this.model.get("duration") / 3600) > 0, t = di.date.format.secondsToTimecode(this.model.get("currentTime"), {
includeZeroHours: e
}), n = di.date.format.secondsToTimecode(this.model.get("duration")), this.ui.timecode.text("" + t + " / " + n), this.updateProgressBar()
},
updateProgressBar: function() {
var e, t;
if (this.model.get("duration") > 0 && (e = this.model.get("currentTime") / this.model.get("duration"), e *= 100, !isNaN(e) && e !== this.prevProgressPct && (this.prevProgressPct = e, this.ui.playProgress.stop(), this.ui.playProgress.css("width", "" + e + "%"), this.model.get("playing")))) return Math.ceil(e) < 100 ? (t = this.model.get("duration") - this.model.get("currentTime"), this.ui.playProgress.animate({
width: "100%"
}, {
duration: 1e3 * t,
easing: "linear",
queue: !1
})) : void 0
},
onScrubClick: function(e) {
var n, i, o;
if (!this.model.get("seeking") && !this.model.get("connecting")) return o = e.offsetX || e.clientX - r(e.currentTarget).offset().left, n = o / this.$el.width(), i = this.model.get("duration") * n, t.commands.execute("webplayer:seek", i)
},
onRender: function() {
return this.prevProgressPct = null, this.updateTimecode(), this.updateProgressBar()
},
onBeforeDestroy: function() {
return clearInterval(this.timecodeRefreshID)
}
})
})
}.call(this),
function() {
di.app.module("WebplayerApp.OnDemandPlayer.Views", function(e, t, n, i) {
return e.Settings = i.LayoutView.extend({
template: "di/ui/webplayer/settings",
regions: {
volumeRegion: ".volume-region",
actionMenu: ".actions-menu"
},
ui: {
settingsButton: ".preferences"
},
events: {
"click @ui.settingsButton": "onSettingsButtonClick"
},
onBeforeShow: function() {
return this.volumeRegion.show(new e.Volume({
model: this.model
}))
},
onSettingsButtonClick: function() {
return t.options.user.authenticated ? t.commands.execute("xhrpages:navigate", Routes.settings_path()) : t.commands.execute("modal:gatekeeper", {
prompt: "You must be logged in to change player preferences"
})
}
})
})
}.call(this),
function() {
di.app.module("WebplayerApp.OnDemandPlayer.Views", function(e, t, n, i) {
return e.TrackTitle = i.ItemView.extend({
template: "di/ui/webplayer_ondemand/track_title",
modelEvents: {
"change:track": "render",
"change:playing": "render",
"change:volume": "onVolumeChanged"
},
onVolumeChanged: function(e, t) {
return this.status = 0 === t ? "Volume: Muted" : "Volume: " + Math.floor(100 * t) + "%", clearTimeout(this.timeoutId), this.timeoutId = setTimeout(function(e) {
return function() {
return e.status = null, e.render()
}
}(this), 2e3), this.render()
},
serializeData: function() {
var e;
return e = this.model.toJSON(), e.status = this.status, e
},
templateHelpers: {
primaryText: function() {
return this.status ? this.status : this.track && this.track.artist ? this.track.artist.name + " - " : ""
},
secondaryText: function() {
return this.status ? "" : this.track.title
}
}
})
})
}.call(this),
function() {
di.app.module("WebplayerApp.OnDemandPlayer.Views", function(e, t) {
var n, i, r, o;
return i = 1, o = "icon-sound", r = "icon-mute", n = .05, e.Volume = t.WebplayerApp.IcecastPlayer.Views.Volume.extend({
modelEvents: {
"change:volume": "invalidateView",
"change:muted": "invalidateView"
},
behaviors: {
Popdown: {},
KeyCommands: {
"+": "keyVolumeUp",
"=": "keyVolumeUp",
"-": "keyVolumeDown"
}
},
keyVolumeUp: function() {
var e;
return e = Math.min(this.model.get("volume") + n, 1), t.commands.execute("webplayer:volume", e)
},
keyVolumeDown: function() {
var e;
return e = Math.max(this.model.get("volume") - n, 0), t.commands.execute("webplayer:volume", e)
},
onBeforeShow: function() {
return this.model.get("volume") > 1 ? this.model.set("volume", this.model.get("volume") / 100) : void 0
},
onRender: function() {
return this.invalidateView()
},
onMousewheel: function(e, n) {
var r;
return e.preventDefault(), r = (100 * this.model.get("volume") + n * i) / 100, t.commands.execute("webplayer:volume", r)
},
onMousemove: function(e) {
var n;
if (this.dragging) return n = (e.clientX - this.handleOffset) / 100, t.commands.execute("webplayer:volume", n)
},
invalidateView: function() {
var e;
return this.model.get("muted") ? (this.ui.muteToggleButton.swapClass(o, r), e = 0) : (this.ui.muteToggleButton.swapClass(r, o), e = 100 * this.model.get("volume")), this.ui.sliderHandle.css("left", e + "%"), this.ui.sliderBar.width(e + "%")
},
onVolumeSliderClick: function(e) {
return e.preventDefault(), this.startDrag(), e.offsetX = e.offsetX - 2 || e.clientX - this.ui.progressContainer.offset().left + 2, this.handleOffset = e.clientX - e.offsetX, t.commands.execute("webplayer:volume", e.offsetX / 100)
},
onMuteToggleClick: function() {
return t.commands.execute("webplayer:mute:toggle")
},
onMinVolumeClick: function() {
return t.commands.execute("webplayer:mute")
},
onMaxVolumeClick: function() {
return t.commands.execute("webplayer:volume", 1)
}
})
})
}.call(this),
function() {
di.app.module("WebplayerApp.OnDemandPlayer.Views", function(e, t, n, i) {
return e.WebplayerLayout = i.LayoutView.extend({
template: "di/ui/webplayer/webplayer_layout",
className: "wrap",
regions: {
trackRegion: ".track-region",
settingsRegion: ".settings-region",
channelRegion: ".channel-region"
},
ui: {
currentTime: ".current-time",
progressMeter: ".progress-meter",
progressPct: ".progress-pct",
scrubber: ".progress-outer"
},
onBeforeShow: function() {
return this.trackRegion.show(new e.TrackLayout({
model: this.model
})), this.settingsRegion.show(new e.Settings({
model: this.model
}))
}
}), e.TrackLayout = i.LayoutView.extend({
template: "di/ui/webplayer_ondemand/track_layout",
regions: {
controlsRegion: ".controls",
progressRegion: ".progress",
titleRegion: ".track-title"
},
modelEvents: {
"change:playerType": "onPlayerTypeChanged"
},
onPlayerTypeChanged: function(e, t) {
return "OnDemandPlayer" !== t ? this.destroy() : void 0
},
onBeforeShow: function() {
return this.progressRegion.show(new e.ProgressBar({
model: this.model
})), this.controlsRegion.show(new e.PlayButton({
model: this.model
})), this.titleRegion.show(new e.TrackTitle({
model: this.model
}))
}
})
})
}.call(this),
function() {
di.app.module("WebplayerApp.OnDemandPlayer", function(e, t, n, i, r, o) {
var a;
return this.startWithParent = !1, a = {
getNormalizedVolume: function() {
var e;
return e = t.WebplayerApp.model.get("volume"), e > 1 && (e /= 100), e
},
playTrack: function(e) {
return t.request("current_user:isPremium") ? (t.WebplayerApp.model.set({
playerType: "OnDemandPlayer",
src: null,
duration: 0 / 0,
currentTime: 0 / 0,
playing: !1
}), t.request("track:entity", e, function(e) {
var n;
return n = e.assets({
purpose: "on-demand",
quality: "hd"
}), t.WebplayerApp.model.set({
track: e,
volume: a.getNormalizedVolume(),
src: o.values(n.urls),
duration: n.length,
currentTime: 0,
ready: !0
})
}), o.delay(function() {
return t.commands.execute("webplayer:play")
}, 500)) : void 0
}
}, e.addInitializer(function(e) {
if (e.legacy) return this.stop();
if (!t.commands.getHandler("webplayer:play:track")) return t.commands.setHandler("webplayer:play:track", a.playTrack)
})
})
}.call(this),
function() {
di.provide("di.application.module.webplayer.TransportManager"), di.app.module("webplayer.transportmanager", function(e, t) {
var n, i, r, o;
return n = !1, r = new di.log.Console("di.module.webplayer.TransportManager"), o = null, i = {
bindAdEvents_: function() {
return di.eventbus.once({
"webplayer:ads:preroll-end": i.startPlayer_,
"webplayer:ad:none_available": i.startPlayer_
})
},
unbindAdEvents_: function() {
return di.eventbus.off({
"webplayer:ads:preroll-end": i.startPlayer_,
"webplayer:ad:none_available": i.startPlayer_
})
},
startPlayer_: function() {
return function() {
return i.unbindAdEvents_(), t.commands.execute("webplayer:audio:start")
}
}(this),
playPublic_: function() {
var e, r;
return i.bindAdEvents_(), n ? "function" == typeof(r = t.module("webplayer.ads")).requestAds ? r.requestAds({
position: "preroll"
}) : void 0 : "function" == typeof(e = t.module("webplayer.ads")).requestAd ? e.requestAd({
position: "preroll"
}) : void 0
},
playPremium_: function() {
return this.startPlayer_()
}
}, e.playAudio = function(e) {
return null == e && (e = !1), e ? (r.log("Play received with skipPreroll flag, starting playback immediately."), i.startPlayer_()) : null == o ? void r.log("Play received, but no play strategy set. Aborting.") : (r.log("Play: using {" + o + "}"), i[o]())
}, e.stopAudio = function() {
var e;
return i.unbindAdEvents_(), t.commands.execute("webplayer:audio:stop"), "function" == typeof(e = t.module("webplayer.ads")).stopAds ? e.stopAds() : void 0
}, t.addInitializer(function(t) {
return o = t.user.hasPremium ? "playPremium_" : "playPublic_", this.commands.setHandlers({
"transportmanager:play": e.playAudio,
"transportmanager:stop": e.stopAudio
})
})
})
}.call(this),
function() {
di.app.module("WebplayerApp", function(e, t, n, i, r) {
var o, a, s, l, u, c;
return this.startWithParent = !1, l = "#webplayer-region", u = "wp-visible", a = "IcecastPlayer", s = "OnDemandPlayer", this.flashError = !1, c = i.Region.extend({
el: r(l),
onBeforeSwap: function(e) {
return e.$el.hide()
},
onBeforeSwapOut: function(e) {
return e.$el.fadeOut()
},
onShow: function(e) {
return e.$el.is(":hidden") ? e.$el.fadeIn() : void 0
}
}), o = {
onFlashError: function(n) {
return e.options.legacy ? void 0 : e.flashError || (e.flashError = n, t.commands.setHandler("webplayer:play:channel", function() {
return t.commands.execute("modal:flash" + n)
}), "flash" !== e.OnDemandPlayer.adapter.type) ? void 0 : t.commands.setHandler("webplayer:play:track", function() {
return t.commands.execute("modal:flash" + n)
})
},
onPlayerTypeChange: function(e, t) {
return o.show(t)
},
onShowingChanged: function(e, t) {
return r(document.body).toggleClass(u, t)
},
show: function(n) {
if (n = n || e.model.get("playerType")) {
if (!e.model.get("ready")) return void t.vent.once("webplayer:ready", function() {
return o.show(n)
});
switch (t.webplayerRegion.$el.attr("data-player-type", n), n) {
case a:
return o.showIcecastPlayer();
case s:
return o.showOnDemandPlayer()
}
}
},
showIcecastPlayer: function() {
var n;
return e.IcecastPlayer.startListening(), n = e.model.get("volume"), 1 > n && n > 0 && (n = Math.ceil(100 * n)), e.model.get("playing") && t.commands.execute("webplayer:stop"), t.webplayerRegion.show(new e.IcecastPlayer.Views.WebplayerLayout({
model: e.model
})), e.model.set({
playerType: a,
src: null,
volume: n,
showing: !0
})
},
showOnDemandPlayer: function() {
var n;
return e.IcecastPlayer.stopListening(), n = e.model.get("volume"), n > 1 && (n /= 100), t.commands.execute("transportmanager:stop"), t.webplayerRegion.show(new e.OnDemandPlayer.Views.WebplayerLayout({
model: e.model
})), e.model.set({
playerType: s,
channel: null,
volume: n,
showing: !0
})
},
autoResume: function() {
var e;
if (!t.request("webplayer:isLegacy")) {
if (!t.request("webplayer:isReady")) return t.vent.once("webplayer:ready", o.autoResume);
switch (t.request("webplayer:playerType")) {
case "IcecastPlayer":
return e = !0, t.commands.execute("transportmanager:play", e);
case "OnDemandPlayer":
return t.commands.execute("webplayer:play")
}
}
},
attachRegion: function(e) {
return e.legacy ? void 0 : t.webplayerRegion = new c
},
attachHandlers: function() {
return o.attachRequestHandlers(), o.attachModelEventHandlers(), o.attachCommandHandlers()
},
attachModelEventHandlers: function() {
return e.model.on("change:playerType", o.onPlayerTypeChange), e.model.on("change:showing", o.onShowingChanged)
},
attachRequestHandlers: function() {
return t.reqres.setHandlers({
"webplayer:channel": function() {
return e.model.get("channel")
},
"webplayer:track": function() {
return e.model.get("track")
},
"webplayer:isPlaying": function() {
return e.model.get("playing")
},
"webplayer:isShowingAd": function() {
return !!e.model.get("ad")
},
"webplayer:volume": function() {
return e.model.get("volume")
},
"webplayer:muted": function() {
return e.model.get("muted")
},
"webplayer:isFirstTimeListener": function() {
return e.model.get("firstTimeListener")
},
"webplayer:isReady": function() {
return e.model.get("ready")
},
"webplayer:playerType": function() {
return e.model.get("playerType")
},
"webplayer:isLegacy": function() {
return !!e.options.legacy
}
})
},
attachCommandHandlers: function() {
return t.commands.setHandlers({
"flash:error": o.onFlashError,
"webplayer:autoresume": o.autoResume
})
},
startSubModules: function(e) {
return t.module("WebplayerApp.OnDemandPlayer").start(e), t.module("WebplayerApp.IcecastPlayer").start(e), t.module("webplayer.transportmanager").start(), t.options.user.hasPremium ? void 0 : (t.module("webplayer.ads", di.application.module.webplayer.Ads), t.module("webplayer.ads.liverail", di.application.module.webplayer.ads.provider.Liverail), t.module("webplayer.ads").start())
}
}, e.addInitializer(function(e) {
return this.options = null != e ? e : {}, "http:" !== document.location.protocol ? this.stop() : (this.model = this.options.model = new di.model.Webplayer({}, {
autofetch: !0
}), this.model.legacy = this.options.legacy, o.attachRegion(this.options), o.startSubModules(this.options), o.attachHandlers(this.options), this.model.get("firstTimeListener") ? void 0 : o.show())
})
})
}.call(this),
function() {
di.app.module("AsyncContentModule", function(e) {
var t, n, i, r, o;
return this.startWithParent = !1, r = {}, o = new di.log.Console("AudioAddict.UI.AsyncModule"), t = function(e) {
var t;
return t = $(this), t.block(), $.get(e, function(n) {
return t.html($(n).html()), o.log("Updated async mod content from {" + e + "}")
}).always(function() {
return t.unblock()
})
}, n = function() {
return $("[data-async-url]").not(".ready").each(function() {
var e, n, i, a;
return e = $(this).addClass("ready"), i = e.data(), i.asyncInterval > 0 ? (a = function() {
return t.call(e, i.asyncUrl)
}, n = setInterval(a, i.asyncInterval), r[n] = e, o.log("Starting recurring async mod updates from {" + i.asyncUrl + "} at interval of {" + i.asyncInterval + "ms} with id {" + n + "}")) : t.call(e, i.asyncUrl)
})
}, i = function() {
return _.each(r, function(e, t) {
return e.removeClass("ready").off(), clearInterval(t), o.log("Stopped recurring async mod updates from {" + e.data("async-url") + "} for id {" + t + "}")
}), r = {}
}, e.addInitializer(n), e.addFinalizer(i)
})
}.call(this),
function() {
di.app.addInitializer(function() {
return this.module("modals", di.application.module.Modals), this.module("timedAlerts", di.application.module.TimedAlerts), this.module("ChannelBrowserApp", di.ChannelBrowserApp), this.module("TermForm", di.app.TermForm), this.module("ComparisonPlayer", di.app.ComparisonPlayer), this.module("FAQ", di.app.FAQ), this.module("Billing", di.app.Billing), this.module("WebplayerApp").start({
legacy: !1
})
}), window.onerror = function(e, t, n) {
var i;
return i = "error={" + e + "}, url={" + t + "}, line={" + n + "}", console.error(i), di.analytics.trackException(i)
}
}.call(this);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment