summaryrefslogtreecommitdiff
path: root/public/assets/javascripts
diff options
context:
space:
mode:
Diffstat (limited to 'public/assets/javascripts')
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/_scenery.js6
-rw-r--r--public/assets/javascripts/ui/editor/EditorSettings.js10
-rw-r--r--public/assets/javascripts/ui/editor/EditorView.js4
-rw-r--r--public/assets/javascripts/ui/editor/MediaUpload.js2
-rw-r--r--public/assets/javascripts/ui/editor/MediaViewer.js6
-rw-r--r--public/assets/javascripts/ui/reader/EmbedView.js76
-rw-r--r--public/assets/javascripts/ui/reader/ReaderView.js56
-rw-r--r--public/assets/javascripts/ui/reader/ShareView.js40
-rw-r--r--public/assets/javascripts/ui/reader/Tracker.js4
-rw-r--r--public/assets/javascripts/util.js13
-rw-r--r--public/assets/javascripts/vendor/polyfill.js8
11 files changed, 202 insertions, 23 deletions
diff --git a/public/assets/javascripts/rectangles/engine/scenery/_scenery.js b/public/assets/javascripts/rectangles/engine/scenery/_scenery.js
index 24c2602..f6cc8e4 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/_scenery.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/_scenery.js
@@ -22,6 +22,7 @@ var Scenery = new function(){
case 'video':
case 'youtube':
case 'vimeo':
+ if (is_mobile) return
scene_media = new Scenery.types.video (opt)
break
@@ -39,7 +40,10 @@ var Scenery = new function(){
var scene_media = base.add(opt)
// test if scenery was placed here
- if (! scene_media.bounds) {
+ if (! scene_media) {
+ return null
+ }
+ else if (! scene_media.bounds) {
base.remove( scene_media.id )
return null
}
diff --git a/public/assets/javascripts/ui/editor/EditorSettings.js b/public/assets/javascripts/ui/editor/EditorSettings.js
index 2b29961..026607a 100644
--- a/public/assets/javascripts/ui/editor/EditorSettings.js
+++ b/public/assets/javascripts/ui/editor/EditorSettings.js
@@ -110,7 +110,6 @@ var EditorSettings = FormView.extend({
clear: function(e){
e.preventDefault()
-
Scenery.removeAll()
},
@@ -215,6 +214,7 @@ var EditorSettings = FormView.extend({
clickSave: function(){
this.toggle(false)
this.save()
+ this.isVisible = true
},
success: function(data){
@@ -226,7 +226,13 @@ var EditorSettings = FormView.extend({
Minotaur.hide()
window.history.pushState(null, document.title, "/project/" + data.slug + "/edit")
-
+
+ this.parent.share.setLink( "http://vvalls.com/project/" + data.slug )
+ if (this.isVisible) {
+ this.isVisible = false
+ this.parent.share.show()
+ }
+
this.parent.data = data
},
diff --git a/public/assets/javascripts/ui/editor/EditorView.js b/public/assets/javascripts/ui/editor/EditorView.js
index 2872ab9..3773366 100644
--- a/public/assets/javascripts/ui/editor/EditorView.js
+++ b/public/assets/javascripts/ui/editor/EditorView.js
@@ -21,6 +21,7 @@ var EditorView = View.extend({
this.textEditor = new TextEditor ({ parent: this })
this.collaborators = new Collaborators ({ parent: this })
this.presets = new Presets ({ parent: this })
+ this.share = new ShareView ({ parent: this })
},
load: function(name){
@@ -41,6 +42,8 @@ var EditorView = View.extend({
ready: function(data){
$("#map").hide()
+ this.data = data
+
this.settings.load(data)
this.info.load(data)
},
@@ -70,6 +73,7 @@ var EditorView = View.extend({
hideExtras: function(){
this.mediaEditor.hide()
this.textEditor.hide()
+ this.share.hide()
Scenery.resize.hide()
Scenery.hovering = false
}
diff --git a/public/assets/javascripts/ui/editor/MediaUpload.js b/public/assets/javascripts/ui/editor/MediaUpload.js
index 65778dd..9ae90e3 100644
--- a/public/assets/javascripts/ui/editor/MediaUpload.js
+++ b/public/assets/javascripts/ui/editor/MediaUpload.js
@@ -63,7 +63,7 @@ var MediaUpload = UploadView.extend({
},
error: function(error){
- console.log(error)
+ console.log(error)
alert(error.errors.media.message)
},
diff --git a/public/assets/javascripts/ui/editor/MediaViewer.js b/public/assets/javascripts/ui/editor/MediaViewer.js
index 8cae4a4..dd17613 100644
--- a/public/assets/javascripts/ui/editor/MediaViewer.js
+++ b/public/assets/javascripts/ui/editor/MediaViewer.js
@@ -154,9 +154,11 @@ var MediaViewer = ModalView.extend({
},
addUploadedMedia: function(media){
- this.parent.mediaViewer.$deleteMedia.show()
- this.parent.mediaViewer.$noMedia.hide()
+ this.$deleteMedia.show()
+ this.$noMedia.hide()
this.add(media, this.$myMedia, true) // prepend
+ this.userToggle()
+ this.$el.scrollTop(0)
this.offset += 1
},
diff --git a/public/assets/javascripts/ui/reader/EmbedView.js b/public/assets/javascripts/ui/reader/EmbedView.js
new file mode 100644
index 0000000..7a75e00
--- /dev/null
+++ b/public/assets/javascripts/ui/reader/EmbedView.js
@@ -0,0 +1,76 @@
+var EmbedView = ModalView.extend({
+ el: ".embedView",
+
+ events: {
+ "keydown": "stopPropagation",
+ "input [name=width]": "build",
+ "input [name=height]": "build",
+ "click [name=mute]": "build",
+ "click [name=interactive]": "build",
+ "click textarea": "selectAll",
+ "click #testEmbed": "test",
+ },
+
+ defaultWidth: 600,
+ defaultHeight: 450,
+
+ initialize: function(opt){
+ this.parent = opt.parent
+ this.$embedCode = this.$("#embedCode")
+ this.$width = this.$("[name=width]")
+ this.$height = this.$("[name=height]")
+ this.$mute = this.$("[name=mute]")
+ this.$interactive = this.$("[name=interactive]")
+
+ this.$width.val(this.defaultWidth)
+ this.$height.val(this.defaultHeight)
+ },
+
+ show: function(){
+ this.build()
+ this.__super__.show.call(this)
+ },
+
+ build: function(){
+ var kode = this.getEmbedCode()
+ this.$embedCode.val( kode )
+ },
+
+ getEmbedCode: function(){
+ var mute = this.$mute.prop('checked') ? 1 : 0
+ var interactive = this.$interactive.prop('checked') ? 1 : 0
+ var width = clamp( this.$width.int(), 0, 2000) || this.defaultWidth
+ var height = clamp( this.$height.int(), 0, 2000) || this.defaultHeight
+ var link = this.parent.getLink()
+ var embed_link = link
+ embed_link += "?mute=" + mute
+ embed_link += "&embed=1"
+ if (interactive) {
+ embed_link += "&interactive=1"
+ }
+
+ var kode = "<iframe src='" + encodeURI(embed_link) + "' width='" + width + "' height='" + height + "'"
+ kode += " seamless scrolling='no' style='border: 0'"
+ kode += " webkitallowfullscreen mozallowfullscreen allowfullscreen"
+ if (! interactive) {
+ kode += " style='pointer-events:none;'"
+ }
+ kode += "></iframe>"
+
+ if (! interactive) {
+ kode = "<div style='position:relative'>" + kode + "<a href='" + encodeURI(link) + "' style='display:block;position:absolute;top:0;left:0;width:" + width + "px;height:" + height + "px;'></a></div>"
+ }
+
+ return kode
+ },
+
+ test: function(){
+ var kode = this.getEmbedCode()
+ window.open("data:text/html," + kode, "_blank")
+ },
+
+ selectAll: function(){
+ this.$embedCode[0].select()
+ },
+
+})
diff --git a/public/assets/javascripts/ui/reader/ReaderView.js b/public/assets/javascripts/ui/reader/ReaderView.js
index c132609..aea681a 100644
--- a/public/assets/javascripts/ui/reader/ReaderView.js
+++ b/public/assets/javascripts/ui/reader/ReaderView.js
@@ -13,22 +13,64 @@ var ReaderView = View.extend({
},
load: function(name){
- if (window.location.search.indexOf("noui") !== -1) {
- $(".logo,.topLinks,#editorView").hide()
+ var opt = this.getQS()
+ var mode = "default"
+ var name = sanitize(name)
+
+ if (opt.noui) {
+ $(".logo, .topLinks, #editorView, #keyhint").hide()
+ mode = "noui"
}
- else {
- this.tracker = new Tracker ()
+ if (opt.embed) {
+ $(".topLinks, .share, #edit-room-link, #keyhint").hide()
+ mode = "embed"
}
- if (window.location.search.indexOf("mute") !== -1) {
+ if (opt.mute) {
app.muted = true
}
- name = sanitize(name)
- $.get(this.projectAction + name, this.ready.bind(this))
+
+ this.tracker = new Tracker ({ mode: mode })
+
+ $.get(this.projectAction + name, this.ready.bind(this))
+ },
+
+ getQS: function(){
+ var qs = {}
+ window.location.search.replace(/^\?/,"").split("&").forEach(function(s){
+ var pair = s.split("=")
+ if (pair.length < 2) {
+ qs[pair[0]] = true
+ }
+ else {
+ qs[pair[0]] = pair[1]
+ }
+ })
+ return qs
},
ready: function(data){
$("#map").hide()
+ this.data = data
+ var is_landscape = window.innerWidth > window.innerHeight
+ if (is_desktop || (is_mobile && is_landscape)) {
+ this.build(data)
+ return
+ }
+
+ // don't build anything until we're in landscape mode, otherwise ios might crash
+ var orientationFn = orientationchange.bind(this)
+ window.addEventListener('orientationchange', orientationFn)
+ function orientationchange (e) {
+ var is_landscape = window.innerWidth > window.innerHeight
+ if (is_landscape) {
+ window.removeEventListener('orientationchange', orientationFn)
+ this.build(data)
+ }
+ }
+ },
+
+ build: function(data){
data.rooms && Rooms.deserialize(data.rooms)
data.walls && Walls.deserialize(data.walls)
data.media && Scenery.deserialize(data.media)
diff --git a/public/assets/javascripts/ui/reader/ShareView.js b/public/assets/javascripts/ui/reader/ShareView.js
index 4e5f832..dbe6f64 100644
--- a/public/assets/javascripts/ui/reader/ShareView.js
+++ b/public/assets/javascripts/ui/reader/ShareView.js
@@ -2,31 +2,61 @@ var ShareView = View.extend({
el: ".share",
events: {
+ "keydown": "stopPropagation",
"click #share_facebook": "facebook",
"click #share_twitter": "twitter",
+ "click #share_embed": "embed",
},
initialize: function(opt){
this.parent = opt.parent
+ this.embedView = new EmbedView ({ parent: this })
+ this.$link = this.$("#share_link")
+ },
+
+ toggle: function(state){
+ if (typeof state == "boolean") {
+ this.$el.toggleClass("active", state)
+ }
+ else {
+ this.$el.toggleClass("active")
+ }
+ },
+ show: function(){
+ this.toggle(true)
+ },
+ hide: function(){
+ this.toggle(false)
+ },
+
+ setLink: function(url){
+ this.$link.val( url )
+ },
+ getLink: function(){
+ var link = window.location.origin + window.location.pathname
+ link = link.replace(/\/edit\/?$/, "")
+ return link
},
facebook: function (e) {
e.preventDefault()
- var msg = $(".roomName").html() + " on VValls"
- var url = "https://www.facebook.com/share.php?u=" + encodeURIComponent(window.location.origin + window.location.pathname) + "&t=" + encodeURIComponent(msg);
+ var link = this.getLink()
+ var msg = app.controller.data.name + " on VValls"
+ var url = "https://www.facebook.com/share.php?u=" + encodeURIComponent(link) + "&t=" + encodeURIComponent(msg)
window.open(url, "_blank")
},
twitter: function (e) {
e.preventDefault()
- var msg = $(".roomName").html() + " on VValls"
- var url = "https://twitter.com/home?status=" + encodeURIComponent(window.location.origin + window.location.pathname + " " + msg);
+ var link = this.getLink()
+ var msg = app.controller.data.name + " on VValls"
+ var url = "https://twitter.com/home?status=" + encodeURIComponent(link + " " + msg)
window.open(url, "_blank")
},
embed: function (e) {
e.preventDefault()
-
+ this.embedView.show()
},
})
diff --git a/public/assets/javascripts/ui/reader/Tracker.js b/public/assets/javascripts/ui/reader/Tracker.js
index beef071..bad42a8 100644
--- a/public/assets/javascripts/ui/reader/Tracker.js
+++ b/public/assets/javascripts/ui/reader/Tracker.js
@@ -13,7 +13,7 @@ var Tracker = Fiber.extend(function(base){
this.events = []
this.bind()
- this.trackPageview()
+ this.trackPageview(opt)
},
bind: function () {
@@ -29,7 +29,7 @@ var Tracker = Fiber.extend(function(base){
},
trackPageview: function(opt){
- this.pushEvent([ "view" ])
+ this.pushEvent([ "view", opt.mode ])
},
//
diff --git a/public/assets/javascripts/util.js b/public/assets/javascripts/util.js
index 2fa994a..1749836 100644
--- a/public/assets/javascripts/util.js
+++ b/public/assets/javascripts/util.js
@@ -239,4 +239,17 @@ if (!Function.prototype.bind) {
}());
+function selectElementContents(el) {
+ if (window.getSelection && document.createRange) {
+ var sel = window.getSelection();
+ var range = document.createRange();
+ range.selectNodeContents(el);
+ sel.removeAllRanges();
+ sel.addRange(range);
+ } else if (document.selection && document.body.createTextRange) {
+ var textRange = document.body.createTextRange();
+ textRange.moveToElementText(el);
+ textRange.select();
+ }
+}
diff --git a/public/assets/javascripts/vendor/polyfill.js b/public/assets/javascripts/vendor/polyfill.js
index 8e4b9dc..499cbc5 100644
--- a/public/assets/javascripts/vendor/polyfill.js
+++ b/public/assets/javascripts/vendor/polyfill.js
@@ -53,10 +53,12 @@ function has3d(){
})( navigator.userAgent );
// Naive useragent detection pattern
-var is_iphone = (navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i));
-var is_ipad = (navigator.userAgent.match(/iPad/i));
+var is_iphone = (navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))
+var is_ipad = (navigator.userAgent.match(/iPad/i))
var is_android = (navigator.userAgent.match(/Android/i))
-var is_mobile = is_iphone || is_ipad || is_android;
+var is_mobile = is_iphone || is_ipad || is_android
+var is_desktop = ! is_mobile;
+
// rAF shim
(function() {