summaryrefslogtreecommitdiff
path: root/public/assets/javascripts
diff options
context:
space:
mode:
Diffstat (limited to 'public/assets/javascripts')
-rw-r--r--public/assets/javascripts/app.js8
-rw-r--r--public/assets/javascripts/mx/extensions/mx.movements.js9
-rw-r--r--public/assets/javascripts/mx/primitives/mx.video.js5
-rw-r--r--public/assets/javascripts/mx/primitives/mx.vimeo.js3
-rw-r--r--public/assets/javascripts/mx/primitives/mx.youtube.js16
-rw-r--r--public/assets/javascripts/rectangles/engine/map/ui_editor.js13
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/_scenery.js2
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/move.js44
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/resize.js2
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/types/_object.js39
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/types/image.js1
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/types/text.js2
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/types/video.js1
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/undo.js15
-rw-r--r--public/assets/javascripts/rectangles/models/vec2.js6
-rw-r--r--public/assets/javascripts/rectangles/util/undostack.js1
-rw-r--r--public/assets/javascripts/ui/_router.js9
-rw-r--r--public/assets/javascripts/ui/editor/EditorSettings.js8
-rw-r--r--public/assets/javascripts/ui/editor/MediaEditor.js9
-rw-r--r--public/assets/javascripts/ui/editor/TextEditor.js6
-rw-r--r--public/assets/javascripts/ui/lib/FormView.js8
-rw-r--r--public/assets/javascripts/ui/lib/View.js5
-rw-r--r--public/assets/javascripts/ui/reader/ShareView.js7
-rw-r--r--public/assets/javascripts/ui/site/ProjectList.js2
-rw-r--r--public/assets/javascripts/vendor/polyfill.js5
25 files changed, 164 insertions, 62 deletions
diff --git a/public/assets/javascripts/app.js b/public/assets/javascripts/app.js
index f3da470..b4eb9e6 100644
--- a/public/assets/javascripts/app.js
+++ b/public/assets/javascripts/app.js
@@ -1,9 +1,4 @@
-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;
-
if (is_mobile) {
// window.location.href = "mobile.html"
$("html").addClass("mobile");
@@ -15,9 +10,6 @@ else {
$("html").addClass("desktop");
}
-$(function(){
- new WOW().init()
-})
var scene, cam, map;
diff --git a/public/assets/javascripts/mx/extensions/mx.movements.js b/public/assets/javascripts/mx/extensions/mx.movements.js
index dc9660b..2c231ae 100644
--- a/public/assets/javascripts/mx/extensions/mx.movements.js
+++ b/public/assets/javascripts/mx/extensions/mx.movements.js
@@ -155,6 +155,15 @@ MX.Movements = function (cam) {
app.controller.toolbar.toggleMap()
}
break
+
+ case 8: // backspace
+ e.preventDefault()
+ if (app.controller.mediaEditor.scenery) {
+ app.controller.mediaEditor.scenery.remove()
+ }
+ else if (app.controller.textEditor.scenery) {
+ app.controller.textEditor.scenery.remove()
+ }
}
},
diff --git a/public/assets/javascripts/mx/primitives/mx.video.js b/public/assets/javascripts/mx/primitives/mx.video.js
index 12d3dcb..333e1d2 100644
--- a/public/assets/javascripts/mx/primitives/mx.video.js
+++ b/public/assets/javascripts/mx/primitives/mx.video.js
@@ -45,6 +45,9 @@ MX.Video = MX.Object3D.extend({
if (this.media.mute) {
this.mute()
}
+ else {
+ this.unmute()
+ }
if (this.media.autoplay) {
this.play()
@@ -74,11 +77,13 @@ MX.Video = MX.Object3D.extend({
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
},
diff --git a/public/assets/javascripts/mx/primitives/mx.vimeo.js b/public/assets/javascripts/mx/primitives/mx.vimeo.js
index 4922519..e71b105 100644
--- a/public/assets/javascripts/mx/primitives/mx.vimeo.js
+++ b/public/assets/javascripts/mx/primitives/mx.vimeo.js
@@ -62,6 +62,9 @@ MX.Vimeo = MX.Object3D.extend({
if (this.media.mute) {
this.mute()
}
+ else {
+ this.unmute()
+ }
this.seek( this.media.keyframe || 0 )
diff --git a/public/assets/javascripts/mx/primitives/mx.youtube.js b/public/assets/javascripts/mx/primitives/mx.youtube.js
index 873348f..3f342a1 100644
--- a/public/assets/javascripts/mx/primitives/mx.youtube.js
+++ b/public/assets/javascripts/mx/primitives/mx.youtube.js
@@ -34,9 +34,22 @@ MX.Youtube = MX.Object3D.extend({
preload.style.width = this.media.width + "px"
preload.style.height = this.media.height + "px"
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)
},
@@ -96,6 +109,9 @@ MX.Youtube = MX.Object3D.extend({
if (this.media.mute) {
this.mute()
}
+ else {
+ this.unmute()
+ }
this.seek( this.media.keyframe || 0 )
},
diff --git a/public/assets/javascripts/rectangles/engine/map/ui_editor.js b/public/assets/javascripts/rectangles/engine/map/ui_editor.js
index 1ab9c73..c838b8b 100644
--- a/public/assets/javascripts/rectangles/engine/map/ui_editor.js
+++ b/public/assets/javascripts/rectangles/engine/map/ui_editor.js
@@ -70,6 +70,9 @@ Map.UI.Editor = function(map){
Rooms.remove(room)
app.tube("builder-destroy-room", room)
+
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
return
}
else if (intersects.length) {
@@ -178,6 +181,9 @@ Map.UI.Editor = function(map){
Rooms.rebuild()
app.tube("builder-pick-room", room)
+
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
}
}
if (base.resizing || base.dragging) {
@@ -196,6 +202,9 @@ Map.UI.Editor = function(map){
redo: base.dragging.copy()
})
Rooms.rebuild()
+
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
}
var intersects = Rooms.filter(function(r){
@@ -231,6 +240,10 @@ Map.UI.Editor = function(map){
redo: intersects[0].copy()
})
Rooms.rebuild()
+
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
+
wheelState = null
}, 250)
}
diff --git a/public/assets/javascripts/rectangles/engine/scenery/_scenery.js b/public/assets/javascripts/rectangles/engine/scenery/_scenery.js
index 3d3067f..24c2602 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/_scenery.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/_scenery.js
@@ -6,7 +6,7 @@ var Scenery = new function(){
base.list = {}
base.nextMedia = null
- base.mouse = new mouse ({ use_offset: false })
+ base.mouse = new mouse ({ use_offset: false, mousedownUsesCapture: true })
base.init = function(){
base.resize.init()
diff --git a/public/assets/javascripts/rectangles/engine/scenery/move.js b/public/assets/javascripts/rectangles/engine/scenery/move.js
index 7d148cf..12705d3 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/move.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/move.js
@@ -2,7 +2,7 @@
Scenery.move = function(base){
var x, y, z, position, dimension, bounds
- var dragging = false
+ var dragging = false, moved = false
var oldState
this.bind = function(){
@@ -22,18 +22,9 @@ Scenery.move = function(base){
}
function down (e, cursor){
- if (e.target != base.mx.el) return;
+ if (e.target != base.mx.el && (e.target != base.mx.overlay)) return;
if (editor.permissions.destroy) {
- UndoStack.push({
- type: 'destroy-scenery',
- undo: base.serialize(),
- redo: { id: base.id },
- })
-
- // TODO: watch individual scenery object here
- Minotaur.watch( app.router.editorView.settings )
-
- Scenery.remove(base.id)
+ base.remove()
return
}
@@ -45,6 +36,7 @@ Scenery.move = function(base){
return
}
dragging = true
+ moved = false
x = base.mx.x
y = base.mx.y
z = base.mx.z
@@ -59,6 +51,8 @@ Scenery.move = function(base){
function drag (e, cursor){
if (! dragging) return
+
+ moved = true
var flipX = base.wall.side & (FRONT | RIGHT)
@@ -89,21 +83,23 @@ Scenery.move = function(base){
function up (e, cursor){
if (! dragging || ! oldState) return
-
- dragging = false
- document.body.classList.remove("dragging")
+
+ if (moved) {
+ UndoStack.push({
+ type: 'update-scenery',
+ undo: oldState,
+ redo: base.serialize(),
+ })
- UndoStack.push({
- type: 'update-scenery',
- undo: oldState,
- redo: base.serialize(),
- })
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
+ }
- // TODO: watch individual scenery object here
- Minotaur.watch( app.router.editorView.settings )
-
+ dragging = moved = false
oldState = null
- }
+ document.body.classList.remove("dragging")
+
+ }
function switch_wall (e, target, cursor){
if (! dragging) return
diff --git a/public/assets/javascripts/rectangles/engine/scenery/resize.js b/public/assets/javascripts/rectangles/engine/scenery/resize.js
index 0ce976e..e424829 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/resize.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/resize.js
@@ -88,8 +88,8 @@ Scenery.resize = new function(){
// pick a new object to focus on and show the dots
base.show = function(new_object) {
// if (obj === new_object) return
+ if (! new_object) return
obj = new_object
-
base.add_dots()
base.rotate_dots()
base.move_dots()
diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/_object.js b/public/assets/javascripts/rectangles/engine/scenery/types/_object.js
index 4e5e2c5..10ba2b0 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/types/_object.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/types/_object.js
@@ -62,20 +62,43 @@ Scenery.types.base = Fiber.extend(function(base){
bind: function(){
this.move.bind()
- $(this.mx.el).bind({
- mouseenter: this.enter,
- mouseleave: this.leave,
- })
+// $(this.mx.el).bind({
+// mouseenter: this.enter,
+// mouseleave: this.leave,
+// })
},
unbind: function(){
this.move.unbind()
- $(this.mx.el).unbind({
- mouseenter: this.enter,
- mouseleave: this.leave,
- })
+// $(this.mx.el).unbind({
+// mouseenter: this.enter,
+// mouseleave: this.leave,
+// })
},
+ remove: function(){
+ UndoStack.push({
+ type: 'destroy-scenery',
+ undo: this.serialize(),
+ redo: { id: this.id },
+ })
+
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
+
+ Scenery.remove(this.id)
+
+ Scenery.resize.hide()
+ if (app.controller.mediaEditor) {
+ app.controller.mediaEditor.tainted = false
+ app.controller.mediaEditor.hide()
+ }
+ if (app.controller.textEditor) {
+ app.controller.textEditor.tainted = false
+ app.controller.textEditor.hide()
+ }
+ },
+
destroy: function(){
this.unbind()
scene.remove(this.mx)
diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/image.js b/public/assets/javascripts/rectangles/engine/scenery/types/image.js
index 10fc917..848f8d4 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/types/image.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/types/image.js
@@ -55,6 +55,7 @@ Scenery.types.image = Scenery.types.base.extend(function(base){
this.mx.move(data.position)
this.mx.ops.width = data.dimensions.a
this.mx.ops.height = data.dimensions.b
+ this.dimensions.deserialize(data.dimensions)
},
}
diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/text.js b/public/assets/javascripts/rectangles/engine/scenery/types/text.js
index a10a332..dd1385f 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/types/text.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/types/text.js
@@ -68,7 +68,9 @@ Scenery.types.text = Scenery.types.base.extend(function(base){
this.mx.move(data.position)
this.mx.ops.width = data.dimensions.a
this.mx.ops.height = data.dimensions.b
+ this.dimensions.deserialize(data.dimensions)
},
+
}
return exports
diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/video.js b/public/assets/javascripts/rectangles/engine/scenery/types/video.js
index a669a90..d83cc63 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/types/video.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/types/video.js
@@ -117,6 +117,7 @@ Scenery.types.video = Scenery.types.base.extend(function(base){
this.mx.move(data.position)
this.mx.ops.width = data.dimensions.a
this.mx.ops.height = data.dimensions.b
+ this.dimensions.deserialize(data.dimensions)
},
}
diff --git a/public/assets/javascripts/rectangles/engine/scenery/undo.js b/public/assets/javascripts/rectangles/engine/scenery/undo.js
index 3deb764..6ad9e0d 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/undo.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/undo.js
@@ -4,12 +4,13 @@
type: "create-scenery",
undo: function(state){
Scenery.remove(state.id)
+ Scenery.resize.hide()
// TODO: watch individual scenery object here
Minotaur.watch( app.router.editorView.settings )
},
redo: function(state){
- Scenery.deserialize([ state ])
+ var scenery = Scenery.deserialize([ state ])
Scenery.resize.show( scenery )
// TODO: watch individual scenery object here
@@ -20,9 +21,10 @@
type: "update-scenery",
undo: function(state){
var scenery = Scenery.find(state.id)
+ var wall = Walls.find( state.wall_id )
scenery.deserialize(state)
- scenery.set_wall(Walls.find( state.wall_id ))
+ scenery.set_wall({ wall: wall })
if (editor.permissions.resize) {
Scenery.resize.show(scenery)
@@ -33,13 +35,15 @@
},
redo: function(state){
var scenery = Scenery.find(state.id)
+ var wall = Walls.find( state.wall_id )
+
scenery.deserialize(state)
- scenery.set_wall(Walls.find( state.wall_id ))
+ scenery.set_wall({ wall: wall })
if (editor.permissions.resize) {
Scenery.resize.show(scenery)
- Scenery.resize.rotate_dots()
Scenery.resize.move_dots()
+ Scenery.resize.rotate_dots()
}
// TODO: watch individual scenery object here
@@ -49,13 +53,14 @@
{
type: "destroy-scenery",
undo: function(state){
- Scenery.deserialize([ state ])
+ var scenery = Scenery.deserialize([ state ])
Scenery.resize.show( scenery )
// TODO: watch individual scenery object here
Minotaur.watch( app.router.editorView.settings )
},
redo: function(state){
+ Scenery.resize.hide()
Scenery.remove(state.id)
// TODO: watch individual scenery object here
diff --git a/public/assets/javascripts/rectangles/models/vec2.js b/public/assets/javascripts/rectangles/models/vec2.js
index f28df54..14d0e6b 100644
--- a/public/assets/javascripts/rectangles/models/vec2.js
+++ b/public/assets/javascripts/rectangles/models/vec2.js
@@ -206,7 +206,11 @@
return "[" + this.a + " " + this.b + "]"
}
vec2.prototype.serialize = function(){
- return [ ~~this.a, ~~this.b ]
+ return [ round(this.a), round(this.b) ]
+ }
+ vec2.prototype.deserialize = function(data){
+ this.a = data[0]
+ this.b = data[1]
}
vec2.prototype.quantize = function(n){
n = n || 10
diff --git a/public/assets/javascripts/rectangles/util/undostack.js b/public/assets/javascripts/rectangles/util/undostack.js
index 959e3d1..040a4eb 100644
--- a/public/assets/javascripts/rectangles/util/undostack.js
+++ b/public/assets/javascripts/rectangles/util/undostack.js
@@ -10,6 +10,7 @@
this.pointer++
this.stack[this.pointer] = action
this.purge()
+ this.debug && console.log("push", action.type)
}
UndoStack.prototype.purge = function(){
if (this.stack.length-1 == this.pointer) return
diff --git a/public/assets/javascripts/ui/_router.js b/public/assets/javascripts/ui/_router.js
index d5a8e7f..7337357 100644
--- a/public/assets/javascripts/ui/_router.js
+++ b/public/assets/javascripts/ui/_router.js
@@ -73,12 +73,13 @@ var SiteRouter = Router.extend({
this.route()
- /*
if (is_mobile) {
- $(".topLinks").hide()
- $(".share").hide()
+ // $(".topLinks").hide()
+ // $(".share").hide()
+ $('.projectItem').each(function(){
+ this.href = this.href.replace(/\/edit$/, "")
+ })
}
- */
$("body").removeClass("loading")
},
diff --git a/public/assets/javascripts/ui/editor/EditorSettings.js b/public/assets/javascripts/ui/editor/EditorSettings.js
index b96943e..2b29961 100644
--- a/public/assets/javascripts/ui/editor/EditorSettings.js
+++ b/public/assets/javascripts/ui/editor/EditorSettings.js
@@ -5,6 +5,8 @@ var EditorSettings = FormView.extend({
createAction: "/api/project/new",
updateAction: "/api/project/edit",
destroyAction: "/api/project/destroy",
+
+ useMinotaur: true,
events: {
"mousedown": "stopPropagation",
@@ -15,6 +17,7 @@ var EditorSettings = FormView.extend({
"click [data-role='clone-project']": 'clone',
"click [data-role='clear-project']": 'clear',
"click [data-role='destroy-project']": 'destroy',
+ "click [data-role='toggle-map']": 'toggleMap',
"click #startText": "setStartPosition",
"click #moveText": "confirmStartPosition",
"click #confirmText": "setStartPosition",
@@ -81,6 +84,11 @@ var EditorSettings = FormView.extend({
this.parent.collaborators.show()
},
+ toggleMap: function(e){
+ e.preventDefault()
+ app.controller.toolbar.toggleMap()
+ },
+
clone: function(e){
e.preventDefault()
diff --git a/public/assets/javascripts/ui/editor/MediaEditor.js b/public/assets/javascripts/ui/editor/MediaEditor.js
index 9b81db1..db5878f 100644
--- a/public/assets/javascripts/ui/editor/MediaEditor.js
+++ b/public/assets/javascripts/ui/editor/MediaEditor.js
@@ -161,7 +161,7 @@ var MediaEditor = FormView.extend({
unbind: function(){
if (this.scenery) {
- if (this.tainted) {
+ if (this.tainted && this.scenery.media) {
this.scenery.media.title = this.$name.val()
this.scenery.media.description = this.$description.val()
Minotaur.watch( app.router.editorView.settings )
@@ -178,8 +178,11 @@ var MediaEditor = FormView.extend({
destroy: function(){
var scenery = this.scenery
this.hide()
- Scenery.remove(scenery.id)
- Scenery.resize.hide()
+
+ scenery.remove()
+
+ this.tainted = false
+ this.scenery = null
},
})
diff --git a/public/assets/javascripts/ui/editor/TextEditor.js b/public/assets/javascripts/ui/editor/TextEditor.js
index b559ba5..51077af 100644
--- a/public/assets/javascripts/ui/editor/TextEditor.js
+++ b/public/assets/javascripts/ui/editor/TextEditor.js
@@ -136,10 +136,8 @@ var TextEditor = FormView.extend({
},
destroy: function(){
- var scenery = this.scenery
- this.hide()
- Scenery.remove(scenery.id)
- Scenery.resize.hide()
+ this.tainted = false
+ this.scenery.remove()
},
})
diff --git a/public/assets/javascripts/ui/lib/FormView.js b/public/assets/javascripts/ui/lib/FormView.js
index 17b748a..b3a4c71 100644
--- a/public/assets/javascripts/ui/lib/FormView.js
+++ b/public/assets/javascripts/ui/lib/FormView.js
@@ -1,6 +1,7 @@
var FormView = View.extend({
method: "post",
+ useMinotaur: false,
events: {
"submit form": "save"
@@ -88,8 +89,15 @@ var FormView = View.extend({
processData: false,
contentType: false,
})
+
+ if (this.useMinotaur) {
+ Minotaur.show()
+ }
request.done($.proxy(function (response) {
+ if (this.useMinotaur) {
+ Minotaur.hide()
+ }
if (response.error) {
var errors = []
for (var key in response.error.errors) {
diff --git a/public/assets/javascripts/ui/lib/View.js b/public/assets/javascripts/ui/lib/View.js
index d94e6db..3c65131 100644
--- a/public/assets/javascripts/ui/lib/View.js
+++ b/public/assets/javascripts/ui/lib/View.js
@@ -60,7 +60,10 @@ var View = (function($, _){
var eventName = match[1], selector = match[2];
method = _.bind(method, this);
eventName += '.delegateEvents' + this._id;
- if (selector === '') {
+ if (is_mobile && (selector === 'mouseenter' || selector === 'mouseleave')) {
+ continue
+ }
+ else if (selector === '') {
this.$el.on(eventName, method);
} else {
this.$el.on(eventName, selector, method);
diff --git a/public/assets/javascripts/ui/reader/ShareView.js b/public/assets/javascripts/ui/reader/ShareView.js
index 35c23ca..4e5f832 100644
--- a/public/assets/javascripts/ui/reader/ShareView.js
+++ b/public/assets/javascripts/ui/reader/ShareView.js
@@ -22,6 +22,11 @@ var ShareView = View.extend({
var msg = $(".roomName").html() + " on VValls"
var url = "https://twitter.com/home?status=" + encodeURIComponent(window.location.origin + window.location.pathname + " " + msg);
window.open(url, "_blank")
- }
+ },
+
+ embed: function (e) {
+ e.preventDefault()
+
+ },
})
diff --git a/public/assets/javascripts/ui/site/ProjectList.js b/public/assets/javascripts/ui/site/ProjectList.js
index 27c8aca..076a674 100644
--- a/public/assets/javascripts/ui/site/ProjectList.js
+++ b/public/assets/javascripts/ui/site/ProjectList.js
@@ -1,5 +1,5 @@
var projectListTimeout = null
-window.fuck = 'suck'
+
var ProjectList = View.extend({
el: ".projectList",
diff --git a/public/assets/javascripts/vendor/polyfill.js b/public/assets/javascripts/vendor/polyfill.js
index f97e438..8e4b9dc 100644
--- a/public/assets/javascripts/vendor/polyfill.js
+++ b/public/assets/javascripts/vendor/polyfill.js
@@ -52,6 +52,11 @@ function has3d(){
return browser;
})( 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_android = (navigator.userAgent.match(/Android/i))
+var is_mobile = is_iphone || is_ipad || is_android;
// rAF shim
(function() {