summaryrefslogtreecommitdiff
path: root/site/public/assets/javascripts/mx/primitives
diff options
context:
space:
mode:
Diffstat (limited to 'site/public/assets/javascripts/mx/primitives')
-rw-r--r--site/public/assets/javascripts/mx/primitives/mx.image.js50
-rw-r--r--site/public/assets/javascripts/mx/primitives/mx.soundcloud.js125
-rw-r--r--site/public/assets/javascripts/mx/primitives/mx.text.js59
-rw-r--r--site/public/assets/javascripts/mx/primitives/mx.video.js110
-rw-r--r--site/public/assets/javascripts/mx/primitives/mx.vimeo.js162
-rw-r--r--site/public/assets/javascripts/mx/primitives/mx.youtube.js196
6 files changed, 702 insertions, 0 deletions
diff --git a/site/public/assets/javascripts/mx/primitives/mx.image.js b/site/public/assets/javascripts/mx/primitives/mx.image.js
new file mode 100644
index 0000000..39bb0b5
--- /dev/null
+++ b/site/public/assets/javascripts/mx/primitives/mx.image.js
@@ -0,0 +1,50 @@
+MX.Image = MX.Object3D.extend({
+ init: function (ops) {
+
+ this.type = "Image"
+ this.media = ops.media
+ this.width = 0
+ this.height = 0
+ this.x = ops.x || 0
+ this.y = ops.y || 0
+ this.z = ops.z || 0
+ this.scale = ops.scale || 1
+ this.backface = ops.backface || false
+
+ ops.className && this.el.classList.add(ops.className)
+ this.backface && this.el.classList.add("backface-visible")
+ this.el.classList.add("image")
+ this.el.classList.add("mx-scenery")
+
+ this.el.style.backgroundRepeat = 'no-repeat'
+
+ this.load(ops)
+ },
+
+ load: function(ops){
+ var layer = this
+ layer.ops = defaults(ops, layer.ops)
+
+ var image = new Image()
+ image.onload = function(){
+ if (! layer.ops) return
+ layer.scale = layer.ops.scale || 1
+ layer.width = layer.ops.width || image.naturalWidth
+ layer.height = layer.ops.height || image.naturalHeight
+// layer.x = layer.ops.x || 0
+// layer.y = layer.ops.y || 0
+// layer.z = layer.ops.z || 0
+// layer.rotationX = layer.ops.rotationX || 0
+// layer.rotationY = layer.ops.rotationY || 0
+// layer.rotationZ = layer.ops.rotationZ || 0
+ layer.el.style.backgroundImage = "url(" + image.src + ")"
+ layer.el.classList.add('image')
+ layer.dirty = true
+ layer.ops.onload && layer.ops.onload( image )
+ layer.update()
+ }
+ image.src = ops.src;
+ if (image.complete) setTimeout(image.onload)
+ },
+
+})
diff --git a/site/public/assets/javascripts/mx/primitives/mx.soundcloud.js b/site/public/assets/javascripts/mx/primitives/mx.soundcloud.js
new file mode 100644
index 0000000..75286d9
--- /dev/null
+++ b/site/public/assets/javascripts/mx/primitives/mx.soundcloud.js
@@ -0,0 +1,125 @@
+MX.Soundcloud = MX.Object3D.extend({
+ init: function (ops) {
+
+ this.type = "Soundcloud"
+ this.media = ops.media
+ this.width = 0
+ this.height = 0
+ this.x = ops.x || 0
+ this.y = ops.y || 0
+ this.z = ops.z || 0
+ this.scale = ops.scale || 1
+ this.backface = ops.backface || false
+
+ ops.className && this.el.classList.add(ops.className)
+ this.backface && this.el.classList.add("backface-visible")
+ this.el.classList.add("audio")
+ this.el.classList.add("mx-scenery")
+
+ this.el.style.backgroundRepeat = 'no-repeat'
+ this.paused = true
+
+ this.ops = ops
+ },
+
+ load: function(ops){
+ if (ops) {
+ ops = this.ops = defaults(ops, this.ops)
+ }
+ else {
+ ops = this.ops
+ }
+
+ this.width = ops.media.width
+ this.height = ops.media.height
+
+ var tag = Parser.lookup.soundcloud.tag(ops.media)
+ var $iframe = $(tag)
+ var iframe = $iframe[0]
+ $iframe.css('z-index', '-1')
+ this.el.appendChild( iframe )
+
+ var overlay = this.overlay = document.createElement("div")
+ overlay.style.width = "100%"
+ overlay.style.height = "100%"
+ overlay.style.position = "absolute"
+ overlay.style.top = "0"
+ overlay.style.left = "0"
+ overlay.style.zIndex = "2"
+ overlay.className = "overlay"
+ this.el.appendChild(overlay)
+
+ this.player = SC.Widget( iframe )
+ this.player.setVolume(80)
+
+ this.duration = 0
+
+ this.player.bind(SC.Widget.Events.READY, this.ready.bind(this))
+// this.player.bind(SC.Widget.Events.LOAD_PROGRESS, this.loadProgress.bind(this))
+// this.player.bind(SC.Widget.Events.PLAY_PROGRESS, this.playProgress.bind(this))
+ this.player.bind(SC.Widget.Events.PLAY, this.didPlay.bind(this))
+ this.player.bind(SC.Widget.Events.PAUSE, this.didPause.bind(this))
+ this.player.bind(SC.Widget.Events.FINISH, this.finished.bind(this))
+ },
+
+ ready: function(){
+ this.seek( this.media.keyframe || 0 )
+
+ if (this.media.autoplay) {
+ this.play()
+ }
+
+ this.player.getDuration(function(duration){
+ this.duration = duration
+ }.bind(this))
+ },
+
+ play: function(){
+ this.player.play()
+ },
+
+ pause: function(){
+ this.player.pause()
+ },
+
+ toggle: function(state){
+ if (typeof state === "boolean") {
+ if (state) this.play()
+ else this.pause()
+ }
+ else {
+ this.player.toggle()
+ }
+ },
+
+ seek: function(n){
+ if (n < 1) {
+ n = n * this.duration
+ }
+ this.player.seekTo(n)
+ },
+
+ setLoop: function(state){
+ this.media.loop = state
+ },
+
+ didPlay: function(){
+ this.paused = false
+ },
+
+ didPause: function(){
+ this.paused = true
+ },
+
+ finished: function(){
+ console.log("soundcloud finished")
+ if (this.media.loop) {
+ this.seek(0)
+ this.play()
+ }
+ else if (this.bound) {
+ $(".playButton").removeClass('playing')
+ }
+ },
+
+})
diff --git a/site/public/assets/javascripts/mx/primitives/mx.text.js b/site/public/assets/javascripts/mx/primitives/mx.text.js
new file mode 100644
index 0000000..6b5681b
--- /dev/null
+++ b/site/public/assets/javascripts/mx/primitives/mx.text.js
@@ -0,0 +1,59 @@
+MX.Text = MX.Object3D.extend({
+
+ init: function (ops) {
+
+ this.type = "Text"
+
+ this.type = "Image"
+ this.media = ops.media
+ this.width = 0
+ this.height = 0
+ this.x = ops.x || 0
+ this.y = ops.y || 0
+ this.z = ops.z || 0
+ this.scale = ops.scale || 1
+ this.backface = ops.backface || false
+
+ this.scale = ops.scale || 1
+ this.width = ops.media.width
+ this.height = ops.media.height
+ this.x = ops.x || 0
+ this.y = ops.y || 0
+ this.z = ops.z || 0
+ this.rotationX = ops.rotationX || 0
+ this.rotationY = ops.rotationY || 0
+ this.rotationZ = ops.rotationZ || 0
+
+ ops.className && this.el.classList.add(ops.className)
+ this.backface && this.el.classList.add("backface-visible")
+ this.el.classList.add("mx-text")
+ this.el.classList.add("mx-scenery")
+
+ this.inner = document.createElement("div")
+ this.inner.classList.add("inner")
+ this.el.appendChild(this.inner)
+
+ this.load(ops)
+ },
+
+ load: function(ops){
+ var media = ops.media
+ if (media.font) this.setFont(media.font)
+
+ this.setText( media.description )
+ },
+
+ setFont: function(font){
+ if (! font.color || font.color[0] == "#") { font.color = [0,0,0] }
+
+ this.inner.style.fontFamily = "'" + font.family + "',sans-serif"
+ this.el.style.fontSize = (2 * font.size / devicePixelRatio) + "pt"
+ this.el.style.textAlign = font.align
+ this.el.style.color = rgb_string(font.color)
+ },
+
+ setText: function(text){
+ this.inner.innerHTML = marked( text || "" )
+ },
+
+})
diff --git a/site/public/assets/javascripts/mx/primitives/mx.video.js b/site/public/assets/javascripts/mx/primitives/mx.video.js
new file mode 100644
index 0000000..c281f02
--- /dev/null
+++ b/site/public/assets/javascripts/mx/primitives/mx.video.js
@@ -0,0 +1,110 @@
+MX.Video = MX.Object3D.extend({
+
+ init: function (ops) {
+
+ this.type = "Video"
+
+ this.media = ops.media
+ this.width = ops.media.width
+ this.height = ops.media.height
+ this.x = ops.x || 0
+ this.y = ops.y || 0
+ this.z = ops.z || 0
+ this.rotationX = ops.rotationX || 0
+ this.rotationY = ops.rotationY || 0
+ this.rotationZ = ops.rotationZ || 0
+ this.scale = ops.scale || 1
+ this.backface = ops.backface || false
+
+ ops.className && this.el.classList.add(ops.className)
+ this.backface && this.el.classList.add("backface-visible")
+ this.el.classList.add("video")
+ this.el.classList.add("mx-scenery")
+ this.paused = !! this.media.autoplay
+ this.muted = app.muted || !! this.media.mute
+ },
+
+ load: function(ops){
+ this.paused = true
+
+ this.player = document.createElement('video')
+ this.player.addEventListener("loadedmetadata", this.ready.bind(this))
+ this.player.addEventListener("error", this.error.bind(this))
+ this.player.addEventListener("ended", this.finished.bind(this))
+ this.player.width = "100%"
+ this.player.height = "100%"
+ this.player.src = this.media.url
+ this.player.load()
+
+ this.el.appendChild(this.player)
+ },
+
+ ready: function(){
+ this.seek( this.media.keyframe || 0 )
+
+ if (this.media.mute) {
+ this.mute()
+ }
+ else {
+ this.unmute()
+ }
+
+ if (this.media.autoplay) {
+ this.play()
+ }
+ },
+
+ error: function(err){
+ console.log("video error", err)
+ },
+
+ play: function(){
+ this.paused = false
+ this.player.play()
+ },
+
+ pause: function(){
+ this.paused = true
+ this.player.pause()
+ },
+
+ seek: function(n){
+ if (n < 1) {
+ n = n * this.duration()
+ }
+ this.player.currentTime = n
+ },
+
+ mute: function(){
+ this.player.muted = true
+ this.player.volume = 0
+ this.muted = true
+ },
+
+ unmute: function(){
+ this.player.muted = false
+ this.player.volume = 0.8
+ this.muted = false
+ },
+
+ setLoop: function(state){
+ this.media.loop = state
+ },
+
+ duration: function(){
+ return this.player.duration
+ },
+
+ finished: function(){
+ console.log("video finished")
+ if (this.media.loop) {
+ this.seek(0)
+ this.play()
+ }
+ else if (this.bound) {
+ $(".playButton").removeClass('playing')
+ }
+ },
+
+
+})
diff --git a/site/public/assets/javascripts/mx/primitives/mx.vimeo.js b/site/public/assets/javascripts/mx/primitives/mx.vimeo.js
new file mode 100644
index 0000000..fe5ce86
--- /dev/null
+++ b/site/public/assets/javascripts/mx/primitives/mx.vimeo.js
@@ -0,0 +1,162 @@
+MX.Vimeo = MX.Object3D.extend({
+
+ init: function (ops) {
+
+ this.type = "Vimeo"
+
+ this.media = ops.media
+ this.width = ops.media.width
+ this.height = ops.media.height
+ this.x = ops.x || 0
+ this.y = ops.y || 0
+ this.z = ops.z || 0
+ this.rotationX = ops.rotationX || 0
+ this.rotationY = ops.rotationY || 0
+ this.rotationZ = ops.rotationZ || 0
+ this.scale = ops.scale || 1
+ this.backface = ops.backface || false
+
+ ops.className && this.el.classList.add(ops.className)
+ this.backface && this.el.classList.add("backface-visible")
+ this.el.classList.add("video")
+ this.el.classList.add("mx-scenery")
+ this.paused = !! this.media.autoplay
+ this.muted = app.muted || !! this.media.mute
+ this.started = false
+ },
+
+ load: function (ops) {
+ var uid = 'player-' + Uid ()
+ var loop = this.media.loop ? 'loop=1' : ""
+ var preload = document.createElement("iframe")
+ preload.id = uid
+ preload.setAttribute("src", "//player.vimeo.com/video/" + this.media.token + "?api=1&badge=0&controls=0branding=0&byline=0&portrait=0&title=0&" + loop + "&player_id=" + uid)
+ preload.style.backgroundImage = "url(" + this.media.thumbnail + ")"
+ preload.style.width = "100%"
+ preload.style.height = "100%"
+ preload.style.border = "0"
+ preload.style.pointerEvents = "none"
+ preload.className = "preload"
+ this.el.appendChild(preload)
+ this.player = $f(preload)
+
+ this.player.addEvent('ready', $.proxy(this.ready, this))
+ },
+
+ ready: function(){
+ console.log("vimeo ready")
+
+ this.started = true
+
+ // wait until ready before binding events. other events: play, pause
+ this.player.addEvent('play', $.proxy(this.onPlay, this))
+ this.player.addEvent('pause', $.proxy(this.onPause, this))
+ this.player.addEvent('finish', $.proxy(this.finished, this))
+
+ // this is async on vimeo so call it asap
+ this.player.api('getDuration', $.proxy(function(n){
+ console.log("vimeo duration", n)
+ this.player.duration = n
+ }, this))
+
+ if (this.media.mute) {
+ this.mute()
+ }
+ else {
+ this.unmute()
+ }
+
+ this.seek( this.media.keyframe || 0 )
+
+ if (this.media.autoplay) {
+ this.play()
+ }
+ else {
+ this.pause()
+ }
+ },
+
+ error: function(err){
+ console.log("vimeo error", err)
+ },
+
+ play: function(){
+ this.paused = false
+ this.player.api('play')
+ },
+
+ pause: function(){
+ this.paused = true
+ this.player.api('pause')
+ },
+
+ seek: function(n){
+ // defer seek until we have duration
+ if (! this.duration()) {
+ setTimeout($.proxy(function(){
+ this.seek(n)
+ }, this), 300)
+ return
+ }
+
+ if (! this.started || n === 0) {
+ return
+ }
+
+ if (n < 1) {
+ n = n * this.duration()
+ }
+ this.player.api('seekTo', max(0, n-1))
+ if (this.paused) {
+ this.paused = false
+ this.play()
+ this.pause()
+ setTimeout($.proxy(function(){
+ this.pause()
+ }, this), 100)
+ }
+ },
+
+ duration: function(){
+ return this.player.duration
+ },
+
+ mute: function(){
+ this.player.api('setVolume', 0.0)
+ this.muted = true
+ },
+
+ unmute: function(){
+ this.player.api('setVolume', 0.8)
+ this.muted = false
+ },
+
+ setLoop: function(state){
+ this.media.loop = state
+ this.player.api('setLoop', state)
+ },
+
+ onPlay: function(){
+ if (this.paused) {
+ this.pause()
+ }
+ },
+
+ onPause: function(){
+ if (! this.paused) {
+ this.play()
+ }
+ },
+
+ finished: function(){
+// if (this.media.loop) {
+// this.seek(0)
+// this.play()
+// }
+// else if (this.bound) {
+ if (! this.media.loop && this.bound) {
+ $(".playButton").removeClass('playing')
+ }
+ }
+
+})
diff --git a/site/public/assets/javascripts/mx/primitives/mx.youtube.js b/site/public/assets/javascripts/mx/primitives/mx.youtube.js
new file mode 100644
index 0000000..5c92378
--- /dev/null
+++ b/site/public/assets/javascripts/mx/primitives/mx.youtube.js
@@ -0,0 +1,196 @@
+MX.Youtube = MX.Object3D.extend({
+
+ init: function (ops) {
+
+ this.type = "Youtube"
+
+ this.media = ops.media
+ this.width = ops.media.width
+ this.height = ops.media.height
+ this.x = ops.x || 0
+ this.y = ops.y || 0
+ this.z = ops.z || 0
+ this.rotationX = ops.rotationX || 0
+ this.rotationY = ops.rotationY || 0
+ this.rotationZ = ops.rotationZ || 0
+ this.scale = ops.scale || 1
+ this.backface = ops.backface || false
+
+ ops.className && this.el.classList.add(ops.className)
+ this.backface && this.el.classList.add("backface-visible")
+ this.el.classList.add("video")
+ this.el.classList.add("mx-scenery")
+ this.paused = !! this.media.autoplay
+ this.muted = app.muted || !! this.media.mute
+ },
+
+ load: function (ops) {
+ var base = this
+ var uid = 'player-' + Uid ()
+ var preload = document.createElement("div")
+ preload.id = uid
+ preload.style.backgroundImage = "url(" + this.media.thumbnail + ")"
+ preload.style.backgroundSize = "cover"
+ preload.style.width = "100%"
+ preload.style.height = "100%"
+ preload.style.pointerEvents = "none"
+ preload.style.position = "absolute"
+ preload.style.top = "0"
+ preload.style.left = "0"
+ preload.style.zIndex = "1"
+ preload.className = "preload"
+ this.el.appendChild(preload)
+
+ var overlay = this.overlay = document.createElement("div")
+ overlay.style.width = "100%"
+ overlay.style.height = "100%"
+ overlay.style.position = "absolute"
+ overlay.style.top = "0"
+ overlay.style.left = "0"
+ overlay.style.zIndex = "2"
+ overlay.className = "overlay"
+ this.el.appendChild(overlay)
+ this.defer(uid)
+ },
+
+ defer: function (uid){
+ if (! YT || ! YT.loaded) {
+ setTimeout(function(){
+ this.defer(uid)
+ }.bind(this), 300)
+ }
+ else {
+ // not sure why i need to delay here..
+ // stopped working until i added the setTimeout
+ setTimeout(function(){
+ this.build(uid)
+ }.bind(this), 20)
+ }
+ },
+
+ build: function(uid){
+ this.player = new YT.Player(uid, {
+ videoId: this.media.token,
+ width: this.width,
+ height: this.height,
+ events: {
+ onReady: this.ready.bind(this),
+ onError: this.error.bind(this),
+ onStateChange: this.statechange.bind(this),
+ },
+ playerVars: {
+ autohide: 1,
+ autoplay: 0,
+ disablekb: 1,
+ controls: 0,
+ enablejsapi: 1,
+ origin: window.location.origin,
+ fs: 0,
+ modestbranding: 1,
+ iv_load_policy: 3, // no annotations
+ loop: 0,
+ showinfo: 0,
+ rel: 0,
+ wmode: 'opaque',
+ },
+ })
+ },
+
+ ready: function(){
+ console.log("youtube ready")
+
+ if (this.media.autoplay) {
+ this.play()
+ }
+ else {
+ this.pause()
+ }
+
+ if (this.media.mute) {
+ this.mute()
+ }
+ else {
+ this.unmute()
+ }
+
+ this.seek( this.media.keyframe || 0 )
+ },
+
+ error: function(err){
+ console.log("youtube error", err)
+ },
+
+ statechange: function(e){
+ switch (e.data) {
+ case -1: // unstarted
+ break
+ case 0: // finished
+ this.finished()
+ break
+ case 1: // play
+ if (this.paused) {
+ this.pause()
+ }
+ break
+ case 2: // pause
+ break
+ case 3: // buffering
+ break
+ case 5: // cued
+ break
+ }
+ },
+
+ play: function(){
+ this.paused = false
+ this.player.playVideo()
+ },
+
+ pause: function(){
+ this.paused = true
+ this.player.pauseVideo()
+ },
+
+ seek: function(n, allowSeekAhead){
+ if (n < 1) {
+ n = n * this.duration()
+ }
+ allowSeekAhead = typeof allowSeekAhead == "boolean" ? allowSeekAhead : true
+ this.player.seekTo(n, true) // set to false if seeking manually
+ },
+
+ duration: function(){
+ return this.player.getDuration()
+ },
+
+ mute: function(){
+ this.player.mute()
+ this.muted = true
+ },
+
+ unmute: function(){
+ this.player.unMute()
+ this.player.setVolume(80)
+ this.muted = false
+ },
+
+ setLoop: function(state){
+ this.media.loop = state
+ },
+
+ finished: function(){
+ console.log("youtube finished")
+ if (this.media.loop) {
+ this.seek(0)
+ this.play()
+ }
+ else if (this.bound) {
+ $(".playButton").removeClass('playing')
+ }
+ }
+
+})
+
+window.onYouTubePlayerAPIReady = function(){
+ // console.log("youtube api ready")
+}