From a5280fb074bc7a05a645a6dcfc9399fb9dd8672c Mon Sep 17 00:00:00 2001 From: Hunter Date: Wed, 25 Sep 2019 18:18:02 -0400 Subject: [PATCH 01/54] first commit, copying most of a3 over as js/css/etc framework. lot to do --- .gitignore | 3 + index.js | 125 ++++++++++++++++++++++++++ package.json | 35 ++++++++ public/css/product.css | 84 +++++++++++++++++ public/css/signIn.css | 44 +++++++++ public/css/style.css | 100 +++++++++++++++++++++ public/index.html | 56 ++++++++++++ public/js/cart.js | 73 +++++++++++++++ public/js/scripts.js | 26 ++++++ public/res/android-chrome-192x192.png | Bin 0 -> 43185 bytes public/res/android-chrome-512x512.png | Bin 0 -> 217798 bytes public/res/apple-touch-icon.png | Bin 0 -> 25516 bytes public/res/browserconfig.xml | 9 ++ public/res/favicon-16x16.png | Bin 0 -> 1455 bytes public/res/favicon-32x32.png | Bin 0 -> 2555 bytes public/res/favicon.ico | Bin 0 -> 15086 bytes public/res/mstile-150x150.png | Bin 0 -> 2912 bytes public/res/safari-pinned-tab.svg | 67 ++++++++++++++ public/res/site.webmanifest | 19 ++++ 19 files changed, 641 insertions(+) create mode 100644 .gitignore create mode 100644 index.js create mode 100644 package.json create mode 100644 public/css/product.css create mode 100644 public/css/signIn.css create mode 100644 public/css/style.css create mode 100644 public/index.html create mode 100644 public/js/cart.js create mode 100644 public/js/scripts.js create mode 100644 public/res/android-chrome-192x192.png create mode 100644 public/res/android-chrome-512x512.png create mode 100644 public/res/apple-touch-icon.png create mode 100644 public/res/browserconfig.xml create mode 100644 public/res/favicon-16x16.png create mode 100644 public/res/favicon-32x32.png create mode 100644 public/res/favicon.ico create mode 100644 public/res/mstile-150x150.png create mode 100644 public/res/safari-pinned-tab.svg create mode 100644 public/res/site.webmanifest diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..57195033e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.DS_Store +node_modules/ +package-lock.json diff --git a/index.js b/index.js new file mode 100644 index 000000000..9b7e559c3 --- /dev/null +++ b/index.js @@ -0,0 +1,125 @@ +const express = require( 'express' ), + app = express(), + morgan = require( 'morgan' ) + session = require( 'express-session' ), //1 + passport = require( 'passport' ), //2 + GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; + bodyParser= require( 'body-parser' ), //3 + favicon = require( 'serve-favicon' ), //4 + path = require( 'path' ), + low = require('lowdb'), //5 + FileSync = require('lowdb/adapters/FileSync'), + adapter = new FileSync('db.json'), + db = low(adapter), + port = 3000 + +app.use( express.static('public')) +app.use( bodyParser.json()) +app.use( morgan('combined')) +app.use(favicon(path.join('public','res','favicon.ico'))) +app.use( session({ secret:'fromage', name:'a3-cookie', resave:false, saveUninitialized:true }) ) +app.use( passport.initialize() ) +app.use( passport.session() ) +passport.use(new GoogleStrategy({ + clientID: '443479129403-kgnq88arlnldecfi9qp87queha2fhl7r.apps.googleusercontent.com', + clientSecret: 'RIPOr3cA2Vwyd00UiMNoxNfK', + callbackURL: "https://a3-hcaouette.glitch.me/auth/google/callback" + }, + function(accessToken, refreshToken, profile, done) { + return done(null, profile); + } +)); +passport.initialize() + + +//redirects +app.get(('/' || '/index.html'), (req, res) => res.sendFile(public/index.html)) +app.get('/header', (req,res) => res.render('public/header')) +app.get('/cheeses.html', (req, res) => res.sendFile(public/cheeses.html)) +app.get('/about.html', (req, res) => res.sendFile(public/about.html)) +app.get('/cart.html', (req, res) => res.sendFile(public/cart.html)) +app.get('/login.html', (req, res) => res.sendFile(public/login.html)) +app.get('/auth/google', passport.authenticate('google', { scope: ['https://www.googleapis.com/auth/plus.login'] })) +app.get('/auth/google/callback', passport.authenticate('google', + { failureRedirect: '/login' }), + function(req, res) { + res.redirect('/'); + }); + +function profileParse(profile) { + if(!profile){ + return { + id: -1, + name: "0", + image: "" + } + } + let imageUrl = ''; + if (profile.photos && profile.photos.length) { + imageUrl = profile.photos[0].value; + } + return { + id: profile.id, + name: profile.displayName, + image: imageUrl + } +} + +app.post('/addToCart', function(req,res){ + let json=req.body, + chz=json.cheese, + acct = profileParse(req.user).name; + console.log(acct) + console.log('json:') + console.log(req.body) + console.log(chz) + + if(db.getState() !== null){ + if(db.get('accounts').find({user:acct})){ + //find user from query in accounts array, update chz type to n++ + db.get('accounts').find({user:acct}).update({chz:n => n + 1}) + console.log(db.get('accounts')) + let retVal=JSON.stringify('Updated '+acct+' with '+chz) + console.log("returning this message: ",retVal) + res.status(200).send({message: retVal}) + }else{ + //no user found; write user and 0 of all chesses, then update correct cheese + db.get('accounts').push({user:acct, 'ch1':0, 'ch2':0, 'ch3':0, 'ch4':0, 'ch5':0, 'ch6':0, 'ch7':0, 'ch8':0, total:0}).write() + db.get('accounts').find({user:acct}).update({chz:n => n + 1}) + res.status(200).send({message: 'Made account for ${json.account} with 1 ${json.cheese}'}) + } + } + res.status(409).send(/*{message: 'No database existed'}*/) + // }else{ + // db.defaults(accounts: [ { user:"", 'ch1':0, 'ch2':0, 'ch3':0, 'ch4':0, 'ch5':0, 'ch6':0, 'ch7':0, 'ch8':0, total:0} ] ).write() + // } +}) + + +app.get('/loadCart', (req, res) => { + let acct=profileParse(req.user).name + let cart = db.get('accounts').find({user:acct}).value() + console.log(cart) + res.json(cart) +}) + +app.get('/loadAcct', (req, res) => { + let acct=profileParse(req.user).name + let cheeses = db.get('accounts').find({user:acct}).value() +}) + +passport.serializeUser( function( user, done ){ + console.log("serializing") + acct = profileParse(user).name; + console.log("account is: ",acct) + db.get('accounts').push({'user':acct, 'ch1':0, 'ch2':0, 'ch3':0, 'ch4':0, 'ch5':0, 'ch6':0, 'ch7':0, 'ch8':0, total:0}).write() + done( null, user) +}) +passport.deserializeUser(function(id, done) { + console.log("deserializing") + console.log("deser'd to ",id) + db.get('accounts').find({user:id}) + done(null,id) +}) + +app.listen(port, () => console.log(`a3-hcaouette listening on port ${port}!`)) diff --git a/package.json b/package.json new file mode 100644 index 000000000..810e0f6e5 --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "name": "a3-persistence", + "description": "Assignment 3 - Persistence: Two-tier Web Application with Flat File Database, Express server, and CSS template\r ===", + "author": "Hunter Caouette", + "scripts": { + "start": "node index.js" + }, + "dependencies": { + "body-parser": "^1.19.0", + "cookie-parser": "^1.4.4", + "cookie-session": "^1.3.3", + "express": "^4.17.1", + "express-session": "^1.16.2", + "lowdb": "^1.0.0", + "mime": "^2.4.4", + "morgan": "^1.9.1", + "passport": "^0.4.0", + "passport-google-oauth": "^2.0.0", + "passport-local": "^1.0.0", + "passport-oauth": "^1.0.0", + "serve-favicon": "^2.5.0" + }, + "version": "1.0.0", + "main": "index.js", + "devDependencies": {}, + "repository": { + "type": "git", + "url": "git+https://github.com/hcaouette/a3-persistence.git" + }, + "license": "ISC", + "bugs": { + "url": "https://github.com/hcaouette/a3-persistence/issues" + }, + "homepage": "https://github.com/hcaouette/a3-persistence#readme" +} diff --git a/public/css/product.css b/public/css/product.css new file mode 100644 index 000000000..da70df5dc --- /dev/null +++ b/public/css/product.css @@ -0,0 +1,84 @@ +:root{ + --textMain:#153147; + --bgMain:#84ABBF; + --txtNav:32px; +} + +.bg-light { + background-color: #f8f9fa!important; +} + +.shadow-sm { + box-shadow: 0 .125rem .25rem rgba(0,0,0,.075)!important; +} + +.mr-auto, .mx-auto { + margin-right: auto!important; +} + +.ml-auto, .mx-auto { + margin-left: auto!important; +} + +.chz-bx-border{ + border-top-left-radius: 10px; + border-top-right-radius: 10px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border: 1px solid var(--textMain); +} + +.bg-primary { + background-color: var(--bgMain)!important; +} + +.flex-equal > * { + -ms-flex: 1; + flex: 1; +} +@media (min-width: 768px) { + .flex-md-equal > * { + -ms-flex: 1; + flex: 1; + } +} + +.overflow-hidden { + overflow: hidden!important; +} + +@media (min-width: 768px) +.mr-md-3, .mx-md-3 { + margin-right: 1rem!important; +} + +@media (min-width: 768px) +.pt-md-5, .py-md-5 { + padding-top: 3rem!important; +} + +@media (min-width: 768px) +.pr-md-5, .px-md-5 { + padding-right: 3rem!important; +} + +@media (min-width: 768px) +.pl-md-5, .px-md-5 { + padding-left: 3rem!important; +} + +.text-center { + text-align: center!important; +} + +.caption-small{ + font-size: 1rem; + padding-top: 1rem; + border-top: 1px solid white; +} + +.chz-label{ + font-size: 2.25rem; + margin-bottom: 1rem; + border-bottom: 1px solid white; +} diff --git a/public/css/signIn.css b/public/css/signIn.css new file mode 100644 index 000000000..6c11c9b72 --- /dev/null +++ b/public/css/signIn.css @@ -0,0 +1,44 @@ +html, +body { + height: 100%; +} + +/* body { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + padding-top: 40px; + padding-bottom: 40px; + background-color: #f5f5f5; +} */ + +.form-signin { + width: 100%; + max-width: 330px; + padding: 15px; + margin: auto; +} +.form-signin .checkbox { + font-weight: 400; +} +.form-signin .form-control { + position: relative; + box-sizing: border-box; + height: auto; + padding: 10px; + font-size: 16px; +} +.form-signin .form-control:focus { + z-index: 2; +} +.form-signin input[type="email"] { + margin-bottom: -1px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.form-signin input[type="password"] { + margin-bottom: 10px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 000000000..806b9c1ab --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,100 @@ +/*Style your own assignment! This is fun! */ +:root{ + --textMain:#153147; + --bgMain:#84ABBF; + --txtNav:32px; +} + +body{ + background-color: var(--bgMain); + color: var(--textMain); + font-family: Abel; +} +nav{ + color: var(--textMain); +} +.snapCont { + scroll-snap-type: y mandatory; +} +.snapChil { + scroll-snap-align: start; +} + +.contentBox{ + border-width: 1px; + border-style: solid; + border-color: var(--textMain); + border-radius: 5px; +} + +.imgFrame{ + padding: 0; + overflow: hidden; +} + +.centerBox{ + text-align: center; +} + +.navbar{ + border-bottom: 1px solid var(--textMain); + padding-bottom: 0px; + margin-bottom: 15px; + color: var(--textMain); +} + +.navbar-brand{ + padding-bottom: 0px; + margin-bottom: 0px; + /* color: var(--textMain); */ +} + +.navbar-brand span{ + padding-bottom: 0px; + margin-bottom: 0px; + font-size: var(--txtNav); + color: var(--textMain); +} + +.nav-item.nav-link.active{ + padding-bottom: 0px; + margin-bottom: 0px; + font-size: var(--txtNav); + color: var(--textMain); +} + +.nav-item.nav-link.active:hover{ + padding-bottom: 0px; + margin-bottom: 0px; + font-size: var(--txtNav); + color: white; +} + +.navbar-toggle { + z-index:3; +} + +.mainForm{ + text-align: left; + /* margin-bottom: 15px; */ +} + +.btnRght{ + float: right; +} + +.padbtm{ + margin-bottom: 15px; +} + +.ft-mar-t-5{ + margin-top:5rem; +} + +.ft-bor-t{ + border-top: 1.5px solid var(--textMain); +} + +.pull-away-sides{ + width: 96%!important; +} diff --git a/public/index.html b/public/index.html new file mode 100644 index 000000000..9badc8d75 --- /dev/null +++ b/public/index.html @@ -0,0 +1,56 @@ + + + + + + + + + + + + + a3-hcaouette -- CS4241 Assignment 3 + + + +
+ + + + + + + +
+
+

Hunter Caouette's Cheese World

+

Welcome to the cheese world!

+
+
+ + + +
+ + + + + + + + diff --git a/public/js/cart.js b/public/js/cart.js new file mode 100644 index 000000000..8017214f4 --- /dev/null +++ b/public/js/cart.js @@ -0,0 +1,73 @@ +window.onload = function () { + fetch('/loadCart') + .then((res) => console.log(res.json())) + .then((data) => { + $('.tbody').remove() + let tbody = $('').appendTo($('.cartFill')) + let totP=0 + // if(ch1 of data != 0){ + $('').appendTo(tbody) + .append('Cheese 1') + .append(`5`) + .append(`${ch1}`) + totP = `${ch1}`*5 + .append(`${totP}`) + // } + // if(ch2 of data != 0){ + $('').appendTo(tbody) + .append('Cheese 2') + .append(`5`) + .append(`${ch2}`) + totP = `${ch2}`*5 + .append(`${totP}`) + // } + // if(ch3 of data != 0){ + $('').appendTo(tbody) + .append('Cheese 3') + .append(`5`) + .append(`${ch3}`) + totP = `${ch3}`*5 + .append(`${totP}`) + // } + // if(ch4 of data != 0){ + $('').appendTo(tbody) + .append('Cheese 4') + .append(`5`) + .append(`${ch4}`) + totP = `${ch4}`*5 + .append(`${totP}`) + // } + // if(ch5 of data != 0){ + $('').appendTo(tbody) + .append('Cheese 5') + .append(`5`) + .append(`${ch5}`) + totP = `${ch5}`*5 + .append(`${totP}`) + // } + // if(ch6 of data != 0){ + $('').appendTo(tbody) + .append('Cheese 6') + .append(`5`) + .append(`${ch6}`) + totP = `${ch6}`*5 + .append(`${totP}`) + // } + // if(ch7 of data != 0){ + $('').appendTo(tbody) + .append('Cheese 7') + .append(`5`) + .append(`${ch7}`) + totP = `${ch7}`*5 + .append(`${totP}`) + // } + // if(ch8 of data != 0){ + $('').appendTo(tbody) + .append('Cheese 8') + .append(`5`) + .append(`${ch8}`) + totP = `${ch8}`*5 + .append(`${totP}`) + // } + }) +} diff --git a/public/js/scripts.js b/public/js/scripts.js new file mode 100644 index 000000000..40e072a66 --- /dev/null +++ b/public/js/scripts.js @@ -0,0 +1,26 @@ +// Add some Javascript code here, to run on the front end. + +console.log("Welcome to assignment 3!") + +const addToCart = function(chz){ + console.log('attempting addToCart') + let body=JSON.stringify({ cheese: chz}) + + fetch( '/addToCart', { + method:'POST', + body, + credentials: 'include', + headers: { 'Content-Type': 'application/json' } + }) + .then( res => res.json() ) + .then( console.log ) +} + +const loadAcct = function(chz){ + fetch( '/loadAcct', { + method:'GET', + credentials: 'include', + }) + .then( res => res.json() ) + .then( console.log ) +} diff --git a/public/res/android-chrome-192x192.png b/public/res/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..36e7e92bdf520c51941e4a5418d4384c71faabe7 GIT binary patch literal 43185 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%0DXWn)?33Y^b)1 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 XjEQ^SfDzAp^A|PsIVXex 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∈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 + + + + + #84abbf + + + diff --git a/public/res/favicon-16x16.png b/public/res/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..afd9d8662aa137aad111c71f27a595bf140e2fc2 GIT binary patch literal 1455 zcmZ`&X;4#F6n;o$N9^F#+Hs~hjFyf?ftCs=)+mdtvdLl#5?KTVg764o33~#Fh#LY5 zh{&Foki{hI2@nv-^0E;Eh$1K;5(a{RgIN0f*Z%08d+#@A`R2^o3cWm?4fTG|0|3C# z<-CIrf_uL{9ZlpnGdJ=@;G3%`4-^2U{x^O81;dFZ}lZaufPdw(I4Q4U1gC&m6t_zQ7{RML}BFm@@~8GYa#_rps+cK zUym8Cy*6AICuoR=8!__w=qV_Ai3_gDin`NJ3#y_xsV93P_P>bRx5~k;_hQ!jksG(x zdtJ?qTIEKqaH3W@SJrqz@0p?V^x(I&kQo|!ni}z%cI_o4W`cs5pn{XM=$tOQCGLpTXJMFQcZ5N?#5JWfrX?Zyl1qeU&C2udEQiyN%H!EeTi zAY6Y%IIkicNkIxF%OQ~8lpui8;8y%l&GouCRPW>KGJ2-4A+fJCMA8h(N#Iy3RzSiE z$>|~r9ww&_K8YJ{!imV~GFqmXoGOQ~3QCfYlq{rVNEmqom64q#e~z@I384%jgom4x zhVFPts)OZ}R3Qlmw`PkO1le{Jr=D?I}1tSxF6bP4l%Aw>rUXidlK}^pTGl>#r zp@dm5^emB)?LAzNQ!okqJKiq{XJk;yD|UvIkt1alNLV+;0KTj3bHaH^|#mQyI9W{O+W#k6b*Jx9vO z8+}exvht_eiSM`sWK_I%%`1>O4h4NYzwX4pkG9_KUAi_|%pO{O^}}1Kan5@~*vpgV z^sU*}w-ejtH$H9!YpB179<8e*1IEQ^4?4}xEq|ozR&5`ms{d9Q+J=I;MB+mRg#{6= zYH01&);dn@LiP#JxZ>vQV0A|7K7OXC?2n%O z>BMnP4YjGQ&Mz0mfVyhwEgcOk7NzGY&7}y{*uTlffWkUQl%+v$xN&D6Q-lYfI}ei_5I^fsu=(F({aw(eI@1c2w(w$76Pk zO3A{%5CwN`E-`5l)JgUZxA$Cr$w7PUHgDK>V~@dY&qlb?K5==QP*is8a{J;^-}E9@ zwN?C>9rwCDar4y|ZKJ6JHuk5wyMDCKP=f=E`QsryYV`EX#`>C(j)C4DT|@nnf?HRz zG^!WMm2J3?(}2w~#x-yL?i^CL!=Pgz7>))b?7|Wv5CE(!EN#s#Y|Slg{Vc8RENtwo ztdCk)*;!bmVAv)9A;etl#>>HBA|QCVZuQh$rA3 h&eyme0~Ysx3#!jrmm(nm7e`MA%GuDIe*jl__!j^G literal 0 HcmV?d00001 diff --git a/public/res/favicon-32x32.png b/public/res/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..a6da9a53553f795b00cca64ed7dd8f95339287d9 GIT binary patch literal 2555 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 j=PZ~$3e$_cK^~BKRjHz8*)%|^!i($fCVb6ZW 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 Zm(Meij@6J>G7(=+lwQipV_MAge*rc4!DRpd literal 0 HcmV?d00001 diff --git a/public/res/mstile-150x150.png b/public/res/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..40efe200c531e564fabe92f31ca5d95e6a9bf043 GIT binary patch literal 2912 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 + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + diff --git a/public/res/site.webmanifest b/public/res/site.webmanifest new file mode 100644 index 000000000..3a65bd4b1 --- /dev/null +++ b/public/res/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/res/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/res/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} From 551352ecb37a079a2e292076673b00591061022c Mon Sep 17 00:00:00 2001 From: Hunter Date: Wed, 25 Sep 2019 22:26:12 -0400 Subject: [PATCH 02/54] stripping a3 down to build a4 --- index.js | 129 ++++++++--------------------------------- package.json | 2 + public/css/product.css | 84 --------------------------- public/css/signIn.css | 44 -------------- public/index.html | 2 +- public/js/cart.js | 73 ----------------------- public/js/scripts.js | 23 -------- 7 files changed, 27 insertions(+), 330 deletions(-) delete mode 100644 public/css/product.css delete mode 100644 public/css/signIn.css delete mode 100644 public/js/cart.js diff --git a/index.js b/index.js index 9b7e559c3..35349ff6b 100644 --- a/index.js +++ b/index.js @@ -1,125 +1,44 @@ const express = require( 'express' ), app = express(), - morgan = require( 'morgan' ) + // morgan = require( 'morgan' ) session = require( 'express-session' ), //1 - passport = require( 'passport' ), //2 - GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; + // passport = require( 'passport' ), //2 + // GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; bodyParser= require( 'body-parser' ), //3 favicon = require( 'serve-favicon' ), //4 path = require( 'path' ), - low = require('lowdb'), //5 - FileSync = require('lowdb/adapters/FileSync'), - adapter = new FileSync('db.json'), - db = low(adapter), + // low = require('lowdb'), //5 + // FileSync = require('lowdb/adapters/FileSync'), + // adapter = new FileSync('db.json'), + // db = low(adapter), + helmet = require('helmet'), + compression = require('compression'), port = 3000 + +app.use(helmet()) +app.use(compression()) app.use( express.static('public')) app.use( bodyParser.json()) -app.use( morgan('combined')) app.use(favicon(path.join('public','res','favicon.ico'))) app.use( session({ secret:'fromage', name:'a3-cookie', resave:false, saveUninitialized:true }) ) -app.use( passport.initialize() ) -app.use( passport.session() ) -passport.use(new GoogleStrategy({ - clientID: '443479129403-kgnq88arlnldecfi9qp87queha2fhl7r.apps.googleusercontent.com', - clientSecret: 'RIPOr3cA2Vwyd00UiMNoxNfK', - callbackURL: "https://a3-hcaouette.glitch.me/auth/google/callback" - }, - function(accessToken, refreshToken, profile, done) { - return done(null, profile); - } -)); -passport.initialize() +// app.use( passport.initialize() ) +// app.use( passport.session() ) +// passport.use(new GoogleStrategy({ +// clientID: '443479129403-kgnq88arlnldecfi9qp87queha2fhl7r.apps.googleusercontent.com', +// clientSecret: 'RIPOr3cA2Vwyd00UiMNoxNfK', +// callbackURL: "https://a3-hcaouette.glitch.me/auth/google/callback" +// }, +// function(accessToken, refreshToken, profile, done) { +// return done(null, profile); +// } +// )); +// passport.initialize() //redirects app.get(('/' || '/index.html'), (req, res) => res.sendFile(public/index.html)) -app.get('/header', (req,res) => res.render('public/header')) -app.get('/cheeses.html', (req, res) => res.sendFile(public/cheeses.html)) -app.get('/about.html', (req, res) => res.sendFile(public/about.html)) -app.get('/cart.html', (req, res) => res.sendFile(public/cart.html)) -app.get('/login.html', (req, res) => res.sendFile(public/login.html)) -app.get('/auth/google', passport.authenticate('google', { scope: ['https://www.googleapis.com/auth/plus.login'] })) -app.get('/auth/google/callback', passport.authenticate('google', - { failureRedirect: '/login' }), - function(req, res) { - res.redirect('/'); - }); - -function profileParse(profile) { - if(!profile){ - return { - id: -1, - name: "0", - image: "" - } - } - let imageUrl = ''; - if (profile.photos && profile.photos.length) { - imageUrl = profile.photos[0].value; - } - return { - id: profile.id, - name: profile.displayName, - image: imageUrl - } -} - -app.post('/addToCart', function(req,res){ - let json=req.body, - chz=json.cheese, - acct = profileParse(req.user).name; - console.log(acct) - console.log('json:') - console.log(req.body) - console.log(chz) - - if(db.getState() !== null){ - if(db.get('accounts').find({user:acct})){ - //find user from query in accounts array, update chz type to n++ - db.get('accounts').find({user:acct}).update({chz:n => n + 1}) - console.log(db.get('accounts')) - let retVal=JSON.stringify('Updated '+acct+' with '+chz) - console.log("returning this message: ",retVal) - res.status(200).send({message: retVal}) - }else{ - //no user found; write user and 0 of all chesses, then update correct cheese - db.get('accounts').push({user:acct, 'ch1':0, 'ch2':0, 'ch3':0, 'ch4':0, 'ch5':0, 'ch6':0, 'ch7':0, 'ch8':0, total:0}).write() - db.get('accounts').find({user:acct}).update({chz:n => n + 1}) - res.status(200).send({message: 'Made account for ${json.account} with 1 ${json.cheese}'}) - } - } - res.status(409).send(/*{message: 'No database existed'}*/) - // }else{ - // db.defaults(accounts: [ { user:"", 'ch1':0, 'ch2':0, 'ch3':0, 'ch4':0, 'ch5':0, 'ch6':0, 'ch7':0, 'ch8':0, total:0} ] ).write() - // } -}) - - -app.get('/loadCart', (req, res) => { - let acct=profileParse(req.user).name - let cart = db.get('accounts').find({user:acct}).value() - console.log(cart) - res.json(cart) -}) -app.get('/loadAcct', (req, res) => { - let acct=profileParse(req.user).name - let cheeses = db.get('accounts').find({user:acct}).value() -}) -passport.serializeUser( function( user, done ){ - console.log("serializing") - acct = profileParse(user).name; - console.log("account is: ",acct) - db.get('accounts').push({'user':acct, 'ch1':0, 'ch2':0, 'ch3':0, 'ch4':0, 'ch5':0, 'ch6':0, 'ch7':0, 'ch8':0, total:0}).write() - done( null, user) -}) -passport.deserializeUser(function(id, done) { - console.log("deserializing") - console.log("deser'd to ",id) - db.get('accounts').find({user:id}) - done(null,id) -}) app.listen(port, () => console.log(`a3-hcaouette listening on port ${port}!`)) diff --git a/package.json b/package.json index 810e0f6e5..96907e584 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,12 @@ }, "dependencies": { "body-parser": "^1.19.0", + "compression": "^1.7.4", "cookie-parser": "^1.4.4", "cookie-session": "^1.3.3", "express": "^4.17.1", "express-session": "^1.16.2", + "helmet": "^3.21.1", "lowdb": "^1.0.0", "mime": "^2.4.4", "morgan": "^1.9.1", diff --git a/public/css/product.css b/public/css/product.css deleted file mode 100644 index da70df5dc..000000000 --- a/public/css/product.css +++ /dev/null @@ -1,84 +0,0 @@ -:root{ - --textMain:#153147; - --bgMain:#84ABBF; - --txtNav:32px; -} - -.bg-light { - background-color: #f8f9fa!important; -} - -.shadow-sm { - box-shadow: 0 .125rem .25rem rgba(0,0,0,.075)!important; -} - -.mr-auto, .mx-auto { - margin-right: auto!important; -} - -.ml-auto, .mx-auto { - margin-left: auto!important; -} - -.chz-bx-border{ - border-top-left-radius: 10px; - border-top-right-radius: 10px; - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - border: 1px solid var(--textMain); -} - -.bg-primary { - background-color: var(--bgMain)!important; -} - -.flex-equal > * { - -ms-flex: 1; - flex: 1; -} -@media (min-width: 768px) { - .flex-md-equal > * { - -ms-flex: 1; - flex: 1; - } -} - -.overflow-hidden { - overflow: hidden!important; -} - -@media (min-width: 768px) -.mr-md-3, .mx-md-3 { - margin-right: 1rem!important; -} - -@media (min-width: 768px) -.pt-md-5, .py-md-5 { - padding-top: 3rem!important; -} - -@media (min-width: 768px) -.pr-md-5, .px-md-5 { - padding-right: 3rem!important; -} - -@media (min-width: 768px) -.pl-md-5, .px-md-5 { - padding-left: 3rem!important; -} - -.text-center { - text-align: center!important; -} - -.caption-small{ - font-size: 1rem; - padding-top: 1rem; - border-top: 1px solid white; -} - -.chz-label{ - font-size: 2.25rem; - margin-bottom: 1rem; - border-bottom: 1px solid white; -} diff --git a/public/css/signIn.css b/public/css/signIn.css deleted file mode 100644 index 6c11c9b72..000000000 --- a/public/css/signIn.css +++ /dev/null @@ -1,44 +0,0 @@ -html, -body { - height: 100%; -} - -/* body { - display: -ms-flexbox; - display: flex; - -ms-flex-align: center; - align-items: center; - padding-top: 40px; - padding-bottom: 40px; - background-color: #f5f5f5; -} */ - -.form-signin { - width: 100%; - max-width: 330px; - padding: 15px; - margin: auto; -} -.form-signin .checkbox { - font-weight: 400; -} -.form-signin .form-control { - position: relative; - box-sizing: border-box; - height: auto; - padding: 10px; - font-size: 16px; -} -.form-signin .form-control:focus { - z-index: 2; -} -.form-signin input[type="email"] { - margin-bottom: -1px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.form-signin input[type="password"] { - margin-bottom: 10px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} diff --git a/public/index.html b/public/index.html index 9badc8d75..bcacf4183 100644 --- a/public/index.html +++ b/public/index.html @@ -10,7 +10,7 @@ - a3-hcaouette -- CS4241 Assignment 3 + creative coding -- a4-hcaouette -- CS4241 Assignment 4 diff --git a/public/js/cart.js b/public/js/cart.js deleted file mode 100644 index 8017214f4..000000000 --- a/public/js/cart.js +++ /dev/null @@ -1,73 +0,0 @@ -window.onload = function () { - fetch('/loadCart') - .then((res) => console.log(res.json())) - .then((data) => { - $('.tbody').remove() - let tbody = $('').appendTo($('.cartFill')) - let totP=0 - // if(ch1 of data != 0){ - $('').appendTo(tbody) - .append('Cheese 1') - .append(`5`) - .append(`${ch1}`) - totP = `${ch1}`*5 - .append(`${totP}`) - // } - // if(ch2 of data != 0){ - $('').appendTo(tbody) - .append('Cheese 2') - .append(`5`) - .append(`${ch2}`) - totP = `${ch2}`*5 - .append(`${totP}`) - // } - // if(ch3 of data != 0){ - $('').appendTo(tbody) - .append('Cheese 3') - .append(`5`) - .append(`${ch3}`) - totP = `${ch3}`*5 - .append(`${totP}`) - // } - // if(ch4 of data != 0){ - $('').appendTo(tbody) - .append('Cheese 4') - .append(`5`) - .append(`${ch4}`) - totP = `${ch4}`*5 - .append(`${totP}`) - // } - // if(ch5 of data != 0){ - $('').appendTo(tbody) - .append('Cheese 5') - .append(`5`) - .append(`${ch5}`) - totP = `${ch5}`*5 - .append(`${totP}`) - // } - // if(ch6 of data != 0){ - $('').appendTo(tbody) - .append('Cheese 6') - .append(`5`) - .append(`${ch6}`) - totP = `${ch6}`*5 - .append(`${totP}`) - // } - // if(ch7 of data != 0){ - $('').appendTo(tbody) - .append('Cheese 7') - .append(`5`) - .append(`${ch7}`) - totP = `${ch7}`*5 - .append(`${totP}`) - // } - // if(ch8 of data != 0){ - $('').appendTo(tbody) - .append('Cheese 8') - .append(`5`) - .append(`${ch8}`) - totP = `${ch8}`*5 - .append(`${totP}`) - // } - }) -} diff --git a/public/js/scripts.js b/public/js/scripts.js index 40e072a66..b5a49e9ad 100644 --- a/public/js/scripts.js +++ b/public/js/scripts.js @@ -1,26 +1,3 @@ // Add some Javascript code here, to run on the front end. console.log("Welcome to assignment 3!") - -const addToCart = function(chz){ - console.log('attempting addToCart') - let body=JSON.stringify({ cheese: chz}) - - fetch( '/addToCart', { - method:'POST', - body, - credentials: 'include', - headers: { 'Content-Type': 'application/json' } - }) - .then( res => res.json() ) - .then( console.log ) -} - -const loadAcct = function(chz){ - fetch( '/loadAcct', { - method:'GET', - credentials: 'include', - }) - .then( res => res.json() ) - .then( console.log ) -} From 8b6a7e09f13d30e35f8b4df331bdf978b9d5a9b6 Mon Sep 17 00:00:00 2001 From: Hunter Date: Wed, 25 Sep 2019 23:47:59 -0400 Subject: [PATCH 03/54] trying to setup linter --- index.js | 61 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/index.js b/index.js index 35349ff6b..b06169865 100644 --- a/index.js +++ b/index.js @@ -22,23 +22,54 @@ app.use( express.static('public')) app.use( bodyParser.json()) app.use(favicon(path.join('public','res','favicon.ico'))) app.use( session({ secret:'fromage', name:'a3-cookie', resave:false, saveUninitialized:true }) ) -// app.use( passport.initialize() ) -// app.use( passport.session() ) -// passport.use(new GoogleStrategy({ -// clientID: '443479129403-kgnq88arlnldecfi9qp87queha2fhl7r.apps.googleusercontent.com', -// clientSecret: 'RIPOr3cA2Vwyd00UiMNoxNfK', -// callbackURL: "https://a3-hcaouette.glitch.me/auth/google/callback" -// }, -// function(accessToken, refreshToken, profile, done) { -// return done(null, profile); -// } -// )); -// passport.initialize() - - -//redirects +// app.use(babel) + app.get(('/' || '/index.html'), (req, res) => res.sendFile(public/index.html)) +export function activate() { + // Fill something here, optional +} + +export function deactivate() { + // Fill something here, optional +} + +export function provideLinter() { + return { + name: 'Example', + scope: 'file', // or 'project' + lintsOnChange: false, // or true + grammarScopes: ['source.js'], + lint(textEditor) { + const editorPath = textEditor.getPath() + + // Do something sync + return [{ + severity: 'info', + location: { + file: editorPath, + position: [[0, 0], [0, 1]], + }, + excerpt: `A random value is ${Math.random()}`, + description: `### What is this?\nThis is a randomly generated value` + }] + + // Do something async + return new Promise(function(resolve) { + resolve([{ + severity: 'info', + location: { + file: editorPath, + position: [[0, 0], [0, 1]], + }, + excerpt: `A random value is ${Math.random()}`, + description: `### What is this?\nThis is a randomly generated value` + }]) + }) + } + } +} + app.listen(port, () => console.log(`a3-hcaouette listening on port ${port}!`)) From 5b25365def90357101f0eb13889db871eb90eb18 Mon Sep 17 00:00:00 2001 From: Hunter Date: Thu, 26 Sep 2019 00:17:10 -0400 Subject: [PATCH 04/54] index --- public/index.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/index.html b/public/index.html index bcacf4183..1c77e38a7 100644 --- a/public/index.html +++ b/public/index.html @@ -2,6 +2,7 @@ + @@ -19,6 +20,7 @@ From bc5d9705aad77f61b388078b0fbfebd6aadf8216 Mon Sep 17 00:00:00 2001 From: Hunter Date: Thu, 26 Sep 2019 12:29:23 -0400 Subject: [PATCH 05/54] testing web audio api example on glitch --- index.js | 45 ------------- public/css/style.css | 2 +- public/index.html | 157 ++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 156 insertions(+), 48 deletions(-) diff --git a/index.js b/index.js index b06169865..4af3fa6dd 100644 --- a/index.js +++ b/index.js @@ -27,49 +27,4 @@ app.use( session({ secret:'fromage', name:'a3-cookie', resave:false, saveUniniti app.get(('/' || '/index.html'), (req, res) => res.sendFile(public/index.html)) -export function activate() { - // Fill something here, optional -} - -export function deactivate() { - // Fill something here, optional -} - -export function provideLinter() { - return { - name: 'Example', - scope: 'file', // or 'project' - lintsOnChange: false, // or true - grammarScopes: ['source.js'], - lint(textEditor) { - const editorPath = textEditor.getPath() - - // Do something sync - return [{ - severity: 'info', - location: { - file: editorPath, - position: [[0, 0], [0, 1]], - }, - excerpt: `A random value is ${Math.random()}`, - description: `### What is this?\nThis is a randomly generated value` - }] - - // Do something async - return new Promise(function(resolve) { - resolve([{ - severity: 'info', - location: { - file: editorPath, - position: [[0, 0], [0, 1]], - }, - excerpt: `A random value is ${Math.random()}`, - description: `### What is this?\nThis is a randomly generated value` - }]) - }) - } - } -} - - app.listen(port, () => console.log(`a3-hcaouette listening on port ${port}!`)) diff --git a/public/css/style.css b/public/css/style.css index 806b9c1ab..98bb8b09d 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1,7 +1,7 @@ /*Style your own assignment! This is fun! */ :root{ --textMain:#153147; - --bgMain:#84ABBF; + --bgMain:#0C6AE8; --txtNav:32px; } diff --git a/public/index.html b/public/index.html index 1c77e38a7..1590a2564 100644 --- a/public/index.html +++ b/public/index.html @@ -39,13 +39,166 @@ -
+ +
+ + +

+ +     + +

+

+ + + + + + + + + + From 7be20b03f7f41665761db7ccde18a08c2fa89fad Mon Sep 17 00:00:00 2001 From: Hunter Date: Thu, 26 Sep 2019 12:54:06 -0400 Subject: [PATCH 06/54] moved script in body to scripts.js --- public/css/style.css | 41 +++++++-------- public/index.html | 121 +------------------------------------------ public/js/scripts.js | 118 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+), 140 deletions(-) diff --git a/public/css/style.css b/public/css/style.css index 98bb8b09d..ad23a2664 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1,7 +1,7 @@ /*Style your own assignment! This is fun! */ :root{ --textMain:#153147; - --bgMain:#0C6AE8; + --bgMain:rgb(67,118,111); --txtNav:32px; } @@ -13,23 +13,23 @@ body{ nav{ color: var(--textMain); } -.snapCont { +/* .snapCont { scroll-snap-type: y mandatory; } .snapChil { scroll-snap-align: start; -} +} */ .contentBox{ - border-width: 1px; - border-style: solid; border-color: var(--textMain); border-radius: 5px; + border-style: solid; + border-width: 1px; } .imgFrame{ - padding: 0; overflow: hidden; + padding: 0; } .centerBox{ @@ -38,36 +38,35 @@ nav{ .navbar{ border-bottom: 1px solid var(--textMain); - padding-bottom: 0px; - margin-bottom: 15px; color: var(--textMain); + margin-bottom: 15px; + padding-bottom: 0; } .navbar-brand{ - padding-bottom: 0px; - margin-bottom: 0px; - /* color: var(--textMain); */ + margin-bottom: 0; + padding-bottom: 0; } .navbar-brand span{ - padding-bottom: 0px; - margin-bottom: 0px; - font-size: var(--txtNav); color: var(--textMain); + font-size: var(--txtNav); + margin-bottom: 0; + padding-bottom: 0; } .nav-item.nav-link.active{ - padding-bottom: 0px; - margin-bottom: 0px; - font-size: var(--txtNav); color: var(--textMain); + font-size: var(--txtNav); + margin-bottom: 0; + padding-bottom: 0; } .nav-item.nav-link.active:hover{ - padding-bottom: 0px; - margin-bottom: 0px; - font-size: var(--txtNav); color: white; + font-size: var(--txtNav); + margin-bottom: 0; + padding-bottom: 0; } .navbar-toggle { @@ -96,5 +95,5 @@ nav{ } .pull-away-sides{ - width: 96%!important; + width: 96%/*!important */; } diff --git a/public/index.html b/public/index.html index 1590a2564..737be7fb4 100644 --- a/public/index.html +++ b/public/index.html @@ -8,6 +8,7 @@ + @@ -79,125 +80,7 @@

Welcome to the cheese world!

- + diff --git a/public/js/scripts.js b/public/js/scripts.js index b5a49e9ad..38529c368 100644 --- a/public/js/scripts.js +++ b/public/js/scripts.js @@ -1,3 +1,121 @@ // Add some Javascript code here, to run on the front end. console.log("Welcome to assignment 3!") + + // Hacks to deal with different function names in different browsers + window.requestAnimFrame = (function(){ + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback, element){ + window.setTimeout(callback, 1000 / 60); + }; + })(); + window.AudioContext = (function(){ + return window.webkitAudioContext || window.AudioContext || window.mozAudioContext; + })(); + // Global Variables for Audio + var audioContext; + var audioBuffer; + var sourceNode; + var analyserNode; + var javascriptNode; + var audioData = null; + var audioPlaying = false; + var sampleSize = 1024; // number of samples to collect before analyzing data + var amplitudeArray; // array to hold time domain data + // This must be hosted on the same server as this page - otherwise you get a Cross Site Scripting error + var audioUrl = "viper.mp3"; + // Global Variables for the Graphics + var canvasWidth = 512; + var canvasHeight = 256; + var ctx; + $(document).ready(function() { + ctx = $("#canvas").get()[0].getContext("2d"); + // the AudioContext is the primary 'container' for all your audio node objects + try { + audioContext = new AudioContext(); + } catch(e) { + alert('Web Audio API is not supported in this browser'); + } + // When the Start button is clicked, finish setting up the audio nodes, play the sound, + // gather samples for the analysis, update the canvas + $("#start_button").on('click', function(e) { + e.preventDefault(); + // Set up the audio Analyser, the Source Buffer and javascriptNode + setupAudioNodes(); + // setup the event handler that is triggered every time enough samples have been collected + // trigger the audio analysis and draw the results + javascriptNode.onaudioprocess = function () { + // get the Time Domain data for this sample + analyserNode.getByteTimeDomainData(amplitudeArray); + // draw the display if the audio is playing + if (audioPlaying == true) { + requestAnimFrame(drawTimeDomain); + } + } + // Load the Audio the first time through, otherwise play it from the buffer + if(audioData == null) { + loadSound(audioUrl); + } else { + playSound(audioData); + } + }); + // Stop the audio playing + $("#stop_button").on('click', function(e) { + e.preventDefault(); + sourceNode.stop(0); + audioPlaying = false; + }); + }); + function setupAudioNodes() { + sourceNode = audioContext.createBufferSource(); + analyserNode = audioContext.createAnalyser(); + javascriptNode = audioContext.createScriptProcessor(sampleSize, 1, 1); + // Create the array for the data values + amplitudeArray = new Uint8Array(analyserNode.frequencyBinCount); + // Now connect the nodes together + sourceNode.connect(audioContext.destination); + sourceNode.connect(analyserNode); + analyserNode.connect(javascriptNode); + javascriptNode.connect(audioContext.destination); + } + // Load the audio from the URL via Ajax and store it in global variable audioData + // Note that the audio load is asynchronous + function loadSound(url) { + document.getElementById('msg').textContent = "Loading audio..."; + var request = new XMLHttpRequest(); + request.open('GET', url, true); + request.responseType = 'arraybuffer'; + // When loaded, decode the data and play the sound + request.onload = function () { + audioContext.decodeAudioData(request.response, function (buffer) { + document.getElementById('msg').textContent = "Audio sample download finished"; + audioData = buffer; + playSound(audioData); + }, onError); + } + request.send(); + } + // Play the audio and loop until stopped + function playSound(buffer) { + sourceNode.buffer = buffer; + sourceNode.start(0); // Play the sound now + sourceNode.loop = true; + audioPlaying = true; + } + function onError(e) { + console.log(e); + } + function drawTimeDomain() { + clearCanvas(); + for (var i = 0; i < amplitudeArray.length; i++) { + var value = amplitudeArray[i] / 256; + var y = canvasHeight - (canvasHeight * value) - 1; + ctx.fillStyle = '#ffffff'; + ctx.fillRect(i, y, 1, 1); + } + } + function clearCanvas() { + ctx.clearRect(0, 0, canvasWidth, canvasHeight); + } From 31093ce381ba2f8ab488095e90e14e0fb5ab8c98 Mon Sep 17 00:00:00 2001 From: Hunter Date: Thu, 26 Sep 2019 19:01:40 -0400 Subject: [PATCH 07/54] adding ytdl (youtube downloader) to server to process link to yt vid --- index.js | 22 +++++++++ package.json | 3 +- public/index.html | 15 ++++-- public/js/audio.js | 112 +++++++++++++++++++++++++++++++++++++++++++++ public/js/myGui.js | 16 +++++++ 5 files changed, 162 insertions(+), 6 deletions(-) create mode 100644 public/js/audio.js create mode 100644 public/js/myGui.js diff --git a/index.js b/index.js index 4af3fa6dd..919000eb3 100644 --- a/index.js +++ b/index.js @@ -13,6 +13,11 @@ const express = require( 'express' ), // db = low(adapter), helmet = require('helmet'), compression = require('compression'), + fs = require('fs'), + ytdl = require('ytdl-core'), + // socketIO = require('socket.io'), + // server = http.Server(app), + // io = socketIO(server), port = 3000 @@ -23,8 +28,25 @@ app.use( bodyParser.json()) app.use(favicon(path.join('public','res','favicon.ico'))) app.use( session({ secret:'fromage', name:'a3-cookie', resave:false, saveUninitialized:true }) ) // app.use(babel) +app.use(morgan('dev')) app.get(('/' || '/index.html'), (req, res) => res.sendFile(public/index.html)) +app.post('/stream/:videoId', (request, response) => { + const videoId = request.params.videoId + const videoUrl = `https://www.youtube.com/watch?v=${videoId}` + if (!ytdl.validateURL(videoUrl)) { + response.send({ success: false }) + } else { + ytdl(videoUrl, { filter: format => format.container === 'mp4' }) + .pipe(response) + } +}) + +app.use((request, response) => { + response.redirect('/') +}) + + app.listen(port, () => console.log(`a3-hcaouette listening on port ${port}!`)) diff --git a/package.json b/package.json index 96907e584..f85cf5c58 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "passport-google-oauth": "^2.0.0", "passport-local": "^1.0.0", "passport-oauth": "^1.0.0", - "serve-favicon": "^2.5.0" + "serve-favicon": "^2.5.0", + "ytdl-core": "^0.29.7" }, "version": "1.0.0", "main": "index.js", diff --git a/public/index.html b/public/index.html index 737be7fb4..cc120c329 100644 --- a/public/index.html +++ b/public/index.html @@ -9,6 +9,7 @@ + @@ -57,7 +58,12 @@

Welcome to the cheese world!

- +

Enter YouTube Video URL

+
+ + +
+ - - - + + + - diff --git a/public/js/audio.js b/public/js/audio.js new file mode 100644 index 000000000..1de0f7e11 --- /dev/null +++ b/public/js/audio.js @@ -0,0 +1,112 @@ +$(document).ready(() => { + let audioContext = null + let audioIntervalId = null + + // Create a socket object for communicating information about the markov chain + const socket = io() + + $('.button-loading').hide() + let processing = false + + $('.video-input-form').submit(() => { + if (!processing) { + $('.button-loading').show() + $('.button-idle').hide() + $('.video-url-input').prop('disabled', 'disabled') + processing = true + + // Create an AudioContext for output + if (audioContext) { + audioContext.close() + clearInterval(audioIntervalId) + } + audioContext = new AudioContext() + const audioContextTimestamp = Date.now() + const bufferSource = audioContext.createBufferSource() + const resonanceAudio = new ResonanceAudio(audioContext) + resonanceAudio.output.connect(audioContext.destination) + + // Open an XMLHttpRequest to stream audio data from YouTube + const videoUrl = $('.video-url-input').val() + let videoId = '' + try { + videoId = videoUrl.split('=')[1] + } catch (error) { + // eslint-disable-next-line no-console + console.error('Unable to parse video ID. Our code is also really bad.') + processing = false + return + } + const request = new XMLHttpRequest() + request.open('POST', `/stream/${videoId}`, true) + request.responseType = 'arraybuffer' + request.onload = function() { + // Decode the arraybuffer from the XMLHttpRequest + audioContext.decodeAudioData(request.response, buffer => { + // Process the audio stream for spatialization + calculateSpatialVectors(buffer, peaks => { + $('.button-loading').hide() + $('.button-idle').show() + $('.video-url-input').removeAttr('disabled') + processing = false + // Connect the audio buffer to the AudioContext for output + const source = resonanceAudio.createSource() + bufferSource.buffer = buffer + bufferSource.connect(source.input) + bufferSource.start() + const audioContextDelay = Date.now() - audioContextTimestamp + + // Request the current state of the markov chain from the server + socket.emit('get-markov', pdf => { + const sequence = new Sequence(pdf, peaks) + const positionVector = sequence.getPointList() + audioIntervalId = setInterval(() => { + const frame = Math.round( + audioContext.currentTime * 1000 - audioContextDelay) + source.setPosition(...positionVector[frame]) + }, UPDATE_RATE) + + bufferSource.onended = () => { + clearInterval(audioIntervalId) + } + + $('.pause').off().on('click', () => { + audioContext.suspend() + }) + + $('.resume').off().on('click', () => { + audioContext.resume() + }) + + $('.upvote').off().on('click', () => { + alert('Sequence upvoted!') + socket.emit('update-markov', { + direction: 1, + sequence: sequence + }) + }) + + $('.downvote').off().on('click', () => { + alert('Sequence downvoted!') + socket.emit('update-markov', { + direction: -1, + sequence: sequence + }) + }) + }) + }) + }, error => { + alert('Unable to process audio stream! Fuck!') + $('.button-loading').hide() + $('.button-idle').show() + $('.video-url-input').removeAttr('disabled') + processing = false + // eslint-disable-next-line no-console + console.error(error) + }) + } + request.send() + } + return false + }) +}) diff --git a/public/js/myGui.js b/public/js/myGui.js new file mode 100644 index 000000000..57269c35b --- /dev/null +++ b/public/js/myGui.js @@ -0,0 +1,16 @@ +var FizzyText = function() { + this.message = 'dat.gui'; + this.speed = 0.8; + this.displayOutline = false; + this.explode = function() { ... }; + // Define render logic ... +} + +window.onload = function() { + var text = new FizzyText(); + var gui = new dat.GUI(); + gui.add(text, 'message'); + gui.add(text, 'speed', -5, 5); + gui.add(text, 'displayOutline'); + gui.add(text, 'explode'); +} From 6927ee6c894adc589d2a5675af6c82454dd85a84 Mon Sep 17 00:00:00 2001 From: Hunter Date: Thu, 26 Sep 2019 19:02:51 -0400 Subject: [PATCH 08/54] morgan declare --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 919000eb3..164baceec 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,6 @@ const express = require( 'express' ), app = express(), - // morgan = require( 'morgan' ) + morgan = require( 'morgan' ) session = require( 'express-session' ), //1 // passport = require( 'passport' ), //2 // GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; From 04fca2e5a5dcf4b11b0cc3277c6065d57983f64a Mon Sep 17 00:00:00 2001 From: Hunter Date: Thu, 26 Sep 2019 20:10:32 -0400 Subject: [PATCH 09/54] change --- public/index.html | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/public/index.html b/public/index.html index cc120c329..da6c884f8 100644 --- a/public/index.html +++ b/public/index.html @@ -2,14 +2,22 @@ - - - - - - - - + + + + + + + + + + + + + + + + From 7c081e3928e1c9e8fa5cc50ea83b0b0d1cea5501 Mon Sep 17 00:00:00 2001 From: Hunter Date: Thu, 26 Sep 2019 20:12:05 -0400 Subject: [PATCH 10/54] index --- public/index.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/index.html b/public/index.html index da6c884f8..4d2740253 100644 --- a/public/index.html +++ b/public/index.html @@ -28,7 +28,6 @@
-
--> + From 74454780d6ca2620b7b80e5eee647313df401872 Mon Sep 17 00:00:00 2001 From: Hunter Date: Thu, 26 Sep 2019 23:40:35 -0400 Subject: [PATCH 11/54] js --- index.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/index.js b/index.js index 164baceec..3cf1d63bf 100644 --- a/index.js +++ b/index.js @@ -1,16 +1,12 @@ const express = require( 'express' ), app = express(), morgan = require( 'morgan' ) - session = require( 'express-session' ), //1 - // passport = require( 'passport' ), //2 - // GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; - bodyParser= require( 'body-parser' ), //3 - favicon = require( 'serve-favicon' ), //4 + // session = require( 'express-session' ), + // passport = require( 'passport' ), + // GoogleStrategy = require('passport-google-oauth').OAuth2Strategy, + bodyParser= require( 'body-parser' ), + favicon = require( 'serve-favicon' ), path = require( 'path' ), - // low = require('lowdb'), //5 - // FileSync = require('lowdb/adapters/FileSync'), - // adapter = new FileSync('db.json'), - // db = low(adapter), helmet = require('helmet'), compression = require('compression'), fs = require('fs'), @@ -26,7 +22,7 @@ app.use(compression()) app.use( express.static('public')) app.use( bodyParser.json()) app.use(favicon(path.join('public','res','favicon.ico'))) -app.use( session({ secret:'fromage', name:'a3-cookie', resave:false, saveUninitialized:true }) ) +// app.use( session({ secret:'fromage', name:'a3-cookie', resave:false, saveUninitialized:true }) ) // app.use(babel) app.use(morgan('dev')) From 1977e837f7002fb2792f892c9e3f00fd2f8f9507 Mon Sep 17 00:00:00 2001 From: Hunter Date: Thu, 26 Sep 2019 23:55:09 -0400 Subject: [PATCH 12/54] sorting out index --- public/index.html | 4 ++-- public/js/myGui.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/index.html b/public/index.html index 4d2740253..c256f38b9 100644 --- a/public/index.html +++ b/public/index.html @@ -16,8 +16,8 @@ - - + + diff --git a/public/js/myGui.js b/public/js/myGui.js index 57269c35b..ce5494a37 100644 --- a/public/js/myGui.js +++ b/public/js/myGui.js @@ -1,4 +1,4 @@ -var FizzyText = function() { +let FizzyText = function() { this.message = 'dat.gui'; this.speed = 0.8; this.displayOutline = false; From 682a28dc789543d385404691e96073898468959d Mon Sep 17 00:00:00 2001 From: Hunter Date: Fri, 27 Sep 2019 00:00:27 -0400 Subject: [PATCH 13/54] index --- public/index.html | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/public/index.html b/public/index.html index c256f38b9..7214eeaf7 100644 --- a/public/index.html +++ b/public/index.html @@ -16,8 +16,9 @@ - - + + + @@ -67,9 +68,9 @@

Welcome to the cheese world!

Enter YouTube Video URL

-
- - + + +
@@ -97,9 +98,6 @@

Enter YouTube Video URL

- - - From f5fce68fc42fe3f4a5c0ffa0be8ebfe4fac4eff0 Mon Sep 17 00:00:00 2001 From: Hunter Date: Fri, 27 Sep 2019 00:04:25 -0400 Subject: [PATCH 14/54] dat.gui --- public/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/index.html b/public/index.html index 7214eeaf7..12664d202 100644 --- a/public/index.html +++ b/public/index.html @@ -14,7 +14,7 @@ - + From 38662f1f4856d7d100391576b7b4c91f16e99293 Mon Sep 17 00:00:00 2001 From: Hunter Date: Fri, 27 Sep 2019 00:13:36 -0400 Subject: [PATCH 15/54] gui in head --- public/index.html | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/public/index.html b/public/index.html index 12664d202..f2f1f9e1d 100644 --- a/public/index.html +++ b/public/index.html @@ -14,13 +14,36 @@ - + - + + + + + creative coding -- a4-hcaouette -- CS4241 Assignment 4 From 29d048637068f6d8a79cafb9d0712510e23c9a1d Mon Sep 17 00:00:00 2001 From: Hunter Date: Fri, 27 Sep 2019 00:21:28 -0400 Subject: [PATCH 16/54] index --- public/index.html | 55 +++++------------------------------------------ 1 file changed, 5 insertions(+), 50 deletions(-) diff --git a/public/index.html b/public/index.html index f2f1f9e1d..d6c0ae2ad 100644 --- a/public/index.html +++ b/public/index.html @@ -14,35 +14,11 @@ - - - - - - - - - + + + + creative coding -- a4-hcaouette -- CS4241 Assignment 4 @@ -75,11 +51,9 @@ - @@ -97,25 +71,6 @@

Enter YouTube Video URL

- - - From 523797af8935cb7ef89170121c6f57964a6672d5 Mon Sep 17 00:00:00 2001 From: Hunter Date: Fri, 27 Sep 2019 16:42:25 -0400 Subject: [PATCH 17/54] styles --- public/css/style.css | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/public/css/style.css b/public/css/style.css index ad23a2664..f3e2b91fc 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -97,3 +97,19 @@ nav{ .pull-away-sides{ width: 96%/*!important */; } + +#canvas { + margin-left: auto; + margin-right: auto; + display: block; + background-color: black; +} +#controls { + text-align: center; +} +#start_button, #stop_button { + font-size: 16pt; +} +#msg { + text-align: center; +} From 88383153f74fe5284da244443965fcac3cace529 Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 13:21:56 -0400 Subject: [PATCH 18/54] adding build folder of dat.gui to dir. hoping this fixes --- build/dat.gui.css | 1 + build/dat.gui.js | 2537 +++++++++++++++++++++++++++++++++++ build/dat.gui.js.map | 1 + build/dat.gui.min.js | 13 + build/dat.gui.module.js | 2523 ++++++++++++++++++++++++++++++++++ build/dat.gui.module.js.map | 1 + public/js/myGui.js | 16 +- 7 files changed, 5084 insertions(+), 8 deletions(-) create mode 100644 build/dat.gui.css create mode 100644 build/dat.gui.js create mode 100644 build/dat.gui.js.map create mode 100644 build/dat.gui.min.js create mode 100644 build/dat.gui.module.js create mode 100644 build/dat.gui.module.js.map diff --git a/build/dat.gui.css b/build/dat.gui.css new file mode 100644 index 000000000..c039f4538 --- /dev/null +++ b/build/dat.gui.css @@ -0,0 +1 @@ +.dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda} diff --git a/build/dat.gui.js b/build/dat.gui.js new file mode 100644 index 000000000..85fadecc2 --- /dev/null +++ b/build/dat.gui.js @@ -0,0 +1,2537 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.dat = {}))); +}(this, (function (exports) { 'use strict'; + +function ___$insertStyle(css) { + if (!css) { + return; + } + if (typeof window === 'undefined') { + return; + } + + var style = document.createElement('style'); + + style.setAttribute('type', 'text/css'); + style.innerHTML = css; + document.head.appendChild(style); + + return css; +} + +function colorToString (color, forceCSSHex) { + var colorFormat = color.__state.conversionName.toString(); + var r = Math.round(color.r); + var g = Math.round(color.g); + var b = Math.round(color.b); + var a = color.a; + var h = Math.round(color.h); + var s = color.s.toFixed(1); + var v = color.v.toFixed(1); + if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') { + var str = color.hex.toString(16); + while (str.length < 6) { + str = '0' + str; + } + return '#' + str; + } else if (colorFormat === 'CSS_RGB') { + return 'rgb(' + r + ',' + g + ',' + b + ')'; + } else if (colorFormat === 'CSS_RGBA') { + return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; + } else if (colorFormat === 'HEX') { + return '0x' + color.hex.toString(16); + } else if (colorFormat === 'RGB_ARRAY') { + return '[' + r + ',' + g + ',' + b + ']'; + } else if (colorFormat === 'RGBA_ARRAY') { + return '[' + r + ',' + g + ',' + b + ',' + a + ']'; + } else if (colorFormat === 'RGB_OBJ') { + return '{r:' + r + ',g:' + g + ',b:' + b + '}'; + } else if (colorFormat === 'RGBA_OBJ') { + return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}'; + } else if (colorFormat === 'HSV_OBJ') { + return '{h:' + h + ',s:' + s + ',v:' + v + '}'; + } else if (colorFormat === 'HSVA_OBJ') { + return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}'; + } + return 'unknown format'; +} + +var ARR_EACH = Array.prototype.forEach; +var ARR_SLICE = Array.prototype.slice; +var Common = { + BREAK: {}, + extend: function extend(target) { + this.each(ARR_SLICE.call(arguments, 1), function (obj) { + var keys = this.isObject(obj) ? Object.keys(obj) : []; + keys.forEach(function (key) { + if (!this.isUndefined(obj[key])) { + target[key] = obj[key]; + } + }.bind(this)); + }, this); + return target; + }, + defaults: function defaults(target) { + this.each(ARR_SLICE.call(arguments, 1), function (obj) { + var keys = this.isObject(obj) ? Object.keys(obj) : []; + keys.forEach(function (key) { + if (this.isUndefined(target[key])) { + target[key] = obj[key]; + } + }.bind(this)); + }, this); + return target; + }, + compose: function compose() { + var toCall = ARR_SLICE.call(arguments); + return function () { + var args = ARR_SLICE.call(arguments); + for (var i = toCall.length - 1; i >= 0; i--) { + args = [toCall[i].apply(this, args)]; + } + return args[0]; + }; + }, + each: function each(obj, itr, scope) { + if (!obj) { + return; + } + if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) { + obj.forEach(itr, scope); + } else if (obj.length === obj.length + 0) { + var key = void 0; + var l = void 0; + for (key = 0, l = obj.length; key < l; key++) { + if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) { + return; + } + } + } else { + for (var _key in obj) { + if (itr.call(scope, obj[_key], _key) === this.BREAK) { + return; + } + } + } + }, + defer: function defer(fnc) { + setTimeout(fnc, 0); + }, + debounce: function debounce(func, threshold, callImmediately) { + var timeout = void 0; + return function () { + var obj = this; + var args = arguments; + function delayed() { + timeout = null; + if (!callImmediately) func.apply(obj, args); + } + var callNow = callImmediately || !timeout; + clearTimeout(timeout); + timeout = setTimeout(delayed, threshold); + if (callNow) { + func.apply(obj, args); + } + }; + }, + toArray: function toArray(obj) { + if (obj.toArray) return obj.toArray(); + return ARR_SLICE.call(obj); + }, + isUndefined: function isUndefined(obj) { + return obj === undefined; + }, + isNull: function isNull(obj) { + return obj === null; + }, + isNaN: function (_isNaN) { + function isNaN(_x) { + return _isNaN.apply(this, arguments); + } + isNaN.toString = function () { + return _isNaN.toString(); + }; + return isNaN; + }(function (obj) { + return isNaN(obj); + }), + isArray: Array.isArray || function (obj) { + return obj.constructor === Array; + }, + isObject: function isObject(obj) { + return obj === Object(obj); + }, + isNumber: function isNumber(obj) { + return obj === obj + 0; + }, + isString: function isString(obj) { + return obj === obj + ''; + }, + isBoolean: function isBoolean(obj) { + return obj === false || obj === true; + }, + isFunction: function isFunction(obj) { + return Object.prototype.toString.call(obj) === '[object Function]'; + } +}; + +var INTERPRETATIONS = [ +{ + litmus: Common.isString, + conversions: { + THREE_CHAR_HEX: { + read: function read(original) { + var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); + if (test === null) { + return false; + } + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0) + }; + }, + write: colorToString + }, + SIX_CHAR_HEX: { + read: function read(original) { + var test = original.match(/^#([A-F0-9]{6})$/i); + if (test === null) { + return false; + } + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString(), 0) + }; + }, + write: colorToString + }, + CSS_RGB: { + read: function read(original) { + var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) { + return false; + } + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]) + }; + }, + write: colorToString + }, + CSS_RGBA: { + read: function read(original) { + var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) { + return false; + } + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]), + a: parseFloat(test[4]) + }; + }, + write: colorToString + } + } +}, +{ + litmus: Common.isNumber, + conversions: { + HEX: { + read: function read(original) { + return { + space: 'HEX', + hex: original, + conversionName: 'HEX' + }; + }, + write: function write(color) { + return color.hex; + } + } + } +}, +{ + litmus: Common.isArray, + conversions: { + RGB_ARRAY: { + read: function read(original) { + if (original.length !== 3) { + return false; + } + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2] + }; + }, + write: function write(color) { + return [color.r, color.g, color.b]; + } + }, + RGBA_ARRAY: { + read: function read(original) { + if (original.length !== 4) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2], + a: original[3] + }; + }, + write: function write(color) { + return [color.r, color.g, color.b, color.a]; + } + } + } +}, +{ + litmus: Common.isObject, + conversions: { + RGBA_OBJ: { + read: function read(original) { + if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b, + a: original.a + }; + } + return false; + }, + write: function write(color) { + return { + r: color.r, + g: color.g, + b: color.b, + a: color.a + }; + } + }, + RGB_OBJ: { + read: function read(original) { + if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b + }; + } + return false; + }, + write: function write(color) { + return { + r: color.r, + g: color.g, + b: color.b + }; + } + }, + HSVA_OBJ: { + read: function read(original) { + if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v, + a: original.a + }; + } + return false; + }, + write: function write(color) { + return { + h: color.h, + s: color.s, + v: color.v, + a: color.a + }; + } + }, + HSV_OBJ: { + read: function read(original) { + if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v + }; + } + return false; + }, + write: function write(color) { + return { + h: color.h, + s: color.s, + v: color.v + }; + } + } + } +}]; +var result = void 0; +var toReturn = void 0; +var interpret = function interpret() { + toReturn = false; + var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0]; + Common.each(INTERPRETATIONS, function (family) { + if (family.litmus(original)) { + Common.each(family.conversions, function (conversion, conversionName) { + result = conversion.read(original); + if (toReturn === false && result !== false) { + toReturn = result; + result.conversionName = conversionName; + result.conversion = conversion; + return Common.BREAK; + } + }); + return Common.BREAK; + } + }); + return toReturn; +}; + +var tmpComponent = void 0; +var ColorMath = { + hsv_to_rgb: function hsv_to_rgb(h, s, v) { + var hi = Math.floor(h / 60) % 6; + var f = h / 60 - Math.floor(h / 60); + var p = v * (1.0 - s); + var q = v * (1.0 - f * s); + var t = v * (1.0 - (1.0 - f) * s); + var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi]; + return { + r: c[0] * 255, + g: c[1] * 255, + b: c[2] * 255 + }; + }, + rgb_to_hsv: function rgb_to_hsv(r, g, b) { + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h = void 0; + var s = void 0; + if (max !== 0) { + s = delta / max; + } else { + return { + h: NaN, + s: 0, + v: 0 + }; + } + if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else { + h = 4 + (r - g) / delta; + } + h /= 6; + if (h < 0) { + h += 1; + } + return { + h: h * 360, + s: s, + v: max / 255 + }; + }, + rgb_to_hex: function rgb_to_hex(r, g, b) { + var hex = this.hex_with_component(0, 2, r); + hex = this.hex_with_component(hex, 1, g); + hex = this.hex_with_component(hex, 0, b); + return hex; + }, + component_from_hex: function component_from_hex(hex, componentIndex) { + return hex >> componentIndex * 8 & 0xFF; + }, + hex_with_component: function hex_with_component(hex, componentIndex, value) { + return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent); + } +}; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; +}; + + + + + + + + + + + +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + + + + + + + +var get = function get(object, property, receiver) { + if (object === null) object = Function.prototype; + var desc = Object.getOwnPropertyDescriptor(object, property); + + if (desc === undefined) { + var parent = Object.getPrototypeOf(object); + + if (parent === null) { + return undefined; + } else { + return get(parent, property, receiver); + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get; + + if (getter === undefined) { + return undefined; + } + + return getter.call(receiver); + } +}; + +var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +}; + + + + + + + + + + + +var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; +}; + +var Color = function () { + function Color() { + classCallCheck(this, Color); + this.__state = interpret.apply(this, arguments); + if (this.__state === false) { + throw new Error('Failed to interpret color arguments'); + } + this.__state.a = this.__state.a || 1; + } + createClass(Color, [{ + key: 'toString', + value: function toString() { + return colorToString(this); + } + }, { + key: 'toHexString', + value: function toHexString() { + return colorToString(this, true); + } + }, { + key: 'toOriginal', + value: function toOriginal() { + return this.__state.conversion.write(this); + } + }]); + return Color; +}(); +function defineRGBComponent(target, component, componentHexIndex) { + Object.defineProperty(target, component, { + get: function get$$1() { + if (this.__state.space === 'RGB') { + return this.__state[component]; + } + Color.recalculateRGB(this, component, componentHexIndex); + return this.__state[component]; + }, + set: function set$$1(v) { + if (this.__state.space !== 'RGB') { + Color.recalculateRGB(this, component, componentHexIndex); + this.__state.space = 'RGB'; + } + this.__state[component] = v; + } + }); +} +function defineHSVComponent(target, component) { + Object.defineProperty(target, component, { + get: function get$$1() { + if (this.__state.space === 'HSV') { + return this.__state[component]; + } + Color.recalculateHSV(this); + return this.__state[component]; + }, + set: function set$$1(v) { + if (this.__state.space !== 'HSV') { + Color.recalculateHSV(this); + this.__state.space = 'HSV'; + } + this.__state[component] = v; + } + }); +} +Color.recalculateRGB = function (color, component, componentHexIndex) { + if (color.__state.space === 'HEX') { + color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex); + } else if (color.__state.space === 'HSV') { + Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); + } else { + throw new Error('Corrupted color state'); + } +}; +Color.recalculateHSV = function (color) { + var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b); + Common.extend(color.__state, { + s: result.s, + v: result.v + }); + if (!Common.isNaN(result.h)) { + color.__state.h = result.h; + } else if (Common.isUndefined(color.__state.h)) { + color.__state.h = 0; + } +}; +Color.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a']; +defineRGBComponent(Color.prototype, 'r', 2); +defineRGBComponent(Color.prototype, 'g', 1); +defineRGBComponent(Color.prototype, 'b', 0); +defineHSVComponent(Color.prototype, 'h'); +defineHSVComponent(Color.prototype, 's'); +defineHSVComponent(Color.prototype, 'v'); +Object.defineProperty(Color.prototype, 'a', { + get: function get$$1() { + return this.__state.a; + }, + set: function set$$1(v) { + this.__state.a = v; + } +}); +Object.defineProperty(Color.prototype, 'hex', { + get: function get$$1() { + if (!this.__state.space !== 'HEX') { + this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b); + } + return this.__state.hex; + }, + set: function set$$1(v) { + this.__state.space = 'HEX'; + this.__state.hex = v; + } +}); + +var Controller = function () { + function Controller(object, property) { + classCallCheck(this, Controller); + this.initialValue = object[property]; + this.domElement = document.createElement('div'); + this.object = object; + this.property = property; + this.__onChange = undefined; + this.__onFinishChange = undefined; + } + createClass(Controller, [{ + key: 'onChange', + value: function onChange(fnc) { + this.__onChange = fnc; + return this; + } + }, { + key: 'onFinishChange', + value: function onFinishChange(fnc) { + this.__onFinishChange = fnc; + return this; + } + }, { + key: 'setValue', + value: function setValue(newValue) { + this.object[this.property] = newValue; + if (this.__onChange) { + this.__onChange.call(this, newValue); + } + this.updateDisplay(); + return this; + } + }, { + key: 'getValue', + value: function getValue() { + return this.object[this.property]; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + return this; + } + }, { + key: 'isModified', + value: function isModified() { + return this.initialValue !== this.getValue(); + } + }]); + return Controller; +}(); + +var EVENT_MAP = { + HTMLEvents: ['change'], + MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'], + KeyboardEvents: ['keydown'] +}; +var EVENT_MAP_INV = {}; +Common.each(EVENT_MAP, function (v, k) { + Common.each(v, function (e) { + EVENT_MAP_INV[e] = k; + }); +}); +var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; +function cssValueToPixels(val) { + if (val === '0' || Common.isUndefined(val)) { + return 0; + } + var match = val.match(CSS_VALUE_PIXELS); + if (!Common.isNull(match)) { + return parseFloat(match[1]); + } + return 0; +} +var dom = { + makeSelectable: function makeSelectable(elem, selectable) { + if (elem === undefined || elem.style === undefined) return; + elem.onselectstart = selectable ? function () { + return false; + } : function () {}; + elem.style.MozUserSelect = selectable ? 'auto' : 'none'; + elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; + elem.unselectable = selectable ? 'on' : 'off'; + }, + makeFullscreen: function makeFullscreen(elem, hor, vert) { + var vertical = vert; + var horizontal = hor; + if (Common.isUndefined(horizontal)) { + horizontal = true; + } + if (Common.isUndefined(vertical)) { + vertical = true; + } + elem.style.position = 'absolute'; + if (horizontal) { + elem.style.left = 0; + elem.style.right = 0; + } + if (vertical) { + elem.style.top = 0; + elem.style.bottom = 0; + } + }, + fakeEvent: function fakeEvent(elem, eventType, pars, aux) { + var params = pars || {}; + var className = EVENT_MAP_INV[eventType]; + if (!className) { + throw new Error('Event type ' + eventType + ' not supported.'); + } + var evt = document.createEvent(className); + switch (className) { + case 'MouseEvents': + { + var clientX = params.x || params.clientX || 0; + var clientY = params.y || params.clientY || 0; + evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0, + 0, + clientX, + clientY, + false, false, false, false, 0, null); + break; + } + case 'KeyboardEvents': + { + var init = evt.initKeyboardEvent || evt.initKeyEvent; + Common.defaults(params, { + cancelable: true, + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false, + keyCode: undefined, + charCode: undefined + }); + init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode); + break; + } + default: + { + evt.initEvent(eventType, params.bubbles || false, params.cancelable || true); + break; + } + } + Common.defaults(evt, aux); + elem.dispatchEvent(evt); + }, + bind: function bind(elem, event, func, newBool) { + var bool = newBool || false; + if (elem.addEventListener) { + elem.addEventListener(event, func, bool); + } else if (elem.attachEvent) { + elem.attachEvent('on' + event, func); + } + return dom; + }, + unbind: function unbind(elem, event, func, newBool) { + var bool = newBool || false; + if (elem.removeEventListener) { + elem.removeEventListener(event, func, bool); + } else if (elem.detachEvent) { + elem.detachEvent('on' + event, func); + } + return dom; + }, + addClass: function addClass(elem, className) { + if (elem.className === undefined) { + elem.className = className; + } else if (elem.className !== className) { + var classes = elem.className.split(/ +/); + if (classes.indexOf(className) === -1) { + classes.push(className); + elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); + } + } + return dom; + }, + removeClass: function removeClass(elem, className) { + if (className) { + if (elem.className === className) { + elem.removeAttribute('class'); + } else { + var classes = elem.className.split(/ +/); + var index = classes.indexOf(className); + if (index !== -1) { + classes.splice(index, 1); + elem.className = classes.join(' '); + } + } + } else { + elem.className = undefined; + } + return dom; + }, + hasClass: function hasClass(elem, className) { + return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; + }, + getWidth: function getWidth(elem) { + var style = getComputedStyle(elem); + return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width); + }, + getHeight: function getHeight(elem) { + var style = getComputedStyle(elem); + return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height); + }, + getOffset: function getOffset(el) { + var elem = el; + var offset = { left: 0, top: 0 }; + if (elem.offsetParent) { + do { + offset.left += elem.offsetLeft; + offset.top += elem.offsetTop; + elem = elem.offsetParent; + } while (elem); + } + return offset; + }, + isActive: function isActive(elem) { + return elem === document.activeElement && (elem.type || elem.href); + } +}; + +var BooleanController = function (_Controller) { + inherits(BooleanController, _Controller); + function BooleanController(object, property) { + classCallCheck(this, BooleanController); + var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property)); + var _this = _this2; + _this2.__prev = _this2.getValue(); + _this2.__checkbox = document.createElement('input'); + _this2.__checkbox.setAttribute('type', 'checkbox'); + function onChange() { + _this.setValue(!_this.__prev); + } + dom.bind(_this2.__checkbox, 'change', onChange, false); + _this2.domElement.appendChild(_this2.__checkbox); + _this2.updateDisplay(); + return _this2; + } + createClass(BooleanController, [{ + key: 'setValue', + value: function setValue(v) { + var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + this.__prev = this.getValue(); + return toReturn; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + if (this.getValue() === true) { + this.__checkbox.setAttribute('checked', 'checked'); + this.__checkbox.checked = true; + this.__prev = true; + } else { + this.__checkbox.checked = false; + this.__prev = false; + } + return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this); + } + }]); + return BooleanController; +}(Controller); + +var OptionController = function (_Controller) { + inherits(OptionController, _Controller); + function OptionController(object, property, opts) { + classCallCheck(this, OptionController); + var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property)); + var options = opts; + var _this = _this2; + _this2.__select = document.createElement('select'); + if (Common.isArray(options)) { + var map = {}; + Common.each(options, function (element) { + map[element] = element; + }); + options = map; + } + Common.each(options, function (value, key) { + var opt = document.createElement('option'); + opt.innerHTML = key; + opt.setAttribute('value', value); + _this.__select.appendChild(opt); + }); + _this2.updateDisplay(); + dom.bind(_this2.__select, 'change', function () { + var desiredValue = this.options[this.selectedIndex].value; + _this.setValue(desiredValue); + }); + _this2.domElement.appendChild(_this2.__select); + return _this2; + } + createClass(OptionController, [{ + key: 'setValue', + value: function setValue(v) { + var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + return toReturn; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + if (dom.isActive(this.__select)) return this; + this.__select.value = this.getValue(); + return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this); + } + }]); + return OptionController; +}(Controller); + +var StringController = function (_Controller) { + inherits(StringController, _Controller); + function StringController(object, property) { + classCallCheck(this, StringController); + var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property)); + var _this = _this2; + function onChange() { + _this.setValue(_this.__input.value); + } + function onBlur() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + _this2.__input = document.createElement('input'); + _this2.__input.setAttribute('type', 'text'); + dom.bind(_this2.__input, 'keyup', onChange); + dom.bind(_this2.__input, 'change', onChange); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + this.blur(); + } + }); + _this2.updateDisplay(); + _this2.domElement.appendChild(_this2.__input); + return _this2; + } + createClass(StringController, [{ + key: 'updateDisplay', + value: function updateDisplay() { + if (!dom.isActive(this.__input)) { + this.__input.value = this.getValue(); + } + return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this); + } + }]); + return StringController; +}(Controller); + +function numDecimals(x) { + var _x = x.toString(); + if (_x.indexOf('.') > -1) { + return _x.length - _x.indexOf('.') - 1; + } + return 0; +} +var NumberController = function (_Controller) { + inherits(NumberController, _Controller); + function NumberController(object, property, params) { + classCallCheck(this, NumberController); + var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property)); + var _params = params || {}; + _this.__min = _params.min; + _this.__max = _params.max; + _this.__step = _params.step; + if (Common.isUndefined(_this.__step)) { + if (_this.initialValue === 0) { + _this.__impliedStep = 1; + } else { + _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10; + } + } else { + _this.__impliedStep = _this.__step; + } + _this.__precision = numDecimals(_this.__impliedStep); + return _this; + } + createClass(NumberController, [{ + key: 'setValue', + value: function setValue(v) { + var _v = v; + if (this.__min !== undefined && _v < this.__min) { + _v = this.__min; + } else if (this.__max !== undefined && _v > this.__max) { + _v = this.__max; + } + if (this.__step !== undefined && _v % this.__step !== 0) { + _v = Math.round(_v / this.__step) * this.__step; + } + return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v); + } + }, { + key: 'min', + value: function min(minValue) { + this.__min = minValue; + return this; + } + }, { + key: 'max', + value: function max(maxValue) { + this.__max = maxValue; + return this; + } + }, { + key: 'step', + value: function step(stepValue) { + this.__step = stepValue; + this.__impliedStep = stepValue; + this.__precision = numDecimals(stepValue); + return this; + } + }]); + return NumberController; +}(Controller); + +function roundToDecimal(value, decimals) { + var tenTo = Math.pow(10, decimals); + return Math.round(value * tenTo) / tenTo; +} +var NumberControllerBox = function (_NumberController) { + inherits(NumberControllerBox, _NumberController); + function NumberControllerBox(object, property, params) { + classCallCheck(this, NumberControllerBox); + var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params)); + _this2.__truncationSuspended = false; + var _this = _this2; + var prevY = void 0; + function onChange() { + var attempted = parseFloat(_this.__input.value); + if (!Common.isNaN(attempted)) { + _this.setValue(attempted); + } + } + function onFinish() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + function onBlur() { + onFinish(); + } + function onMouseDrag(e) { + var diff = prevY - e.clientY; + _this.setValue(_this.getValue() + diff * _this.__impliedStep); + prevY = e.clientY; + } + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + onFinish(); + } + function onMouseDown(e) { + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + prevY = e.clientY; + } + _this2.__input = document.createElement('input'); + _this2.__input.setAttribute('type', 'text'); + dom.bind(_this2.__input, 'change', onChange); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__input, 'mousedown', onMouseDown); + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + _this.__truncationSuspended = true; + this.blur(); + _this.__truncationSuspended = false; + onFinish(); + } + }); + _this2.updateDisplay(); + _this2.domElement.appendChild(_this2.__input); + return _this2; + } + createClass(NumberControllerBox, [{ + key: 'updateDisplay', + value: function updateDisplay() { + this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); + return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this); + } + }]); + return NumberControllerBox; +}(NumberController); + +function map(v, i1, i2, o1, o2) { + return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); +} +var NumberControllerSlider = function (_NumberController) { + inherits(NumberControllerSlider, _NumberController); + function NumberControllerSlider(object, property, min, max, step) { + classCallCheck(this, NumberControllerSlider); + var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step })); + var _this = _this2; + _this2.__background = document.createElement('div'); + _this2.__foreground = document.createElement('div'); + dom.bind(_this2.__background, 'mousedown', onMouseDown); + dom.bind(_this2.__background, 'touchstart', onTouchStart); + dom.addClass(_this2.__background, 'slider'); + dom.addClass(_this2.__foreground, 'slider-fg'); + function onMouseDown(e) { + document.activeElement.blur(); + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + onMouseDrag(e); + } + function onMouseDrag(e) { + e.preventDefault(); + var bgRect = _this.__background.getBoundingClientRect(); + _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); + return false; + } + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + function onTouchStart(e) { + if (e.touches.length !== 1) { + return; + } + dom.bind(window, 'touchmove', onTouchMove); + dom.bind(window, 'touchend', onTouchEnd); + onTouchMove(e); + } + function onTouchMove(e) { + var clientX = e.touches[0].clientX; + var bgRect = _this.__background.getBoundingClientRect(); + _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); + } + function onTouchEnd() { + dom.unbind(window, 'touchmove', onTouchMove); + dom.unbind(window, 'touchend', onTouchEnd); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + _this2.updateDisplay(); + _this2.__background.appendChild(_this2.__foreground); + _this2.domElement.appendChild(_this2.__background); + return _this2; + } + createClass(NumberControllerSlider, [{ + key: 'updateDisplay', + value: function updateDisplay() { + var pct = (this.getValue() - this.__min) / (this.__max - this.__min); + this.__foreground.style.width = pct * 100 + '%'; + return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this); + } + }]); + return NumberControllerSlider; +}(NumberController); + +var FunctionController = function (_Controller) { + inherits(FunctionController, _Controller); + function FunctionController(object, property, text) { + classCallCheck(this, FunctionController); + var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property)); + var _this = _this2; + _this2.__button = document.createElement('div'); + _this2.__button.innerHTML = text === undefined ? 'Fire' : text; + dom.bind(_this2.__button, 'click', function (e) { + e.preventDefault(); + _this.fire(); + return false; + }); + dom.addClass(_this2.__button, 'button'); + _this2.domElement.appendChild(_this2.__button); + return _this2; + } + createClass(FunctionController, [{ + key: 'fire', + value: function fire() { + if (this.__onChange) { + this.__onChange.call(this); + } + this.getValue().call(this.object); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + } + }]); + return FunctionController; +}(Controller); + +var ColorController = function (_Controller) { + inherits(ColorController, _Controller); + function ColorController(object, property) { + classCallCheck(this, ColorController); + var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property)); + _this2.__color = new Color(_this2.getValue()); + _this2.__temp = new Color(0); + var _this = _this2; + _this2.domElement = document.createElement('div'); + dom.makeSelectable(_this2.domElement, false); + _this2.__selector = document.createElement('div'); + _this2.__selector.className = 'selector'; + _this2.__saturation_field = document.createElement('div'); + _this2.__saturation_field.className = 'saturation-field'; + _this2.__field_knob = document.createElement('div'); + _this2.__field_knob.className = 'field-knob'; + _this2.__field_knob_border = '2px solid '; + _this2.__hue_knob = document.createElement('div'); + _this2.__hue_knob.className = 'hue-knob'; + _this2.__hue_field = document.createElement('div'); + _this2.__hue_field.className = 'hue-field'; + _this2.__input = document.createElement('input'); + _this2.__input.type = 'text'; + _this2.__input_textShadow = '0 1px 1px '; + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + onBlur.call(this); + } + }); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__selector, 'mousedown', function () { + dom.addClass(this, 'drag').bind(window, 'mouseup', function () { + dom.removeClass(_this.__selector, 'drag'); + }); + }); + dom.bind(_this2.__selector, 'touchstart', function () { + dom.addClass(this, 'drag').bind(window, 'touchend', function () { + dom.removeClass(_this.__selector, 'drag'); + }); + }); + var valueField = document.createElement('div'); + Common.extend(_this2.__selector.style, { + width: '122px', + height: '102px', + padding: '3px', + backgroundColor: '#222', + boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' + }); + Common.extend(_this2.__field_knob.style, { + position: 'absolute', + width: '12px', + height: '12px', + border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'), + boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', + borderRadius: '12px', + zIndex: 1 + }); + Common.extend(_this2.__hue_knob.style, { + position: 'absolute', + width: '15px', + height: '2px', + borderRight: '4px solid #fff', + zIndex: 1 + }); + Common.extend(_this2.__saturation_field.style, { + width: '100px', + height: '100px', + border: '1px solid #555', + marginRight: '3px', + display: 'inline-block', + cursor: 'pointer' + }); + Common.extend(valueField.style, { + width: '100%', + height: '100%', + background: 'none' + }); + linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000'); + Common.extend(_this2.__hue_field.style, { + width: '15px', + height: '100px', + border: '1px solid #555', + cursor: 'ns-resize', + position: 'absolute', + top: '3px', + right: '3px' + }); + hueGradient(_this2.__hue_field); + Common.extend(_this2.__input.style, { + outline: 'none', + textAlign: 'center', + color: '#fff', + border: 0, + fontWeight: 'bold', + textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)' + }); + dom.bind(_this2.__saturation_field, 'mousedown', fieldDown); + dom.bind(_this2.__saturation_field, 'touchstart', fieldDown); + dom.bind(_this2.__field_knob, 'mousedown', fieldDown); + dom.bind(_this2.__field_knob, 'touchstart', fieldDown); + dom.bind(_this2.__hue_field, 'mousedown', fieldDownH); + dom.bind(_this2.__hue_field, 'touchstart', fieldDownH); + function fieldDown(e) { + setSV(e); + dom.bind(window, 'mousemove', setSV); + dom.bind(window, 'touchmove', setSV); + dom.bind(window, 'mouseup', fieldUpSV); + dom.bind(window, 'touchend', fieldUpSV); + } + function fieldDownH(e) { + setH(e); + dom.bind(window, 'mousemove', setH); + dom.bind(window, 'touchmove', setH); + dom.bind(window, 'mouseup', fieldUpH); + dom.bind(window, 'touchend', fieldUpH); + } + function fieldUpSV() { + dom.unbind(window, 'mousemove', setSV); + dom.unbind(window, 'touchmove', setSV); + dom.unbind(window, 'mouseup', fieldUpSV); + dom.unbind(window, 'touchend', fieldUpSV); + onFinish(); + } + function fieldUpH() { + dom.unbind(window, 'mousemove', setH); + dom.unbind(window, 'touchmove', setH); + dom.unbind(window, 'mouseup', fieldUpH); + dom.unbind(window, 'touchend', fieldUpH); + onFinish(); + } + function onBlur() { + var i = interpret(this.value); + if (i !== false) { + _this.__color.__state = i; + _this.setValue(_this.__color.toOriginal()); + } else { + this.value = _this.__color.toString(); + } + } + function onFinish() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.__color.toOriginal()); + } + } + _this2.__saturation_field.appendChild(valueField); + _this2.__selector.appendChild(_this2.__field_knob); + _this2.__selector.appendChild(_this2.__saturation_field); + _this2.__selector.appendChild(_this2.__hue_field); + _this2.__hue_field.appendChild(_this2.__hue_knob); + _this2.domElement.appendChild(_this2.__input); + _this2.domElement.appendChild(_this2.__selector); + _this2.updateDisplay(); + function setSV(e) { + if (e.type.indexOf('touch') === -1) { + e.preventDefault(); + } + var fieldRect = _this.__saturation_field.getBoundingClientRect(); + var _ref = e.touches && e.touches[0] || e, + clientX = _ref.clientX, + clientY = _ref.clientY; + var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left); + var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); + if (v > 1) { + v = 1; + } else if (v < 0) { + v = 0; + } + if (s > 1) { + s = 1; + } else if (s < 0) { + s = 0; + } + _this.__color.v = v; + _this.__color.s = s; + _this.setValue(_this.__color.toOriginal()); + return false; + } + function setH(e) { + if (e.type.indexOf('touch') === -1) { + e.preventDefault(); + } + var fieldRect = _this.__hue_field.getBoundingClientRect(); + var _ref2 = e.touches && e.touches[0] || e, + clientY = _ref2.clientY; + var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); + if (h > 1) { + h = 1; + } else if (h < 0) { + h = 0; + } + _this.__color.h = h * 360; + _this.setValue(_this.__color.toOriginal()); + return false; + } + return _this2; + } + createClass(ColorController, [{ + key: 'updateDisplay', + value: function updateDisplay() { + var i = interpret(this.getValue()); + if (i !== false) { + var mismatch = false; + Common.each(Color.COMPONENTS, function (component) { + if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) { + mismatch = true; + return {}; + } + }, this); + if (mismatch) { + Common.extend(this.__color.__state, i); + } + } + Common.extend(this.__temp.__state, this.__color.__state); + this.__temp.a = 1; + var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0; + var _flip = 255 - flip; + Common.extend(this.__field_knob.style, { + marginLeft: 100 * this.__color.s - 7 + 'px', + marginTop: 100 * (1 - this.__color.v) - 7 + 'px', + backgroundColor: this.__temp.toHexString(), + border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')' + }); + this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'; + this.__temp.s = 1; + this.__temp.v = 1; + linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString()); + this.__input.value = this.__color.toString(); + Common.extend(this.__input.style, { + backgroundColor: this.__color.toHexString(), + color: 'rgb(' + flip + ',' + flip + ',' + flip + ')', + textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)' + }); + } + }]); + return ColorController; +}(Controller); +var vendors = ['-moz-', '-o-', '-webkit-', '-ms-', '']; +function linearGradient(elem, x, a, b) { + elem.style.background = ''; + Common.each(vendors, function (vendor) { + elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); '; + }); +} +function hueGradient(elem) { + elem.style.background = ''; + elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'; + elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; +} + +var css = { + load: function load(url, indoc) { + var doc = indoc || document; + var link = doc.createElement('link'); + link.type = 'text/css'; + link.rel = 'stylesheet'; + link.href = url; + doc.getElementsByTagName('head')[0].appendChild(link); + }, + inject: function inject(cssContent, indoc) { + var doc = indoc || document; + var injected = document.createElement('style'); + injected.type = 'text/css'; + injected.innerHTML = cssContent; + var head = doc.getElementsByTagName('head')[0]; + try { + head.appendChild(injected); + } catch (e) { + } + } +}; + +var saveDialogContents = "
\n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n
"; + +var ControllerFactory = function ControllerFactory(object, property) { + var initialValue = object[property]; + if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) { + return new OptionController(object, property, arguments[2]); + } + if (Common.isNumber(initialValue)) { + if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) { + if (Common.isNumber(arguments[4])) { + return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]); + } + return new NumberControllerSlider(object, property, arguments[2], arguments[3]); + } + if (Common.isNumber(arguments[4])) { + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] }); + } + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); + } + if (Common.isString(initialValue)) { + return new StringController(object, property); + } + if (Common.isFunction(initialValue)) { + return new FunctionController(object, property, ''); + } + if (Common.isBoolean(initialValue)) { + return new BooleanController(object, property); + } + return null; +}; + +function requestAnimationFrame(callback) { + setTimeout(callback, 1000 / 60); +} +var requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame; + +var CenteredDiv = function () { + function CenteredDiv() { + classCallCheck(this, CenteredDiv); + this.backgroundElement = document.createElement('div'); + Common.extend(this.backgroundElement.style, { + backgroundColor: 'rgba(0,0,0,0.8)', + top: 0, + left: 0, + display: 'none', + zIndex: '1000', + opacity: 0, + WebkitTransition: 'opacity 0.2s linear', + transition: 'opacity 0.2s linear' + }); + dom.makeFullscreen(this.backgroundElement); + this.backgroundElement.style.position = 'fixed'; + this.domElement = document.createElement('div'); + Common.extend(this.domElement.style, { + position: 'fixed', + display: 'none', + zIndex: '1001', + opacity: 0, + WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear', + transition: 'transform 0.2s ease-out, opacity 0.2s linear' + }); + document.body.appendChild(this.backgroundElement); + document.body.appendChild(this.domElement); + var _this = this; + dom.bind(this.backgroundElement, 'click', function () { + _this.hide(); + }); + } + createClass(CenteredDiv, [{ + key: 'show', + value: function show() { + var _this = this; + this.backgroundElement.style.display = 'block'; + this.domElement.style.display = 'block'; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + this.layout(); + Common.defer(function () { + _this.backgroundElement.style.opacity = 1; + _this.domElement.style.opacity = 1; + _this.domElement.style.webkitTransform = 'scale(1)'; + }); + } + }, { + key: 'hide', + value: function hide() { + var _this = this; + var hide = function hide() { + _this.domElement.style.display = 'none'; + _this.backgroundElement.style.display = 'none'; + dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); + dom.unbind(_this.domElement, 'transitionend', hide); + dom.unbind(_this.domElement, 'oTransitionEnd', hide); + }; + dom.bind(this.domElement, 'webkitTransitionEnd', hide); + dom.bind(this.domElement, 'transitionend', hide); + dom.bind(this.domElement, 'oTransitionEnd', hide); + this.backgroundElement.style.opacity = 0; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + } + }, { + key: 'layout', + value: function layout() { + this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px'; + this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px'; + } + }]); + return CenteredDiv; +}(); + +var styleSheet = ___$insertStyle(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"); + +css.inject(styleSheet); +var CSS_NAMESPACE = 'dg'; +var HIDE_KEY_CODE = 72; +var CLOSE_BUTTON_HEIGHT = 20; +var DEFAULT_DEFAULT_PRESET_NAME = 'Default'; +var SUPPORTS_LOCAL_STORAGE = function () { + try { + return !!window.localStorage; + } catch (e) { + return false; + } +}(); +var SAVE_DIALOGUE = void 0; +var autoPlaceVirgin = true; +var autoPlaceContainer = void 0; +var hide = false; +var hideableGuis = []; +var GUI = function GUI(pars) { + var _this = this; + var params = pars || {}; + this.domElement = document.createElement('div'); + this.__ul = document.createElement('ul'); + this.domElement.appendChild(this.__ul); + dom.addClass(this.domElement, CSS_NAMESPACE); + this.__folders = {}; + this.__controllers = []; + this.__rememberedObjects = []; + this.__rememberedObjectIndecesToControllers = []; + this.__listening = []; + params = Common.defaults(params, { + closeOnTop: false, + autoPlace: true, + width: GUI.DEFAULT_WIDTH + }); + params = Common.defaults(params, { + resizable: params.autoPlace, + hideable: params.autoPlace + }); + if (!Common.isUndefined(params.load)) { + if (params.preset) { + params.load.preset = params.preset; + } + } else { + params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; + } + if (Common.isUndefined(params.parent) && params.hideable) { + hideableGuis.push(this); + } + params.resizable = Common.isUndefined(params.parent) && params.resizable; + if (params.autoPlace && Common.isUndefined(params.scrollable)) { + params.scrollable = true; + } + var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; + var saveToLocalStorage = void 0; + var titleRow = void 0; + Object.defineProperties(this, + { + parent: { + get: function get$$1() { + return params.parent; + } + }, + scrollable: { + get: function get$$1() { + return params.scrollable; + } + }, + autoPlace: { + get: function get$$1() { + return params.autoPlace; + } + }, + closeOnTop: { + get: function get$$1() { + return params.closeOnTop; + } + }, + preset: { + get: function get$$1() { + if (_this.parent) { + return _this.getRoot().preset; + } + return params.load.preset; + }, + set: function set$$1(v) { + if (_this.parent) { + _this.getRoot().preset = v; + } else { + params.load.preset = v; + } + setPresetSelectIndex(this); + _this.revert(); + } + }, + width: { + get: function get$$1() { + return params.width; + }, + set: function set$$1(v) { + params.width = v; + setWidth(_this, v); + } + }, + name: { + get: function get$$1() { + return params.name; + }, + set: function set$$1(v) { + params.name = v; + if (titleRow) { + titleRow.innerHTML = params.name; + } + } + }, + closed: { + get: function get$$1() { + return params.closed; + }, + set: function set$$1(v) { + params.closed = v; + if (params.closed) { + dom.addClass(_this.__ul, GUI.CLASS_CLOSED); + } else { + dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); + } + this.onResize(); + if (_this.__closeButton) { + _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; + } + } + }, + load: { + get: function get$$1() { + return params.load; + } + }, + useLocalStorage: { + get: function get$$1() { + return useLocalStorage; + }, + set: function set$$1(bool) { + if (SUPPORTS_LOCAL_STORAGE) { + useLocalStorage = bool; + if (bool) { + dom.bind(window, 'unload', saveToLocalStorage); + } else { + dom.unbind(window, 'unload', saveToLocalStorage); + } + localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); + } + } + } + }); + if (Common.isUndefined(params.parent)) { + this.closed = params.closed || false; + dom.addClass(this.domElement, GUI.CLASS_MAIN); + dom.makeSelectable(this.domElement, false); + if (SUPPORTS_LOCAL_STORAGE) { + if (useLocalStorage) { + _this.useLocalStorage = true; + var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui')); + if (savedGui) { + params.load = JSON.parse(savedGui); + } + } + } + this.__closeButton = document.createElement('div'); + this.__closeButton.innerHTML = GUI.TEXT_CLOSED; + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); + if (params.closeOnTop) { + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP); + this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]); + } else { + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM); + this.domElement.appendChild(this.__closeButton); + } + dom.bind(this.__closeButton, 'click', function () { + _this.closed = !_this.closed; + }); + } else { + if (params.closed === undefined) { + params.closed = true; + } + var titleRowName = document.createTextNode(params.name); + dom.addClass(titleRowName, 'controller-name'); + titleRow = addRow(_this, titleRowName); + var onClickTitle = function onClickTitle(e) { + e.preventDefault(); + _this.closed = !_this.closed; + return false; + }; + dom.addClass(this.__ul, GUI.CLASS_CLOSED); + dom.addClass(titleRow, 'title'); + dom.bind(titleRow, 'click', onClickTitle); + if (!params.closed) { + this.closed = false; + } + } + if (params.autoPlace) { + if (Common.isUndefined(params.parent)) { + if (autoPlaceVirgin) { + autoPlaceContainer = document.createElement('div'); + dom.addClass(autoPlaceContainer, CSS_NAMESPACE); + dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER); + document.body.appendChild(autoPlaceContainer); + autoPlaceVirgin = false; + } + autoPlaceContainer.appendChild(this.domElement); + dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); + } + if (!this.parent) { + setWidth(_this, params.width); + } + } + this.__resizeHandler = function () { + _this.onResizeDebounced(); + }; + dom.bind(window, 'resize', this.__resizeHandler); + dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler); + dom.bind(this.__ul, 'transitionend', this.__resizeHandler); + dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler); + this.onResize(); + if (params.resizable) { + addResizeHandle(this); + } + saveToLocalStorage = function saveToLocalStorage() { + if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') { + localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); + } + }; + this.saveToLocalStorageIfPossible = saveToLocalStorage; + function resetWidth() { + var root = _this.getRoot(); + root.width += 1; + Common.defer(function () { + root.width -= 1; + }); + } + if (!params.parent) { + resetWidth(); + } +}; +GUI.toggleHide = function () { + hide = !hide; + Common.each(hideableGuis, function (gui) { + gui.domElement.style.display = hide ? 'none' : ''; + }); +}; +GUI.CLASS_AUTO_PLACE = 'a'; +GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; +GUI.CLASS_MAIN = 'main'; +GUI.CLASS_CONTROLLER_ROW = 'cr'; +GUI.CLASS_TOO_TALL = 'taller-than-window'; +GUI.CLASS_CLOSED = 'closed'; +GUI.CLASS_CLOSE_BUTTON = 'close-button'; +GUI.CLASS_CLOSE_TOP = 'close-top'; +GUI.CLASS_CLOSE_BOTTOM = 'close-bottom'; +GUI.CLASS_DRAG = 'drag'; +GUI.DEFAULT_WIDTH = 245; +GUI.TEXT_CLOSED = 'Close Controls'; +GUI.TEXT_OPEN = 'Open Controls'; +GUI._keydownHandler = function (e) { + if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) { + GUI.toggleHide(); + } +}; +dom.bind(window, 'keydown', GUI._keydownHandler, false); +Common.extend(GUI.prototype, +{ + add: function add(object, property) { + return _add(this, object, property, { + factoryArgs: Array.prototype.slice.call(arguments, 2) + }); + }, + addColor: function addColor(object, property) { + return _add(this, object, property, { + color: true + }); + }, + remove: function remove(controller) { + this.__ul.removeChild(controller.__li); + this.__controllers.splice(this.__controllers.indexOf(controller), 1); + var _this = this; + Common.defer(function () { + _this.onResize(); + }); + }, + destroy: function destroy() { + if (this.parent) { + throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.'); + } + if (this.autoPlace) { + autoPlaceContainer.removeChild(this.domElement); + } + var _this = this; + Common.each(this.__folders, function (subfolder) { + _this.removeFolder(subfolder); + }); + dom.unbind(window, 'keydown', GUI._keydownHandler, false); + removeListeners(this); + }, + addFolder: function addFolder(name) { + if (this.__folders[name] !== undefined) { + throw new Error('You already have a folder in this GUI by the' + ' name "' + name + '"'); + } + var newGuiParams = { name: name, parent: this }; + newGuiParams.autoPlace = this.autoPlace; + if (this.load && + this.load.folders && + this.load.folders[name]) { + newGuiParams.closed = this.load.folders[name].closed; + newGuiParams.load = this.load.folders[name]; + } + var gui = new GUI(newGuiParams); + this.__folders[name] = gui; + var li = addRow(this, gui.domElement); + dom.addClass(li, 'folder'); + return gui; + }, + removeFolder: function removeFolder(folder) { + this.__ul.removeChild(folder.domElement.parentElement); + delete this.__folders[folder.name]; + if (this.load && + this.load.folders && + this.load.folders[folder.name]) { + delete this.load.folders[folder.name]; + } + removeListeners(folder); + var _this = this; + Common.each(folder.__folders, function (subfolder) { + folder.removeFolder(subfolder); + }); + Common.defer(function () { + _this.onResize(); + }); + }, + open: function open() { + this.closed = false; + }, + close: function close() { + this.closed = true; + }, + hide: function hide() { + this.domElement.style.display = 'none'; + }, + show: function show() { + this.domElement.style.display = ''; + }, + onResize: function onResize() { + var root = this.getRoot(); + if (root.scrollable) { + var top = dom.getOffset(root.__ul).top; + var h = 0; + Common.each(root.__ul.childNodes, function (node) { + if (!(root.autoPlace && node === root.__save_row)) { + h += dom.getHeight(node); + } + }); + if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { + dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; + } else { + dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = 'auto'; + } + } + if (root.__resize_handle) { + Common.defer(function () { + root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; + }); + } + if (root.__closeButton) { + root.__closeButton.style.width = root.width + 'px'; + } + }, + onResizeDebounced: Common.debounce(function () { + this.onResize(); + }, 50), + remember: function remember() { + if (Common.isUndefined(SAVE_DIALOGUE)) { + SAVE_DIALOGUE = new CenteredDiv(); + SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents; + } + if (this.parent) { + throw new Error('You can only call remember on a top level GUI.'); + } + var _this = this; + Common.each(Array.prototype.slice.call(arguments), function (object) { + if (_this.__rememberedObjects.length === 0) { + addSaveMenu(_this); + } + if (_this.__rememberedObjects.indexOf(object) === -1) { + _this.__rememberedObjects.push(object); + } + }); + if (this.autoPlace) { + setWidth(this, this.width); + } + }, + getRoot: function getRoot() { + var gui = this; + while (gui.parent) { + gui = gui.parent; + } + return gui; + }, + getSaveObject: function getSaveObject() { + var toReturn = this.load; + toReturn.closed = this.closed; + if (this.__rememberedObjects.length > 0) { + toReturn.preset = this.preset; + if (!toReturn.remembered) { + toReturn.remembered = {}; + } + toReturn.remembered[this.preset] = getCurrentPreset(this); + } + toReturn.folders = {}; + Common.each(this.__folders, function (element, key) { + toReturn.folders[key] = element.getSaveObject(); + }); + return toReturn; + }, + save: function save() { + if (!this.load.remembered) { + this.load.remembered = {}; + } + this.load.remembered[this.preset] = getCurrentPreset(this); + markPresetModified(this, false); + this.saveToLocalStorageIfPossible(); + }, + saveAs: function saveAs(presetName) { + if (!this.load.remembered) { + this.load.remembered = {}; + this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); + } + this.load.remembered[presetName] = getCurrentPreset(this); + this.preset = presetName; + addPresetOption(this, presetName, true); + this.saveToLocalStorageIfPossible(); + }, + revert: function revert(gui) { + Common.each(this.__controllers, function (controller) { + if (!this.getRoot().load.remembered) { + controller.setValue(controller.initialValue); + } else { + recallSavedValue(gui || this.getRoot(), controller); + } + if (controller.__onFinishChange) { + controller.__onFinishChange.call(controller, controller.getValue()); + } + }, this); + Common.each(this.__folders, function (folder) { + folder.revert(folder); + }); + if (!gui) { + markPresetModified(this.getRoot(), false); + } + }, + listen: function listen(controller) { + var init = this.__listening.length === 0; + this.__listening.push(controller); + if (init) { + updateDisplays(this.__listening); + } + }, + updateDisplay: function updateDisplay() { + Common.each(this.__controllers, function (controller) { + controller.updateDisplay(); + }); + Common.each(this.__folders, function (folder) { + folder.updateDisplay(); + }); + } +}); +function addRow(gui, newDom, liBefore) { + var li = document.createElement('li'); + if (newDom) { + li.appendChild(newDom); + } + if (liBefore) { + gui.__ul.insertBefore(li, liBefore); + } else { + gui.__ul.appendChild(li); + } + gui.onResize(); + return li; +} +function removeListeners(gui) { + dom.unbind(window, 'resize', gui.__resizeHandler); + if (gui.saveToLocalStorageIfPossible) { + dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible); + } +} +function markPresetModified(gui, modified) { + var opt = gui.__preset_select[gui.__preset_select.selectedIndex]; + if (modified) { + opt.innerHTML = opt.value + '*'; + } else { + opt.innerHTML = opt.value; + } +} +function augmentController(gui, li, controller) { + controller.__li = li; + controller.__gui = gui; + Common.extend(controller, { + options: function options(_options) { + if (arguments.length > 1) { + var nextSibling = controller.__li.nextElementSibling; + controller.remove(); + return _add(gui, controller.object, controller.property, { + before: nextSibling, + factoryArgs: [Common.toArray(arguments)] + }); + } + if (Common.isArray(_options) || Common.isObject(_options)) { + var _nextSibling = controller.__li.nextElementSibling; + controller.remove(); + return _add(gui, controller.object, controller.property, { + before: _nextSibling, + factoryArgs: [_options] + }); + } + }, + name: function name(_name) { + controller.__li.firstElementChild.firstElementChild.innerHTML = _name; + return controller; + }, + listen: function listen() { + controller.__gui.listen(controller); + return controller; + }, + remove: function remove() { + controller.__gui.remove(controller); + return controller; + } + }); + if (controller instanceof NumberControllerSlider) { + var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step }); + Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) { + var pc = controller[method]; + var pb = box[method]; + controller[method] = box[method] = function () { + var args = Array.prototype.slice.call(arguments); + pb.apply(box, args); + return pc.apply(controller, args); + }; + }); + dom.addClass(li, 'has-slider'); + controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); + } else if (controller instanceof NumberControllerBox) { + var r = function r(returned) { + if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) { + var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML; + var wasListening = controller.__gui.__listening.indexOf(controller) > -1; + controller.remove(); + var newController = _add(gui, controller.object, controller.property, { + before: controller.__li.nextElementSibling, + factoryArgs: [controller.__min, controller.__max, controller.__step] + }); + newController.name(oldName); + if (wasListening) newController.listen(); + return newController; + } + return returned; + }; + controller.min = Common.compose(r, controller.min); + controller.max = Common.compose(r, controller.max); + } else if (controller instanceof BooleanController) { + dom.bind(li, 'click', function () { + dom.fakeEvent(controller.__checkbox, 'click'); + }); + dom.bind(controller.__checkbox, 'click', function (e) { + e.stopPropagation(); + }); + } else if (controller instanceof FunctionController) { + dom.bind(li, 'click', function () { + dom.fakeEvent(controller.__button, 'click'); + }); + dom.bind(li, 'mouseover', function () { + dom.addClass(controller.__button, 'hover'); + }); + dom.bind(li, 'mouseout', function () { + dom.removeClass(controller.__button, 'hover'); + }); + } else if (controller instanceof ColorController) { + dom.addClass(li, 'color'); + controller.updateDisplay = Common.compose(function (val) { + li.style.borderLeftColor = controller.__color.toString(); + return val; + }, controller.updateDisplay); + controller.updateDisplay(); + } + controller.setValue = Common.compose(function (val) { + if (gui.getRoot().__preset_select && controller.isModified()) { + markPresetModified(gui.getRoot(), true); + } + return val; + }, controller.setValue); +} +function recallSavedValue(gui, controller) { + var root = gui.getRoot(); + var matchedIndex = root.__rememberedObjects.indexOf(controller.object); + if (matchedIndex !== -1) { + var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex]; + if (controllerMap === undefined) { + controllerMap = {}; + root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap; + } + controllerMap[controller.property] = controller; + if (root.load && root.load.remembered) { + var presetMap = root.load.remembered; + var preset = void 0; + if (presetMap[gui.preset]) { + preset = presetMap[gui.preset]; + } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) { + preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME]; + } else { + return; + } + if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) { + var value = preset[matchedIndex][controller.property]; + controller.initialValue = value; + controller.setValue(value); + } + } + } +} +function _add(gui, object, property, params) { + if (object[property] === undefined) { + throw new Error('Object "' + object + '" has no property "' + property + '"'); + } + var controller = void 0; + if (params.color) { + controller = new ColorController(object, property); + } else { + var factoryArgs = [object, property].concat(params.factoryArgs); + controller = ControllerFactory.apply(gui, factoryArgs); + } + if (params.before instanceof Controller) { + params.before = params.before.__li; + } + recallSavedValue(gui, controller); + dom.addClass(controller.domElement, 'c'); + var name = document.createElement('span'); + dom.addClass(name, 'property-name'); + name.innerHTML = controller.property; + var container = document.createElement('div'); + container.appendChild(name); + container.appendChild(controller.domElement); + var li = addRow(gui, container, params.before); + dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); + if (controller instanceof ColorController) { + dom.addClass(li, 'color'); + } else { + dom.addClass(li, _typeof(controller.getValue())); + } + augmentController(gui, li, controller); + gui.__controllers.push(controller); + return controller; +} +function getLocalStorageHash(gui, key) { + return document.location.href + '.' + key; +} +function addPresetOption(gui, name, setSelected) { + var opt = document.createElement('option'); + opt.innerHTML = name; + opt.value = name; + gui.__preset_select.appendChild(opt); + if (setSelected) { + gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; + } +} +function showHideExplain(gui, explain) { + explain.style.display = gui.useLocalStorage ? 'block' : 'none'; +} +function addSaveMenu(gui) { + var div = gui.__save_row = document.createElement('li'); + dom.addClass(gui.domElement, 'has-save'); + gui.__ul.insertBefore(div, gui.__ul.firstChild); + dom.addClass(div, 'save-row'); + var gears = document.createElement('span'); + gears.innerHTML = ' '; + dom.addClass(gears, 'button gears'); + var button = document.createElement('span'); + button.innerHTML = 'Save'; + dom.addClass(button, 'button'); + dom.addClass(button, 'save'); + var button2 = document.createElement('span'); + button2.innerHTML = 'New'; + dom.addClass(button2, 'button'); + dom.addClass(button2, 'save-as'); + var button3 = document.createElement('span'); + button3.innerHTML = 'Revert'; + dom.addClass(button3, 'button'); + dom.addClass(button3, 'revert'); + var select = gui.__preset_select = document.createElement('select'); + if (gui.load && gui.load.remembered) { + Common.each(gui.load.remembered, function (value, key) { + addPresetOption(gui, key, key === gui.preset); + }); + } else { + addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); + } + dom.bind(select, 'change', function () { + for (var index = 0; index < gui.__preset_select.length; index++) { + gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; + } + gui.preset = this.value; + }); + div.appendChild(select); + div.appendChild(gears); + div.appendChild(button); + div.appendChild(button2); + div.appendChild(button3); + if (SUPPORTS_LOCAL_STORAGE) { + var explain = document.getElementById('dg-local-explain'); + var localStorageCheckBox = document.getElementById('dg-local-storage'); + var saveLocally = document.getElementById('dg-save-locally'); + saveLocally.style.display = 'block'; + if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { + localStorageCheckBox.setAttribute('checked', 'checked'); + } + showHideExplain(gui, explain); + dom.bind(localStorageCheckBox, 'change', function () { + gui.useLocalStorage = !gui.useLocalStorage; + showHideExplain(gui, explain); + }); + } + var newConstructorTextArea = document.getElementById('dg-new-constructor'); + dom.bind(newConstructorTextArea, 'keydown', function (e) { + if (e.metaKey && (e.which === 67 || e.keyCode === 67)) { + SAVE_DIALOGUE.hide(); + } + }); + dom.bind(gears, 'click', function () { + newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); + SAVE_DIALOGUE.show(); + newConstructorTextArea.focus(); + newConstructorTextArea.select(); + }); + dom.bind(button, 'click', function () { + gui.save(); + }); + dom.bind(button2, 'click', function () { + var presetName = prompt('Enter a new preset name.'); + if (presetName) { + gui.saveAs(presetName); + } + }); + dom.bind(button3, 'click', function () { + gui.revert(); + }); +} +function addResizeHandle(gui) { + var pmouseX = void 0; + gui.__resize_handle = document.createElement('div'); + Common.extend(gui.__resize_handle.style, { + width: '6px', + marginLeft: '-3px', + height: '200px', + cursor: 'ew-resize', + position: 'absolute' + }); + function drag(e) { + e.preventDefault(); + gui.width += pmouseX - e.clientX; + gui.onResize(); + pmouseX = e.clientX; + return false; + } + function dragStop() { + dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.unbind(window, 'mousemove', drag); + dom.unbind(window, 'mouseup', dragStop); + } + function dragStart(e) { + e.preventDefault(); + pmouseX = e.clientX; + dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.bind(window, 'mousemove', drag); + dom.bind(window, 'mouseup', dragStop); + return false; + } + dom.bind(gui.__resize_handle, 'mousedown', dragStart); + dom.bind(gui.__closeButton, 'mousedown', dragStart); + gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); +} +function setWidth(gui, w) { + gui.domElement.style.width = w + 'px'; + if (gui.__save_row && gui.autoPlace) { + gui.__save_row.style.width = w + 'px'; + } + if (gui.__closeButton) { + gui.__closeButton.style.width = w + 'px'; + } +} +function getCurrentPreset(gui, useInitialValues) { + var toReturn = {}; + Common.each(gui.__rememberedObjects, function (val, index) { + var savedValues = {}; + var controllerMap = gui.__rememberedObjectIndecesToControllers[index]; + Common.each(controllerMap, function (controller, property) { + savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue(); + }); + toReturn[index] = savedValues; + }); + return toReturn; +} +function setPresetSelectIndex(gui) { + for (var index = 0; index < gui.__preset_select.length; index++) { + if (gui.__preset_select[index].value === gui.preset) { + gui.__preset_select.selectedIndex = index; + } + } +} +function updateDisplays(controllerArray) { + if (controllerArray.length !== 0) { + requestAnimationFrame$1.call(window, function () { + updateDisplays(controllerArray); + }); + } + Common.each(controllerArray, function (c) { + c.updateDisplay(); + }); +} + +var color = { + Color: Color, + math: ColorMath, + interpret: interpret +}; +var controllers = { + Controller: Controller, + BooleanController: BooleanController, + OptionController: OptionController, + StringController: StringController, + NumberController: NumberController, + NumberControllerBox: NumberControllerBox, + NumberControllerSlider: NumberControllerSlider, + FunctionController: FunctionController, + ColorController: ColorController +}; +var dom$1 = { dom: dom }; +var gui = { GUI: GUI }; +var GUI$1 = GUI; +var index = { + color: color, + controllers: controllers, + dom: dom$1, + gui: gui, + GUI: GUI$1 +}; + +exports.color = color; +exports.controllers = controllers; +exports.dom = dom$1; +exports.gui = gui; +exports.GUI = GUI$1; +exports['default'] = index; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=dat.gui.js.map diff --git a/build/dat.gui.js.map b/build/dat.gui.js.map new file mode 100644 index 000000000..eb8553546 --- /dev/null +++ b/build/dat.gui.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dat.gui.js","sources":["../src/dat/color/toString.js","../src/dat/utils/common.js","../src/dat/color/interpret.js","../src/dat/color/math.js","../src/dat/color/Color.js","../src/dat/controllers/Controller.js","../src/dat/dom/dom.js","../src/dat/controllers/BooleanController.js","../src/dat/controllers/OptionController.js","../src/dat/controllers/StringController.js","../src/dat/controllers/NumberController.js","../src/dat/controllers/NumberControllerBox.js","../src/dat/controllers/NumberControllerSlider.js","../src/dat/controllers/FunctionController.js","../src/dat/controllers/ColorController.js","../src/dat/utils/css.js","../src/dat/gui/saveDialogue.html.js","../src/dat/controllers/ControllerFactory.js","../src/dat/utils/requestAnimationFrame.js","../src/dat/dom/CenteredDiv.js","../src/dat/gui/GUI.js","../src/dat/index.js"],"sourcesContent":["/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nexport default function(color, forceCSSHex) {\n const colorFormat = color.__state.conversionName.toString();\n\n const r = Math.round(color.r);\n const g = Math.round(color.g);\n const b = Math.round(color.b);\n const a = color.a;\n const h = Math.round(color.h);\n const s = color.s.toFixed(1);\n const v = color.v.toFixed(1);\n\n if (forceCSSHex || (colorFormat === 'THREE_CHAR_HEX') || (colorFormat === 'SIX_CHAR_HEX')) {\n let str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n\n return 'unknown format';\n}\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nconst ARR_EACH = Array.prototype.forEach;\nconst ARR_SLICE = Array.prototype.slice;\n\n/**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\nconst Common = {\n BREAK: {},\n\n extend: function(target) {\n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n const keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function(key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n\n return target;\n },\n\n defaults: function(target) {\n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n const keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function(key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n\n return target;\n },\n\n compose: function() {\n const toCall = ARR_SLICE.call(arguments);\n return function() {\n let args = ARR_SLICE.call(arguments);\n for (let i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n\n each: function(obj, itr, scope) {\n if (!obj) {\n return;\n }\n\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n let key;\n let l;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (const key in obj) {\n if (itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n }\n },\n\n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n\n // if the function is called repeatedly, wait until threshold passes until we execute the function\n debounce: function(func, threshold, callImmediately) {\n let timeout;\n\n return function() {\n const obj = this;\n const args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n\n const callNow = callImmediately || !timeout;\n\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n\n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n\n isNull: function(obj) {\n return obj === null;\n },\n\n isNaN: function(obj) {\n return isNaN(obj);\n },\n\n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n\n isObject: function(obj) {\n return obj === Object(obj);\n },\n\n isNumber: function(obj) {\n return obj === obj + 0;\n },\n\n isString: function(obj) {\n return obj === obj + '';\n },\n\n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n\n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n\n};\n\nexport default Common;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport toString from './toString';\nimport common from '../utils/common';\n\nconst INTERPRETATIONS = [\n // Strings\n {\n litmus: common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function(original) {\n const test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString(), 0)\n };\n },\n\n write: toString\n },\n\n SIX_CHAR_HEX: {\n read: function(original) {\n const test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n\n write: toString\n },\n\n CSS_RGB: {\n read: function(original) {\n const test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n\n write: toString\n },\n\n CSS_RGBA: {\n read: function(original) {\n const test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n\n write: toString\n }\n }\n },\n\n // Numbers\n {\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n litmus: common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function(original) {\n if (original.length !== 3) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n },\n\n // Objects\n {\n litmus: common.isObject,\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n }\n];\n\nlet result;\nlet toReturn;\n\nconst interpret = function() {\n toReturn = false;\n\n const original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n common.each(INTERPRETATIONS, function(family) {\n if (family.litmus(original)) {\n common.each(family.conversions, function(conversion, conversionName) {\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n }\n });\n\n return common.BREAK;\n }\n });\n\n return toReturn;\n};\n\nexport default interpret;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nlet tmpComponent;\n\nconst ColorMath = {\n hsv_to_rgb: function(h, s, v) {\n const hi = Math.floor(h / 60) % 6;\n\n const f = h / 60 - Math.floor(h / 60);\n const p = v * (1.0 - s);\n const q = v * (1.0 - (f * s));\n const t = v * (1.0 - ((1.0 - f) * s));\n\n const c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n\n rgb_to_hsv: function(r, g, b) {\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n const delta = max - min;\n let h;\n let s;\n\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n let hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~(0xFF << tmpComponent));\n }\n};\n\nexport default ColorMath;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport interpret from './interpret';\nimport math from './math';\nimport colorToString from './toString';\nimport common from '../utils/common';\n\nclass Color {\n constructor() {\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n\n this.__state.a = this.__state.a || 1;\n }\n\n toString() {\n return colorToString(this);\n }\n\n toHexString() {\n return colorToString(this, true);\n }\n\n toOriginal() {\n return this.__state.conversion.write(this);\n }\n}\n\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n Color.recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n },\n\n set: function(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n }\n });\n}\n\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n\n Color.recalculateHSV(this);\n\n return this.__state[component];\n },\n\n set: function(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n }\n });\n}\n\n\nColor.recalculateRGB = function(color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\n\nColor.recalculateHSV = function(color) {\n const result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\n\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\n\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\n\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\n\nObject.defineProperty(Color.prototype, 'a', {\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n});\n\nObject.defineProperty(Color.prototype, 'hex', {\n get: function() {\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n },\n\n set: function(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nexport default Color;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass Controller {\n constructor(object, property) {\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n }\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {Controller} this\n */\n onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {Controller} this\n */\n onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n\n this.updateDisplay();\n return this;\n }\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue() {\n return this.object[this.property];\n }\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {Controller} this\n */\n updateDisplay() {\n return this;\n }\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified() {\n return this.initialValue !== this.getValue();\n }\n}\n\nexport default Controller;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport common from '../utils/common';\n\nconst EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\n\nconst EVENT_MAP_INV = {};\ncommon.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n});\n\nconst CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\nfunction cssValueToPixels(val) {\n if (val === '0' || common.isUndefined(val)) {\n return 0;\n }\n\n const match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n}\n\n/**\n * @namespace\n * @member dat.dom\n */\nconst dom = {\n\n /**\n *\n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vert\n */\n makeFullscreen: function(elem, hor, vert) {\n let vertical = vert;\n let horizontal = hor;\n\n if (common.isUndefined(horizontal)) {\n horizontal = true;\n }\n\n if (common.isUndefined(vertical)) {\n vertical = true;\n }\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, pars, aux) {\n const params = pars || {};\n const className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n const evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n const clientX = params.x || params.clientX || 0;\n const clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, // screen X\n 0, // screen Y\n clientX, // client X\n clientY, // client Y\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n const init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, newBool) {\n const bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, newBool) {\n const bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n const classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n const classes = elem.className.split(/ +/);\n const index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n const style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style.width);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n const style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style.height);\n },\n\n /**\n *\n * @param el\n */\n getOffset: function(el) {\n let elem = el;\n const offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n *\n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n\n};\n\nexport default dom;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a checkbox input to alter the boolean property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass BooleanController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n const _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n }\n\n setValue(v) {\n const toReturn = super.setValue(v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n\n updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n\n return super.updateDisplay();\n }\n}\n\nexport default BooleanController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\n/**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n */\nclass OptionController extends Controller {\n constructor(object, property, opts) {\n super(object, property);\n\n let options = opts;\n\n const _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n const map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n const opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n const desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n }\n\n setValue(v) {\n const toReturn = super.setValue(v);\n\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n\n updateDisplay() {\n if (dom.isActive(this.__select)) return this; // prevent number from updating if user is trying to manually update\n this.__select.value = this.getValue();\n return super.updateDisplay();\n }\n}\n\nexport default OptionController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass StringController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n const _this = this;\n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n }\n\n updateDisplay() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return super.updateDisplay();\n }\n}\n\nexport default StringController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport common from '../utils/common';\n\nfunction numDecimals(x) {\n const _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n\n return 0;\n}\n\n/**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n */\nclass NumberController extends Controller {\n constructor(object, property, params) {\n super(object, property);\n\n const _params = params || {};\n\n this.__min = _params.min;\n this.__max = _params.max;\n this.__step = _params.step;\n\n if (common.isUndefined(this.__step)) {\n if (this.initialValue === 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n this.__impliedStep = this.__step;\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n }\n\n setValue(v) {\n let _v = v;\n\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n\n return super.setValue(_v);\n }\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min(minValue) {\n this.__min = minValue;\n return this;\n }\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n}\n\nexport default NumberController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport NumberController from './NumberController';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nfunction roundToDecimal(value, decimals) {\n const tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\n\n/**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n */\nclass NumberControllerBox extends NumberController {\n constructor(object, property, params) {\n super(object, property, params);\n\n this.__truncationSuspended = false;\n\n const _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n let prevY;\n\n function onChange() {\n const attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onBlur() {\n onFinish();\n }\n\n function onMouseDrag(e) {\n const diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prevY = e.clientY;\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n // When pressing enter, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n }\n\n updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return super.updateDisplay();\n }\n}\n\nexport default NumberControllerBox;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport NumberController from './NumberController';\nimport dom from '../dom/dom';\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\n\n/**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n */\nclass NumberControllerSlider extends NumberController {\n constructor(object, property, min, max, step) {\n super(object, property, { min: min, max: max, step: step });\n\n const _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n dom.bind(this.__background, 'touchstart', onTouchStart);\n\n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n document.activeElement.blur();\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n e.preventDefault();\n\n const bgRect = _this.__background.getBoundingClientRect();\n\n _this.setValue(\n map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)\n );\n\n return false;\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onTouchStart(e) {\n if (e.touches.length !== 1) { return; }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n\n function onTouchMove(e) {\n const clientX = e.touches[0].clientX;\n const bgRect = _this.__background.getBoundingClientRect();\n\n _this.setValue(\n map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)\n );\n }\n\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n }\n\n updateDisplay() {\n const pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return super.updateDisplay();\n }\n}\n\nexport default NumberControllerSlider;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass FunctionController extends Controller {\n constructor(object, property, text) {\n super(object, property);\n\n const _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n }\n\n fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n}\n\nexport default FunctionController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\nimport Color from '../color/Color';\nimport interpret from '../color/interpret';\nimport common from '../utils/common';\n\n/**\n * @class Represents a given property of an object that is a color.\n * @param {Object} object\n * @param {string} property\n */\nclass ColorController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n const _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(/* e */) {\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(/* e */) {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n\n dom.bind(this.__selector, 'touchstart', function(/* e */) {\n dom\n .addClass(this, 'drag')\n .bind(window, 'touchend', function(/* e */) {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n\n const valueField = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n\n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__saturation_field, 'touchstart', fieldDown);\n\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'touchstart', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', fieldDownH);\n dom.bind(this.__hue_field, 'touchstart', fieldDownH);\n\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n\n function onBlur() {\n const i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n\n this.__saturation_field.appendChild(valueField);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) { e.preventDefault(); }\n\n const fieldRect = _this.__saturation_field.getBoundingClientRect();\n const { clientX, clientY } = (e.touches && e.touches[0]) || e;\n let s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n let v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n }\n\n function setH(e) {\n if (e.type.indexOf('touch') === -1) { e.preventDefault(); }\n\n const fieldRect = _this.__hue_field.getBoundingClientRect();\n const { clientY } = (e.touches && e.touches[0]) || e;\n let h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n }\n }\n\n updateDisplay() {\n const i = interpret(this.getValue());\n\n if (i !== false) {\n let mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) && !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n const flip = (this.__color.v < 0.5 || this.__color.s > 0.5) ? 255 : 0;\n const _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n\n this.__input.value = this.__color.toString();\n\n common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n}\n\nconst vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\n\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\n\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nexport default ColorController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nconst css = {\n load: function(url, indoc) {\n const doc = indoc || document;\n const link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n\n inject: function(cssContent, indoc) {\n const doc = indoc || document;\n const injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n const head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) { // Unable to inject CSS, probably because of a Content Security Policy\n }\n }\n};\n\nexport default css;\n","const saveDialogContents = `
\n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n
`;\n\nexport default saveDialogContents;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport OptionController from './OptionController';\nimport NumberControllerBox from './NumberControllerBox';\nimport NumberControllerSlider from './NumberControllerSlider';\nimport StringController from './StringController';\nimport FunctionController from './FunctionController';\nimport BooleanController from './BooleanController';\nimport common from '../utils/common';\n\nconst ControllerFactory = function(object, property) {\n const initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n if (common.isNumber(initialValue)) {\n // Has min and max? (slider)\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n // has step?\n if (common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property,\n arguments[2], arguments[3], arguments[4]);\n }\n\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n\n // number box\n if (common.isNumber(arguments[4])) { // has step\n return new NumberControllerBox(object, property,\n { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n return null;\n};\n\nexport default ControllerFactory;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\n\nexport default window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n requestAnimationFrame;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nclass CenteredDiv {\n constructor() {\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n const _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n }\n\n show() {\n const _this = this;\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n\n /**\n * Hide centered div\n */\n hide() {\n const _this = this;\n\n const hide = function() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n\n layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n}\n\nexport default CenteredDiv;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport css from '../utils/css';\nimport saveDialogueContents from './saveDialogue.html';\nimport ControllerFactory from '../controllers/ControllerFactory';\nimport Controller from '../controllers/Controller';\nimport BooleanController from '../controllers/BooleanController';\nimport FunctionController from '../controllers/FunctionController';\nimport NumberControllerBox from '../controllers/NumberControllerBox';\nimport NumberControllerSlider from '../controllers/NumberControllerSlider';\nimport ColorController from '../controllers/ColorController';\nimport requestAnimationFrame from '../utils/requestAnimationFrame';\nimport CenteredDiv from '../dom/CenteredDiv';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nimport styleSheet from './style.scss'; // CSS to embed in build\n\ncss.inject(styleSheet);\n\n/** @ignore Outer-most className for GUI's */\nconst CSS_NAMESPACE = 'dg';\n\nconst HIDE_KEY_CODE = 72;\n\n/** @ignore The only value shared between the JS and SCSS. Use caution. */\nconst CLOSE_BUTTON_HEIGHT = 20;\n\nconst DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\nconst SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}());\n\nlet SAVE_DIALOGUE;\n\n/** @ignore Have we yet to create an autoPlace GUI? */\nlet autoPlaceVirgin = true;\n\n/** @ignore Fixed position div that auto place GUI's go inside */\nlet autoPlaceContainer;\n\n/** @ignore Are we hiding the GUI's ? */\nlet hide = false;\n\n/** @private GUI's which should be hidden */\nconst hideableGuis = [];\n\n/**\n * @class A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n *\n * @typicalname gui\n *\n * @example\n * // Creating a GUI with options.\n * var gui = new dat.GUI({name: 'My GUI'});\n *\n * @example\n * // Creating a GUI and a subfolder.\n * var gui = new dat.GUI();\n * var folder1 = gui.addFolder('Flow Field');\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.autoPlace=true]\n * @param {Boolean} [params.hideable=true] If true, GUI is shown/hidden by h keypress.\n * @param {Boolean} [params.closed=false] If true, starts closed\n * @param {Boolean} [params.closeOnTop=false] If true, close/open button shows on top of the GUI\n */\nconst GUI = function(pars) {\n const _this = this;\n\n let params = pars || {};\n\n /**\n * Outermost DOM Element\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n // Default parameters\n params = common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n if (!common.isUndefined(params.load)) {\n // Explicit preset\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n let useLocalStorage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n let saveToLocalStorage;\n let titleRow;\n\n Object.defineProperties(this,\n /** @lends GUI.prototype */\n {\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * Handles GUI's position of open/close button\n * @type Boolean\n */\n closeOnTop: {\n get: function() {\n return params.closeOnTop;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n\n return params.load.preset;\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return useLocalStorage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n\n const savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n\n dom.bind(this.__closeButton, 'click', function() {\n _this.closed = !_this.closed;\n });\n // Oh, you're a nested GUI!\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n const titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n\n titleRow = addRow(_this, titleRowName);\n\n const onClickTitle = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n\n if (!params.closed) {\n this.closed = false;\n }\n }\n\n if (params.autoPlace) {\n if (common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n\n // Put it in the dom for you.\n autoPlaceContainer.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n\n\n // Make it not elastic.\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n\n this.__resizeHandler = function() {\n _this.onResizeDebounced();\n };\n\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n saveToLocalStorage = function() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n\n // expose this method publicly\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n\n function resetWidth() {\n const root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n};\n\nGUI.toggleHide = function() {\n hide = !hide;\n common.each(hideableGuis, function(gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\n\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\n\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\n\nGUI._keydownHandler = function(e) {\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\n\ncommon.extend(\n GUI.prototype,\n\n /** @lends GUI.prototype */\n {\n\n /**\n * Adds a new {@link Controller} to the GUI. The type of controller created\n * is inferred from the initial value of object[property]. For\n * color properties, see {@link addColor}.\n *\n * @param {Object} object The object to be manipulated\n * @param {String} property The name of the property to be manipulated\n * @param {Number} [min] Minimum allowed value\n * @param {Number} [max] Maximum allowed value\n * @param {Number} [step] Increment by which to change value\n * @returns {Controller} The controller that was added to the GUI.\n * @instance\n *\n * @example\n * // Add a string controller.\n * var person = {name: 'Sam'};\n * gui.add(person, 'name');\n *\n * @example\n * // Add a number controller slider.\n * var person = {age: 45};\n * gui.add(person, 'age', 0, 100);\n */\n add: function(object, property) {\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n },\n\n /**\n * Adds a new color controller to the GUI.\n *\n * @param object\n * @param property\n * @returns {Controller} The controller that was added to the GUI.\n * @instance\n *\n * @example\n * var palette = {\n * color1: '#FF0000', // CSS string\n * color2: [ 0, 128, 255 ], // RGB array\n * color3: [ 0, 128, 255, 0.3 ], // RGB with alpha\n * color4: { h: 350, s: 0.9, v: 0.3 } // Hue, saturation, value\n * };\n * gui.addColor(palette, 'color1');\n * gui.addColor(palette, 'color2');\n * gui.addColor(palette, 'color3');\n * gui.addColor(palette, 'color4');\n */\n addColor: function(object, property) {\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n },\n\n /**\n * Removes the given controller from the GUI.\n * @param {Controller} controller\n * @instance\n */\n remove: function(controller) {\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n const _this = this;\n common.defer(function() {\n _this.onResize();\n });\n },\n\n /**\n * Removes the root GUI from the document and unbinds all event listeners.\n * For subfolders, use `gui.removeFolder(folder)` instead.\n * @instance\n */\n destroy: function() {\n if (this.parent) {\n throw new Error(\n 'Only the root GUI should be removed with .destroy(). ' +\n 'For subfolders, use gui.removeFolder(folder) instead.'\n );\n }\n\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n\n const _this = this;\n common.each(this.__folders, function(subfolder) {\n _this.removeFolder(subfolder);\n });\n\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n\n removeListeners(this);\n },\n\n /**\n * Creates a new subfolder GUI instance.\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n const newGuiParams = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n newGuiParams.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n // Start me closed if I was closed\n newGuiParams.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n newGuiParams.load = this.load.folders[name];\n }\n\n const gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n\n const li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n\n /**\n * Removes a subfolder GUI instance.\n * @param {dat.gui.GUI} folder The folder to remove.\n * @instance\n */\n removeFolder: function(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n\n delete this.__folders[folder.name];\n\n // Do we have saved appearance data for this folder?\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n\n removeListeners(folder);\n\n const _this = this;\n\n common.each(folder.__folders, function(subfolder) {\n folder.removeFolder(subfolder);\n });\n\n common.defer(function() {\n _this.onResize();\n });\n },\n\n /**\n * Opens the GUI.\n */\n open: function() {\n this.closed = false;\n },\n\n /**\n * Closes the GUI.\n */\n close: function() {\n this.closed = true;\n },\n\n /**\n * Hides the GUI.\n */\n hide: function() {\n this.domElement.style.display = 'none';\n },\n\n /**\n * Shows the GUI.\n */\n show: function() {\n this.domElement.style.display = '';\n },\n\n\n onResize: function() {\n // we debounce this function to prevent performance issues when rotating on tablet/mobile\n const root = this.getRoot();\n if (root.scrollable) {\n const top = dom.getOffset(root.__ul).top;\n let h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n\n onResizeDebounced: common.debounce(function() { this.onResize(); }, 50),\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {...Object} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n * @ignore\n */\n remember: function() {\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n\n const _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n let gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n const toReturn = this.load;\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n },\n\n save: function() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n\n saveAs: function(presetName) {\n if (!this.load.remembered) {\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n\n revert: function(gui) {\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n\n // fire onFinishChange callback\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n\n listen: function(controller) {\n const init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n\n updateDisplay: function() {\n common.each(this.__controllers, function(controller) {\n controller.updateDisplay();\n });\n common.each(this.__folders, function(folder) {\n folder.updateDisplay();\n });\n }\n }\n);\n\n/**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [newDom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n *\n * @ignore\n */\nfunction addRow(gui, newDom, liBefore) {\n const li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\n\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\n\nfunction markPresetModified(gui, modified) {\n const opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\n\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, /** @lends Controller.prototype */ {\n /**\n * @param {Array|Object} options\n * @return {Controller}\n */\n options: function(options) {\n if (arguments.length > 1) {\n const nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: nextSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n const nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: nextSibling,\n factoryArgs: [options]\n }\n );\n }\n },\n\n /**\n * Sets the name of the controller.\n * @param {string} name\n * @return {Controller}\n */\n name: function(name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = name;\n return controller;\n },\n\n /**\n * Sets controller to listen for changes on its underlying object.\n * @return {Controller}\n */\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n /**\n * Removes the controller from its parent GUI.\n * @return {Controller}\n */\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n const box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function(method) {\n const pc = controller[method];\n const pb = box[method];\n controller[method] = box[method] = function() {\n const args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n const r = function(returned) {\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n // Well, then lets just replace this with a slider.\n\n // lets remember if the old controller had a specific name or was listening\n const oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n const wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n\n controller.remove();\n const newController = add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n newController.name(oldName);\n if (wasListening) newController.listen();\n\n return newController;\n }\n\n return returned;\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n }\n\n controller.setValue = common.compose(function(val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n\n return val;\n }, controller.setValue);\n}\n\nfunction recallSavedValue(gui, controller) {\n // Find the topmost GUI, that's where remembered objects live.\n const root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n const matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matchedIndex !== -1) {\n // Let me fetch a map of controllers for thcommon.isObject.\n let controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] =\n controllerMap;\n }\n\n // Keep track of this controller\n controllerMap[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n const presetMap = root.load.remembered;\n\n // Which preset are we trying to load?\n let preset;\n\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n // Uhh, you can have the default instead?\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n // Nada.\n return;\n }\n\n // Did the loaded object remember thcommon.isObject? && Did we remember this particular property?\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n // We did remember something for this guy ...\n const value = preset[matchedIndex][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\n\nfunction add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error(`Object \"${object}\" has no property \"${property}\"`);\n }\n\n let controller;\n\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n const factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n const name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n const container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n const li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, typeof controller.getValue());\n }\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n}\n\nfunction getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n}\n\nfunction addPresetOption(gui, name, setSelected) {\n const opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\n\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\n\nfunction addSaveMenu(gui) {\n const div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n const gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n const button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n const button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n const button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n const select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n for (let index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n const explain = document.getElementById('dg-local-explain');\n const localStorageCheckBox = document.getElementById('dg-local-storage');\n const saveLocally = document.getElementById('dg-save-locally');\n\n saveLocally.style.display = 'block';\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n showHideExplain(gui, explain);\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n\n const newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n const presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n // div.appendChild(button2);\n}\n\nfunction addResizeHandle(gui) {\n let pmouseX;\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n // border: '1px solid blue'\n\n });\n\n function drag(e) {\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n }\n\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n\n function dragStart(e) {\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n }\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\n\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\n\nfunction getCurrentPreset(gui, useInitialValues) {\n const toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n const savedValues = {};\n\n // The controllers I've made for thcommon.isObject by property\n const controllerMap =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controllerMap, function(controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = savedValues;\n });\n\n return toReturn;\n}\n\nfunction setPresetSelectIndex(gui) {\n for (let index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\n\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame.call(window, function() {\n updateDisplays(controllerArray);\n });\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n}\n\nexport default GUI;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Color from './color/Color';\nimport math from './color/math';\nimport interpret from './color/interpret';\n\nimport Controller from './controllers/Controller';\nimport BooleanController from './controllers/BooleanController';\nimport OptionController from './controllers/OptionController';\nimport StringController from './controllers/StringController';\nimport NumberController from './controllers/NumberController';\nimport NumberControllerBox from './controllers/NumberControllerBox';\nimport NumberControllerSlider from './controllers/NumberControllerSlider';\nimport FunctionController from './controllers/FunctionController';\nimport ColorController from './controllers/ColorController';\n\nimport domImport from './dom/dom';\nimport GUIImport from './gui/GUI';\n\nexport const color = {\n Color: Color,\n math: math,\n interpret: interpret\n};\n\nexport const controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\n\nexport const dom = { dom: domImport };\n\nexport const gui = { GUI: GUIImport };\n\nexport const GUI = GUIImport;\n\nexport default {\n color,\n controllers,\n dom,\n gui,\n GUI\n};\n"],"names":["color","forceCSSHex","colorFormat","__state","conversionName","toString","r","Math","round","g","b","a","h","s","toFixed","v","str","hex","length","ARR_EACH","Array","prototype","forEach","ARR_SLICE","slice","Common","target","each","call","arguments","obj","keys","isObject","Object","key","isUndefined","bind","toCall","args","i","apply","itr","scope","l","BREAK","fnc","func","threshold","callImmediately","timeout","delayed","callNow","setTimeout","toArray","undefined","isNaN","isArray","constructor","INTERPRETATIONS","common","isString","original","test","match","parseInt","parseFloat","isNumber","result","toReturn","interpret","family","litmus","conversions","conversion","read","tmpComponent","ColorMath","hi","floor","f","p","q","t","c","min","max","delta","NaN","hex_with_component","componentIndex","value","Color","Error","colorToString","write","defineRGBComponent","component","componentHexIndex","defineProperty","space","recalculateRGB","defineHSVComponent","recalculateHSV","math","component_from_hex","extend","hsv_to_rgb","rgb_to_hsv","COMPONENTS","rgb_to_hex","Controller","object","property","initialValue","domElement","document","createElement","__onChange","__onFinishChange","newValue","updateDisplay","getValue","EVENT_MAP","EVENT_MAP_INV","k","e","CSS_VALUE_PIXELS","cssValueToPixels","val","isNull","dom","elem","selectable","style","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","hor","vert","vertical","horizontal","position","left","right","top","bottom","eventType","pars","aux","params","className","evt","createEvent","clientX","x","clientY","y","initMouseEvent","bubbles","cancelable","window","clickCount","init","initKeyboardEvent","initKeyEvent","defaults","ctrlKey","altKey","shiftKey","metaKey","keyCode","charCode","initEvent","dispatchEvent","event","newBool","bool","addEventListener","attachEvent","removeEventListener","detachEvent","classes","split","indexOf","push","join","replace","removeAttribute","index","splice","RegExp","getComputedStyle","width","height","el","offset","offsetParent","offsetLeft","offsetTop","activeElement","type","href","BooleanController","_this","__prev","__checkbox","setAttribute","onChange","setValue","appendChild","checked","OptionController","opts","options","__select","map","element","opt","innerHTML","desiredValue","selectedIndex","isActive","StringController","__input","onBlur","blur","numDecimals","_x","NumberController","_params","__min","__max","__step","step","__impliedStep","pow","log","abs","LN10","__precision","_v","minValue","maxValue","stepValue","roundToDecimal","decimals","tenTo","NumberControllerBox","__truncationSuspended","prevY","attempted","onFinish","onMouseDrag","diff","onMouseUp","unbind","onMouseDown","i1","i2","o1","o2","NumberControllerSlider","__background","__foreground","onTouchStart","addClass","preventDefault","bgRect","getBoundingClientRect","touches","onTouchMove","onTouchEnd","pct","FunctionController","text","__button","fire","ColorController","__color","__temp","makeSelectable","__selector","__saturation_field","__field_knob","__field_knob_border","__hue_knob","__hue_field","__input_textShadow","removeClass","valueField","fieldDown","fieldDownH","setSV","fieldUpSV","setH","fieldUpH","toOriginal","fieldRect","mismatch","flip","_flip","toHexString","marginTop","vendors","linearGradient","background","vendor","cssText","hueGradient","css","url","indoc","doc","link","rel","getElementsByTagName","cssContent","injected","head","saveDialogContents","ControllerFactory","isFunction","isBoolean","requestAnimationFrame","callback","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","CenteredDiv","backgroundElement","makeFullscreen","body","hide","display","opacity","webkitTransform","layout","defer","innerWidth","getWidth","innerHeight","getHeight","inject","styleSheet","CSS_NAMESPACE","HIDE_KEY_CODE","CLOSE_BUTTON_HEIGHT","DEFAULT_DEFAULT_PRESET_NAME","SUPPORTS_LOCAL_STORAGE","localStorage","SAVE_DIALOGUE","autoPlaceVirgin","autoPlaceContainer","hideableGuis","GUI","__ul","__folders","__controllers","__rememberedObjects","__rememberedObjectIndecesToControllers","__listening","DEFAULT_WIDTH","autoPlace","load","preset","parent","hideable","resizable","scrollable","useLocalStorage","getItem","getLocalStorageHash","saveToLocalStorage","titleRow","defineProperties","closeOnTop","getRoot","revert","name","closed","CLASS_CLOSED","onResize","__closeButton","TEXT_OPEN","TEXT_CLOSED","setItem","CLASS_MAIN","savedGui","JSON","parse","CLASS_CLOSE_BUTTON","CLASS_CLOSE_TOP","insertBefore","childNodes","CLASS_CLOSE_BOTTOM","titleRowName","createTextNode","addRow","onClickTitle","CLASS_AUTO_PLACE_CONTAINER","CLASS_AUTO_PLACE","__resizeHandler","onResizeDebounced","stringify","getSaveObject","saveToLocalStorageIfPossible","resetWidth","root","toggleHide","gui","CLASS_CONTROLLER_ROW","CLASS_TOO_TALL","CLASS_DRAG","_keydownHandler","which","add","controller","removeChild","__li","subfolder","removeFolder","newGuiParams","folders","li","folder","parentElement","getOffset","node","__save_row","__resize_handle","offsetHeight","debounce","saveDialogueContents","remembered","getCurrentPreset","presetName","newDom","liBefore","removeListeners","markPresetModified","modified","__preset_select","augmentController","__gui","nextSibling","nextElementSibling","remove","firstElementChild","listen","box","method","pc","pb","returned","oldName","wasListening","newController","compose","fakeEvent","stopPropagation","borderLeftColor","isModified","recallSavedValue","matchedIndex","controllerMap","presetMap","factoryArgs","concat","before","container","location","addPresetOption","setSelected","showHideExplain","explain","addSaveMenu","div","firstChild","gears","button","button2","button3","select","getElementById","localStorageCheckBox","saveLocally","newConstructorTextArea","show","focus","save","prompt","saveAs","addResizeHandle","pmouseX","drag","dragStop","dragStart","setWidth","w","useInitialValues","savedValues","setPresetSelectIndex","updateDisplays","controllerArray","controllers","domImport","GUIImport"],"mappings":"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"} \ No newline at end of file diff --git a/build/dat.gui.min.js b/build/dat.gui.min.js new file mode 100644 index 000000000..1398e14ab --- /dev/null +++ b/build/dat.gui.min.js @@ -0,0 +1,13 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.dat={})}(this,function(e){"use strict";function t(e,t){var n=e.__state.conversionName.toString(),o=Math.round(e.r),i=Math.round(e.g),r=Math.round(e.b),s=e.a,a=Math.round(e.h),l=e.s.toFixed(1),d=e.v.toFixed(1);if(t||"THREE_CHAR_HEX"===n||"SIX_CHAR_HEX"===n){for(var c=e.hex.toString(16);c.length<6;)c="0"+c;return"#"+c}return"CSS_RGB"===n?"rgb("+o+","+i+","+r+")":"CSS_RGBA"===n?"rgba("+o+","+i+","+r+","+s+")":"HEX"===n?"0x"+e.hex.toString(16):"RGB_ARRAY"===n?"["+o+","+i+","+r+"]":"RGBA_ARRAY"===n?"["+o+","+i+","+r+","+s+"]":"RGB_OBJ"===n?"{r:"+o+",g:"+i+",b:"+r+"}":"RGBA_OBJ"===n?"{r:"+o+",g:"+i+",b:"+r+",a:"+s+"}":"HSV_OBJ"===n?"{h:"+a+",s:"+l+",v:"+d+"}":"HSVA_OBJ"===n?"{h:"+a+",s:"+l+",v:"+d+",a:"+s+"}":"unknown format"}function n(e,t,n){Object.defineProperty(e,t,{get:function(){return"RGB"===this.__state.space?this.__state[t]:(I.recalculateRGB(this,t,n),this.__state[t])},set:function(e){"RGB"!==this.__state.space&&(I.recalculateRGB(this,t,n),this.__state.space="RGB"),this.__state[t]=e}})}function o(e,t){Object.defineProperty(e,t,{get:function(){return"HSV"===this.__state.space?this.__state[t]:(I.recalculateHSV(this),this.__state[t])},set:function(e){"HSV"!==this.__state.space&&(I.recalculateHSV(this),this.__state.space="HSV"),this.__state[t]=e}})}function i(e){if("0"===e||S.isUndefined(e))return 0;var t=e.match(U);return S.isNull(t)?0:parseFloat(t[1])}function r(e){var t=e.toString();return t.indexOf(".")>-1?t.length-t.indexOf(".")-1:0}function s(e,t){var n=Math.pow(10,t);return Math.round(e*n)/n}function a(e,t,n,o,i){return o+(e-t)/(n-t)*(i-o)}function l(e,t,n,o){e.style.background="",S.each(ee,function(i){e.style.cssText+="background: "+i+"linear-gradient("+t+", "+n+" 0%, "+o+" 100%); "})}function d(e){e.style.background="",e.style.cssText+="background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);",e.style.cssText+="background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);"}function c(e,t,n){var o=document.createElement("li");return t&&o.appendChild(t),n?e.__ul.insertBefore(o,n):e.__ul.appendChild(o),e.onResize(),o}function u(e){X.unbind(window,"resize",e.__resizeHandler),e.saveToLocalStorageIfPossible&&X.unbind(window,"unload",e.saveToLocalStorageIfPossible)}function _(e,t){var n=e.__preset_select[e.__preset_select.selectedIndex];n.innerHTML=t?n.value+"*":n.value}function h(e,t,n){if(n.__li=t,n.__gui=e,S.extend(n,{options:function(t){if(arguments.length>1){var o=n.__li.nextElementSibling;return n.remove(),f(e,n.object,n.property,{before:o,factoryArgs:[S.toArray(arguments)]})}if(S.isArray(t)||S.isObject(t)){var i=n.__li.nextElementSibling;return n.remove(),f(e,n.object,n.property,{before:i,factoryArgs:[t]})}},name:function(e){return n.__li.firstElementChild.firstElementChild.innerHTML=e,n},listen:function(){return n.__gui.listen(n),n},remove:function(){return n.__gui.remove(n),n}}),n instanceof q){var o=new Q(n.object,n.property,{min:n.__min,max:n.__max,step:n.__step});S.each(["updateDisplay","onChange","onFinishChange","step","min","max"],function(e){var t=n[e],i=o[e];n[e]=o[e]=function(){var e=Array.prototype.slice.call(arguments);return i.apply(o,e),t.apply(n,e)}}),X.addClass(t,"has-slider"),n.domElement.insertBefore(o.domElement,n.domElement.firstElementChild)}else if(n instanceof Q){var i=function(t){if(S.isNumber(n.__min)&&S.isNumber(n.__max)){var o=n.__li.firstElementChild.firstElementChild.innerHTML,i=n.__gui.__listening.indexOf(n)>-1;n.remove();var r=f(e,n.object,n.property,{before:n.__li.nextElementSibling,factoryArgs:[n.__min,n.__max,n.__step]});return r.name(o),i&&r.listen(),r}return t};n.min=S.compose(i,n.min),n.max=S.compose(i,n.max)}else n instanceof K?(X.bind(t,"click",function(){X.fakeEvent(n.__checkbox,"click")}),X.bind(n.__checkbox,"click",function(e){e.stopPropagation()})):n instanceof Z?(X.bind(t,"click",function(){X.fakeEvent(n.__button,"click")}),X.bind(t,"mouseover",function(){X.addClass(n.__button,"hover")}),X.bind(t,"mouseout",function(){X.removeClass(n.__button,"hover")})):n instanceof $&&(X.addClass(t,"color"),n.updateDisplay=S.compose(function(e){return t.style.borderLeftColor=n.__color.toString(),e},n.updateDisplay),n.updateDisplay());n.setValue=S.compose(function(t){return e.getRoot().__preset_select&&n.isModified()&&_(e.getRoot(),!0),t},n.setValue)}function p(e,t){var n=e.getRoot(),o=n.__rememberedObjects.indexOf(t.object);if(-1!==o){var i=n.__rememberedObjectIndecesToControllers[o];if(void 0===i&&(i={},n.__rememberedObjectIndecesToControllers[o]=i),i[t.property]=t,n.load&&n.load.remembered){var r=n.load.remembered,s=void 0;if(r[e.preset])s=r[e.preset];else{if(!r[se])return;s=r[se]}if(s[o]&&void 0!==s[o][t.property]){var a=s[o][t.property];t.initialValue=a,t.setValue(a)}}}}function f(e,t,n,o){if(void 0===t[n])throw new Error('Object "'+t+'" has no property "'+n+'"');var i=void 0;if(o.color)i=new $(t,n);else{var r=[t,n].concat(o.factoryArgs);i=ne.apply(e,r)}o.before instanceof z&&(o.before=o.before.__li),p(e,i),X.addClass(i.domElement,"c");var s=document.createElement("span");X.addClass(s,"property-name"),s.innerHTML=i.property;var a=document.createElement("div");a.appendChild(s),a.appendChild(i.domElement);var l=c(e,a,o.before);return X.addClass(l,he.CLASS_CONTROLLER_ROW),i instanceof $?X.addClass(l,"color"):X.addClass(l,H(i.getValue())),h(e,l,i),e.__controllers.push(i),i}function m(e,t){return document.location.href+"."+t}function g(e,t,n){var o=document.createElement("option");o.innerHTML=t,o.value=t,e.__preset_select.appendChild(o),n&&(e.__preset_select.selectedIndex=e.__preset_select.length-1)}function b(e,t){t.style.display=e.useLocalStorage?"block":"none"}function v(e){var t=e.__save_row=document.createElement("li");X.addClass(e.domElement,"has-save"),e.__ul.insertBefore(t,e.__ul.firstChild),X.addClass(t,"save-row");var n=document.createElement("span");n.innerHTML=" ",X.addClass(n,"button gears");var o=document.createElement("span");o.innerHTML="Save",X.addClass(o,"button"),X.addClass(o,"save");var i=document.createElement("span");i.innerHTML="New",X.addClass(i,"button"),X.addClass(i,"save-as");var r=document.createElement("span");r.innerHTML="Revert",X.addClass(r,"button"),X.addClass(r,"revert");var s=e.__preset_select=document.createElement("select");if(e.load&&e.load.remembered?S.each(e.load.remembered,function(t,n){g(e,n,n===e.preset)}):g(e,se,!1),X.bind(s,"change",function(){for(var t=0;t=0;n--)t=[e[n].apply(this,t)];return t[0]}},each:function(e,t,n){if(e)if(A&&e.forEach&&e.forEach===A)e.forEach(t,n);else if(e.length===e.length+0){var o=void 0,i=void 0;for(o=0,i=e.length;o1?S.toArray(arguments):arguments[0];return S.each(O,function(t){if(t.litmus(e))return S.each(t.conversions,function(t,n){if(T=t.read(e),!1===L&&!1!==T)return L=T,T.conversionName=n,T.conversion=t,S.BREAK}),S.BREAK}),L},B=void 0,N={hsv_to_rgb:function(e,t,n){var o=Math.floor(e/60)%6,i=e/60-Math.floor(e/60),r=n*(1-t),s=n*(1-i*t),a=n*(1-(1-i)*t),l=[[n,a,r],[s,n,r],[r,n,a],[r,s,n],[a,r,n],[n,r,s]][o];return{r:255*l[0],g:255*l[1],b:255*l[2]}},rgb_to_hsv:function(e,t,n){var o=Math.min(e,t,n),i=Math.max(e,t,n),r=i-o,s=void 0,a=void 0;return 0===i?{h:NaN,s:0,v:0}:(a=r/i,s=e===i?(t-n)/r:t===i?2+(n-e)/r:4+(e-t)/r,(s/=6)<0&&(s+=1),{h:360*s,s:a,v:i/255})},rgb_to_hex:function(e,t,n){var o=this.hex_with_component(0,2,e);return o=this.hex_with_component(o,1,t),o=this.hex_with_component(o,0,n)},component_from_hex:function(e,t){return e>>8*t&255},hex_with_component:function(e,t,n){return n<<(B=8*t)|e&~(255<this.__max&&(n=this.__max),void 0!==this.__step&&n%this.__step!=0&&(n=Math.round(n/this.__step)*this.__step),j(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"setValue",this).call(this,n)}},{key:"min",value:function(e){return this.__min=e,this}},{key:"max",value:function(e){return this.__max=e,this}},{key:"step",value:function(e){return this.__step=e,this.__impliedStep=e,this.__precision=r(e),this}}]),t}(),Q=function(e){function t(e,n,o){function i(){l.__onFinishChange&&l.__onFinishChange.call(l,l.getValue())}function r(e){var t=d-e.clientY;l.setValue(l.getValue()+t*l.__impliedStep),d=e.clientY}function s(){X.unbind(window,"mousemove",r),X.unbind(window,"mouseup",s),i()}F(this,t);var a=V(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n,o));a.__truncationSuspended=!1;var l=a,d=void 0;return a.__input=document.createElement("input"),a.__input.setAttribute("type","text"),X.bind(a.__input,"change",function(){var e=parseFloat(l.__input.value);S.isNaN(e)||l.setValue(e)}),X.bind(a.__input,"blur",function(){i()}),X.bind(a.__input,"mousedown",function(e){X.bind(window,"mousemove",r),X.bind(window,"mouseup",s),d=e.clientY}),X.bind(a.__input,"keydown",function(e){13===e.keyCode&&(l.__truncationSuspended=!0,this.blur(),l.__truncationSuspended=!1,i())}),a.updateDisplay(),a.domElement.appendChild(a.__input),a}return D(t,W),P(t,[{key:"updateDisplay",value:function(){return this.__input.value=this.__truncationSuspended?this.getValue():s(this.getValue(),this.__precision),j(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}(),q=function(e){function t(e,n,o,i,r){function s(e){e.preventDefault();var t=_.__background.getBoundingClientRect();return _.setValue(a(e.clientX,t.left,t.right,_.__min,_.__max)),!1}function l(){X.unbind(window,"mousemove",s),X.unbind(window,"mouseup",l),_.__onFinishChange&&_.__onFinishChange.call(_,_.getValue())}function d(e){var t=e.touches[0].clientX,n=_.__background.getBoundingClientRect();_.setValue(a(t,n.left,n.right,_.__min,_.__max))}function c(){X.unbind(window,"touchmove",d),X.unbind(window,"touchend",c),_.__onFinishChange&&_.__onFinishChange.call(_,_.getValue())}F(this,t);var u=V(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n,{min:o,max:i,step:r})),_=u;return u.__background=document.createElement("div"),u.__foreground=document.createElement("div"),X.bind(u.__background,"mousedown",function(e){document.activeElement.blur(),X.bind(window,"mousemove",s),X.bind(window,"mouseup",l),s(e)}),X.bind(u.__background,"touchstart",function(e){1===e.touches.length&&(X.bind(window,"touchmove",d),X.bind(window,"touchend",c),d(e))}),X.addClass(u.__background,"slider"),X.addClass(u.__foreground,"slider-fg"),u.updateDisplay(),u.__background.appendChild(u.__foreground),u.domElement.appendChild(u.__background),u}return D(t,W),P(t,[{key:"updateDisplay",value:function(){var e=(this.getValue()-this.__min)/(this.__max-this.__min);return this.__foreground.style.width=100*e+"%",j(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}(),Z=function(e){function t(e,n,o){F(this,t);var i=V(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n)),r=i;return i.__button=document.createElement("div"),i.__button.innerHTML=void 0===o?"Fire":o,X.bind(i.__button,"click",function(e){return e.preventDefault(),r.fire(),!1}),X.addClass(i.__button,"button"),i.domElement.appendChild(i.__button),i}return D(t,z),P(t,[{key:"fire",value:function(){this.__onChange&&this.__onChange.call(this),this.getValue().call(this.object),this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue())}}]),t}(),$=function(e){function t(e,n){function o(e){u(e),X.bind(window,"mousemove",u),X.bind(window,"touchmove",u),X.bind(window,"mouseup",r),X.bind(window,"touchend",r)}function i(e){_(e),X.bind(window,"mousemove",_),X.bind(window,"touchmove",_),X.bind(window,"mouseup",s),X.bind(window,"touchend",s)}function r(){X.unbind(window,"mousemove",u),X.unbind(window,"touchmove",u),X.unbind(window,"mouseup",r),X.unbind(window,"touchend",r),c()}function s(){X.unbind(window,"mousemove",_),X.unbind(window,"touchmove",_),X.unbind(window,"mouseup",s),X.unbind(window,"touchend",s),c()}function a(){var e=R(this.value);!1!==e?(p.__color.__state=e,p.setValue(p.__color.toOriginal())):this.value=p.__color.toString()}function c(){p.__onFinishChange&&p.__onFinishChange.call(p,p.__color.toOriginal())}function u(e){-1===e.type.indexOf("touch")&&e.preventDefault();var t=p.__saturation_field.getBoundingClientRect(),n=e.touches&&e.touches[0]||e,o=n.clientX,i=n.clientY,r=(o-t.left)/(t.right-t.left),s=1-(i-t.top)/(t.bottom-t.top);return s>1?s=1:s<0&&(s=0),r>1?r=1:r<0&&(r=0),p.__color.v=s,p.__color.s=r,p.setValue(p.__color.toOriginal()),!1}function _(e){-1===e.type.indexOf("touch")&&e.preventDefault();var t=p.__hue_field.getBoundingClientRect(),n=1-((e.touches&&e.touches[0]||e).clientY-t.top)/(t.bottom-t.top);return n>1?n=1:n<0&&(n=0),p.__color.h=360*n,p.setValue(p.__color.toOriginal()),!1}F(this,t);var h=V(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n));h.__color=new I(h.getValue()),h.__temp=new I(0);var p=h;h.domElement=document.createElement("div"),X.makeSelectable(h.domElement,!1),h.__selector=document.createElement("div"),h.__selector.className="selector",h.__saturation_field=document.createElement("div"),h.__saturation_field.className="saturation-field",h.__field_knob=document.createElement("div"),h.__field_knob.className="field-knob",h.__field_knob_border="2px solid ",h.__hue_knob=document.createElement("div"),h.__hue_knob.className="hue-knob",h.__hue_field=document.createElement("div"),h.__hue_field.className="hue-field",h.__input=document.createElement("input"),h.__input.type="text",h.__input_textShadow="0 1px 1px ",X.bind(h.__input,"keydown",function(e){13===e.keyCode&&a.call(this)}),X.bind(h.__input,"blur",a),X.bind(h.__selector,"mousedown",function(){X.addClass(this,"drag").bind(window,"mouseup",function(){X.removeClass(p.__selector,"drag")})}),X.bind(h.__selector,"touchstart",function(){X.addClass(this,"drag").bind(window,"touchend",function(){X.removeClass(p.__selector,"drag")})});var f=document.createElement("div");return S.extend(h.__selector.style,{width:"122px",height:"102px",padding:"3px",backgroundColor:"#222",boxShadow:"0px 1px 3px rgba(0,0,0,0.3)"}),S.extend(h.__field_knob.style,{position:"absolute",width:"12px",height:"12px",border:h.__field_knob_border+(h.__color.v<.5?"#fff":"#000"),boxShadow:"0px 1px 3px rgba(0,0,0,0.5)",borderRadius:"12px",zIndex:1}),S.extend(h.__hue_knob.style,{position:"absolute",width:"15px",height:"2px",borderRight:"4px solid #fff",zIndex:1}),S.extend(h.__saturation_field.style,{width:"100px",height:"100px",border:"1px solid #555",marginRight:"3px",display:"inline-block",cursor:"pointer"}),S.extend(f.style,{width:"100%",height:"100%",background:"none"}),l(f,"top","rgba(0,0,0,0)","#000"),S.extend(h.__hue_field.style,{width:"15px",height:"100px",border:"1px solid #555",cursor:"ns-resize",position:"absolute",top:"3px",right:"3px"}),d(h.__hue_field),S.extend(h.__input.style,{outline:"none",textAlign:"center",color:"#fff",border:0,fontWeight:"bold",textShadow:h.__input_textShadow+"rgba(0,0,0,0.7)"}),X.bind(h.__saturation_field,"mousedown",o),X.bind(h.__saturation_field,"touchstart",o),X.bind(h.__field_knob,"mousedown",o),X.bind(h.__field_knob,"touchstart",o),X.bind(h.__hue_field,"mousedown",i),X.bind(h.__hue_field,"touchstart",i),h.__saturation_field.appendChild(f),h.__selector.appendChild(h.__field_knob),h.__selector.appendChild(h.__saturation_field),h.__selector.appendChild(h.__hue_field),h.__hue_field.appendChild(h.__hue_knob),h.domElement.appendChild(h.__input),h.domElement.appendChild(h.__selector),h.updateDisplay(),h}return D(t,z),P(t,[{key:"updateDisplay",value:function(){var e=R(this.getValue());if(!1!==e){var t=!1;S.each(I.COMPONENTS,function(n){if(!S.isUndefined(e[n])&&!S.isUndefined(this.__color.__state[n])&&e[n]!==this.__color.__state[n])return t=!0,{}},this),t&&S.extend(this.__color.__state,e)}S.extend(this.__temp.__state,this.__color.__state),this.__temp.a=1;var n=this.__color.v<.5||this.__color.s>.5?255:0,o=255-n;S.extend(this.__field_knob.style,{marginLeft:100*this.__color.s-7+"px",marginTop:100*(1-this.__color.v)-7+"px",backgroundColor:this.__temp.toHexString(),border:this.__field_knob_border+"rgb("+n+","+n+","+n+")"}),this.__hue_knob.style.marginTop=100*(1-this.__color.h/360)+"px",this.__temp.s=1,this.__temp.v=1,l(this.__saturation_field,"left","#fff",this.__temp.toHexString()),this.__input.value=this.__color.toString(),S.extend(this.__input.style,{backgroundColor:this.__color.toHexString(),color:"rgb("+n+","+n+","+n+")",textShadow:this.__input_textShadow+"rgba("+o+","+o+","+o+",.7)"})}}]),t}(),ee=["-moz-","-o-","-webkit-","-ms-",""],te={load:function(e,t){var n=t||document,o=n.createElement("link");o.type="text/css",o.rel="stylesheet",o.href=e,n.getElementsByTagName("head")[0].appendChild(o)},inject:function(e,t){var n=t||document,o=document.createElement("style");o.type="text/css",o.innerHTML=e;var i=n.getElementsByTagName("head")[0];try{i.appendChild(o)}catch(e){}}},ne=function(e,t){var n=e[t];return S.isArray(arguments[2])||S.isObject(arguments[2])?new Y(e,t,arguments[2]):S.isNumber(n)?S.isNumber(arguments[2])&&S.isNumber(arguments[3])?S.isNumber(arguments[4])?new q(e,t,arguments[2],arguments[3],arguments[4]):new q(e,t,arguments[2],arguments[3]):S.isNumber(arguments[4])?new Q(e,t,{min:arguments[2],max:arguments[3],step:arguments[4]}):new Q(e,t,{min:arguments[2],max:arguments[3]}):S.isString(n)?new J(e,t):S.isFunction(n)?new Z(e,t,""):S.isBoolean(n)?new K(e,t):null},oe=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){setTimeout(e,1e3/60)},ie=function(){function e(){F(this,e),this.backgroundElement=document.createElement("div"),S.extend(this.backgroundElement.style,{backgroundColor:"rgba(0,0,0,0.8)",top:0,left:0,display:"none",zIndex:"1000",opacity:0,WebkitTransition:"opacity 0.2s linear",transition:"opacity 0.2s linear"}),X.makeFullscreen(this.backgroundElement),this.backgroundElement.style.position="fixed",this.domElement=document.createElement("div"),S.extend(this.domElement.style,{position:"fixed",display:"none",zIndex:"1001",opacity:0,WebkitTransition:"-webkit-transform 0.2s ease-out, opacity 0.2s linear",transition:"transform 0.2s ease-out, opacity 0.2s linear"}),document.body.appendChild(this.backgroundElement),document.body.appendChild(this.domElement);var t=this;X.bind(this.backgroundElement,"click",function(){t.hide()})}return P(e,[{key:"show",value:function(){var e=this;this.backgroundElement.style.display="block",this.domElement.style.display="block",this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)",this.layout(),S.defer(function(){e.backgroundElement.style.opacity=1,e.domElement.style.opacity=1,e.domElement.style.webkitTransform="scale(1)"})}},{key:"hide",value:function(){var e=this,t=function t(){e.domElement.style.display="none",e.backgroundElement.style.display="none",X.unbind(e.domElement,"webkitTransitionEnd",t),X.unbind(e.domElement,"transitionend",t),X.unbind(e.domElement,"oTransitionEnd",t)};X.bind(this.domElement,"webkitTransitionEnd",t),X.bind(this.domElement,"transitionend",t),X.bind(this.domElement,"oTransitionEnd",t),this.backgroundElement.style.opacity=0,this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)"}},{key:"layout",value:function(){this.domElement.style.left=window.innerWidth/2-X.getWidth(this.domElement)/2+"px",this.domElement.style.top=window.innerHeight/2-X.getHeight(this.domElement)/2+"px"}}]),e}(),re=function(e){if(e&&"undefined"!=typeof window){var t=document.createElement("style");return t.setAttribute("type","text/css"),t.innerHTML=e,document.head.appendChild(t),e}}(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n");te.inject(re);var se="Default",ae=function(){try{return!!window.localStorage}catch(e){return!1}}(),le=void 0,de=!0,ce=void 0,ue=!1,_e=[],he=function e(t){var n=this,o=t||{};this.domElement=document.createElement("div"),this.__ul=document.createElement("ul"),this.domElement.appendChild(this.__ul),X.addClass(this.domElement,"dg"),this.__folders={},this.__controllers=[],this.__rememberedObjects=[],this.__rememberedObjectIndecesToControllers=[],this.__listening=[],o=S.defaults(o,{closeOnTop:!1,autoPlace:!0,width:e.DEFAULT_WIDTH}),o=S.defaults(o,{resizable:o.autoPlace,hideable:o.autoPlace}),S.isUndefined(o.load)?o.load={preset:se}:o.preset&&(o.load.preset=o.preset),S.isUndefined(o.parent)&&o.hideable&&_e.push(this),o.resizable=S.isUndefined(o.parent)&&o.resizable,o.autoPlace&&S.isUndefined(o.scrollable)&&(o.scrollable=!0);var i=ae&&"true"===localStorage.getItem(m(this,"isLocal")),r=void 0,s=void 0;if(Object.defineProperties(this,{parent:{get:function(){return o.parent}},scrollable:{get:function(){return o.scrollable}},autoPlace:{get:function(){return o.autoPlace}},closeOnTop:{get:function(){return o.closeOnTop}},preset:{get:function(){return n.parent?n.getRoot().preset:o.load.preset},set:function(e){n.parent?n.getRoot().preset=e:o.load.preset=e,E(this),n.revert()}},width:{get:function(){return o.width},set:function(e){o.width=e,w(n,e)}},name:{get:function(){return o.name},set:function(e){o.name=e,s&&(s.innerHTML=o.name)}},closed:{get:function(){return o.closed},set:function(t){o.closed=t,o.closed?X.addClass(n.__ul,e.CLASS_CLOSED):X.removeClass(n.__ul,e.CLASS_CLOSED),this.onResize(),n.__closeButton&&(n.__closeButton.innerHTML=t?e.TEXT_OPEN:e.TEXT_CLOSED)}},load:{get:function(){return o.load}},useLocalStorage:{get:function(){return i},set:function(e){ae&&(i=e,e?X.bind(window,"unload",r):X.unbind(window,"unload",r),localStorage.setItem(m(n,"isLocal"),e))}}}),S.isUndefined(o.parent)){if(this.closed=o.closed||!1,X.addClass(this.domElement,e.CLASS_MAIN),X.makeSelectable(this.domElement,!1),ae&&i){n.useLocalStorage=!0;var a=localStorage.getItem(m(this,"gui"));a&&(o.load=JSON.parse(a))}this.__closeButton=document.createElement("div"),this.__closeButton.innerHTML=e.TEXT_CLOSED,X.addClass(this.__closeButton,e.CLASS_CLOSE_BUTTON),o.closeOnTop?(X.addClass(this.__closeButton,e.CLASS_CLOSE_TOP),this.domElement.insertBefore(this.__closeButton,this.domElement.childNodes[0])):(X.addClass(this.__closeButton,e.CLASS_CLOSE_BOTTOM),this.domElement.appendChild(this.__closeButton)),X.bind(this.__closeButton,"click",function(){n.closed=!n.closed})}else{void 0===o.closed&&(o.closed=!0);var l=document.createTextNode(o.name);X.addClass(l,"controller-name"),s=c(n,l);X.addClass(this.__ul,e.CLASS_CLOSED),X.addClass(s,"title"),X.bind(s,"click",function(e){return e.preventDefault(),n.closed=!n.closed,!1}),o.closed||(this.closed=!1)}o.autoPlace&&(S.isUndefined(o.parent)&&(de&&(ce=document.createElement("div"),X.addClass(ce,"dg"),X.addClass(ce,e.CLASS_AUTO_PLACE_CONTAINER),document.body.appendChild(ce),de=!1),ce.appendChild(this.domElement),X.addClass(this.domElement,e.CLASS_AUTO_PLACE)),this.parent||w(n,o.width)),this.__resizeHandler=function(){n.onResizeDebounced()},X.bind(window,"resize",this.__resizeHandler),X.bind(this.__ul,"webkitTransitionEnd",this.__resizeHandler),X.bind(this.__ul,"transitionend",this.__resizeHandler),X.bind(this.__ul,"oTransitionEnd",this.__resizeHandler),this.onResize(),o.resizable&&y(this),r=function(){ae&&"true"===localStorage.getItem(m(n,"isLocal"))&&localStorage.setItem(m(n,"gui"),JSON.stringify(n.getSaveObject()))},this.saveToLocalStorageIfPossible=r,o.parent||function(){var e=n.getRoot();e.width+=1,S.defer(function(){e.width-=1})}()};he.toggleHide=function(){ue=!ue,S.each(_e,function(e){e.domElement.style.display=ue?"none":""})},he.CLASS_AUTO_PLACE="a",he.CLASS_AUTO_PLACE_CONTAINER="ac",he.CLASS_MAIN="main",he.CLASS_CONTROLLER_ROW="cr",he.CLASS_TOO_TALL="taller-than-window",he.CLASS_CLOSED="closed",he.CLASS_CLOSE_BUTTON="close-button",he.CLASS_CLOSE_TOP="close-top",he.CLASS_CLOSE_BOTTOM="close-bottom",he.CLASS_DRAG="drag",he.DEFAULT_WIDTH=245,he.TEXT_CLOSED="Close Controls",he.TEXT_OPEN="Open Controls",he._keydownHandler=function(e){"text"===document.activeElement.type||72!==e.which&&72!==e.keyCode||he.toggleHide()},X.bind(window,"keydown",he._keydownHandler,!1),S.extend(he.prototype,{add:function(e,t){return f(this,e,t,{factoryArgs:Array.prototype.slice.call(arguments,2)})},addColor:function(e,t){return f(this,e,t,{color:!0})},remove:function(e){this.__ul.removeChild(e.__li),this.__controllers.splice(this.__controllers.indexOf(e),1);var t=this;S.defer(function(){t.onResize()})},destroy:function(){if(this.parent)throw new Error("Only the root GUI should be removed with .destroy(). For subfolders, use gui.removeFolder(folder) instead.");this.autoPlace&&ce.removeChild(this.domElement);var e=this;S.each(this.__folders,function(t){e.removeFolder(t)}),X.unbind(window,"keydown",he._keydownHandler,!1),u(this)},addFolder:function(e){if(void 0!==this.__folders[e])throw new Error('You already have a folder in this GUI by the name "'+e+'"');var t={name:e,parent:this};t.autoPlace=this.autoPlace,this.load&&this.load.folders&&this.load.folders[e]&&(t.closed=this.load.folders[e].closed,t.load=this.load.folders[e]);var n=new he(t);this.__folders[e]=n;var o=c(this,n.domElement);return X.addClass(o,"folder"),n},removeFolder:function(e){this.__ul.removeChild(e.domElement.parentElement),delete this.__folders[e.name],this.load&&this.load.folders&&this.load.folders[e.name]&&delete this.load.folders[e.name],u(e);var t=this;S.each(e.__folders,function(t){e.removeFolder(t)}),S.defer(function(){t.onResize()})},open:function(){this.closed=!1},close:function(){this.closed=!0},hide:function(){this.domElement.style.display="none"},show:function(){this.domElement.style.display=""},onResize:function(){var e=this.getRoot();if(e.scrollable){var t=X.getOffset(e.__ul).top,n=0;S.each(e.__ul.childNodes,function(t){e.autoPlace&&t===e.__save_row||(n+=X.getHeight(t))}),window.innerHeight-t-20GUI\'s constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI\'s constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n'),this.parent)throw new Error("You can only call remember on a top level GUI.");var e=this;S.each(Array.prototype.slice.call(arguments),function(t){0===e.__rememberedObjects.length&&v(e),-1===e.__rememberedObjects.indexOf(t)&&e.__rememberedObjects.push(t)}),this.autoPlace&&w(this,this.width)},getRoot:function(){for(var e=this;e.parent;)e=e.parent;return e},getSaveObject:function(){var e=this.load;return e.closed=this.closed,this.__rememberedObjects.length>0&&(e.preset=this.preset,e.remembered||(e.remembered={}),e.remembered[this.preset]=x(this)),e.folders={},S.each(this.__folders,function(t,n){e.folders[n]=t.getSaveObject()}),e},save:function(){this.load.remembered||(this.load.remembered={}),this.load.remembered[this.preset]=x(this),_(this,!1),this.saveToLocalStorageIfPossible()},saveAs:function(e){this.load.remembered||(this.load.remembered={},this.load.remembered[se]=x(this,!0)),this.load.remembered[e]=x(this),this.preset=e,g(this,e,!0),this.saveToLocalStorageIfPossible()},revert:function(e){S.each(this.__controllers,function(t){this.getRoot().load.remembered?p(e||this.getRoot(),t):t.setValue(t.initialValue),t.__onFinishChange&&t.__onFinishChange.call(t,t.getValue())},this),S.each(this.__folders,function(e){e.revert(e)}),e||_(this.getRoot(),!1)},listen:function(e){var t=0===this.__listening.length;this.__listening.push(e),t&&C(this.__listening)},updateDisplay:function(){S.each(this.__controllers,function(e){e.updateDisplay()}),S.each(this.__folders,function(e){e.updateDisplay()})}});var pe={Color:I,math:N,interpret:R},fe={Controller:z,BooleanController:K,OptionController:Y,StringController:J,NumberController:W,NumberControllerBox:Q,NumberControllerSlider:q,FunctionController:Z,ColorController:$},me={dom:X},ge={GUI:he},be=he,ve={color:pe,controllers:fe,dom:me,gui:ge,GUI:be};e.color=pe,e.controllers=fe,e.dom=me,e.gui=ge,e.GUI=be,e.default=ve,Object.defineProperty(e,"__esModule",{value:!0})}); diff --git a/build/dat.gui.module.js b/build/dat.gui.module.js new file mode 100644 index 000000000..b067e9b8e --- /dev/null +++ b/build/dat.gui.module.js @@ -0,0 +1,2523 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +function ___$insertStyle(css) { + if (!css) { + return; + } + if (typeof window === 'undefined') { + return; + } + + var style = document.createElement('style'); + + style.setAttribute('type', 'text/css'); + style.innerHTML = css; + document.head.appendChild(style); + + return css; +} + +function colorToString (color, forceCSSHex) { + var colorFormat = color.__state.conversionName.toString(); + var r = Math.round(color.r); + var g = Math.round(color.g); + var b = Math.round(color.b); + var a = color.a; + var h = Math.round(color.h); + var s = color.s.toFixed(1); + var v = color.v.toFixed(1); + if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') { + var str = color.hex.toString(16); + while (str.length < 6) { + str = '0' + str; + } + return '#' + str; + } else if (colorFormat === 'CSS_RGB') { + return 'rgb(' + r + ',' + g + ',' + b + ')'; + } else if (colorFormat === 'CSS_RGBA') { + return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; + } else if (colorFormat === 'HEX') { + return '0x' + color.hex.toString(16); + } else if (colorFormat === 'RGB_ARRAY') { + return '[' + r + ',' + g + ',' + b + ']'; + } else if (colorFormat === 'RGBA_ARRAY') { + return '[' + r + ',' + g + ',' + b + ',' + a + ']'; + } else if (colorFormat === 'RGB_OBJ') { + return '{r:' + r + ',g:' + g + ',b:' + b + '}'; + } else if (colorFormat === 'RGBA_OBJ') { + return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}'; + } else if (colorFormat === 'HSV_OBJ') { + return '{h:' + h + ',s:' + s + ',v:' + v + '}'; + } else if (colorFormat === 'HSVA_OBJ') { + return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}'; + } + return 'unknown format'; +} + +var ARR_EACH = Array.prototype.forEach; +var ARR_SLICE = Array.prototype.slice; +var Common = { + BREAK: {}, + extend: function extend(target) { + this.each(ARR_SLICE.call(arguments, 1), function (obj) { + var keys = this.isObject(obj) ? Object.keys(obj) : []; + keys.forEach(function (key) { + if (!this.isUndefined(obj[key])) { + target[key] = obj[key]; + } + }.bind(this)); + }, this); + return target; + }, + defaults: function defaults(target) { + this.each(ARR_SLICE.call(arguments, 1), function (obj) { + var keys = this.isObject(obj) ? Object.keys(obj) : []; + keys.forEach(function (key) { + if (this.isUndefined(target[key])) { + target[key] = obj[key]; + } + }.bind(this)); + }, this); + return target; + }, + compose: function compose() { + var toCall = ARR_SLICE.call(arguments); + return function () { + var args = ARR_SLICE.call(arguments); + for (var i = toCall.length - 1; i >= 0; i--) { + args = [toCall[i].apply(this, args)]; + } + return args[0]; + }; + }, + each: function each(obj, itr, scope) { + if (!obj) { + return; + } + if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) { + obj.forEach(itr, scope); + } else if (obj.length === obj.length + 0) { + var key = void 0; + var l = void 0; + for (key = 0, l = obj.length; key < l; key++) { + if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) { + return; + } + } + } else { + for (var _key in obj) { + if (itr.call(scope, obj[_key], _key) === this.BREAK) { + return; + } + } + } + }, + defer: function defer(fnc) { + setTimeout(fnc, 0); + }, + debounce: function debounce(func, threshold, callImmediately) { + var timeout = void 0; + return function () { + var obj = this; + var args = arguments; + function delayed() { + timeout = null; + if (!callImmediately) func.apply(obj, args); + } + var callNow = callImmediately || !timeout; + clearTimeout(timeout); + timeout = setTimeout(delayed, threshold); + if (callNow) { + func.apply(obj, args); + } + }; + }, + toArray: function toArray(obj) { + if (obj.toArray) return obj.toArray(); + return ARR_SLICE.call(obj); + }, + isUndefined: function isUndefined(obj) { + return obj === undefined; + }, + isNull: function isNull(obj) { + return obj === null; + }, + isNaN: function (_isNaN) { + function isNaN(_x) { + return _isNaN.apply(this, arguments); + } + isNaN.toString = function () { + return _isNaN.toString(); + }; + return isNaN; + }(function (obj) { + return isNaN(obj); + }), + isArray: Array.isArray || function (obj) { + return obj.constructor === Array; + }, + isObject: function isObject(obj) { + return obj === Object(obj); + }, + isNumber: function isNumber(obj) { + return obj === obj + 0; + }, + isString: function isString(obj) { + return obj === obj + ''; + }, + isBoolean: function isBoolean(obj) { + return obj === false || obj === true; + }, + isFunction: function isFunction(obj) { + return Object.prototype.toString.call(obj) === '[object Function]'; + } +}; + +var INTERPRETATIONS = [ +{ + litmus: Common.isString, + conversions: { + THREE_CHAR_HEX: { + read: function read(original) { + var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); + if (test === null) { + return false; + } + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0) + }; + }, + write: colorToString + }, + SIX_CHAR_HEX: { + read: function read(original) { + var test = original.match(/^#([A-F0-9]{6})$/i); + if (test === null) { + return false; + } + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString(), 0) + }; + }, + write: colorToString + }, + CSS_RGB: { + read: function read(original) { + var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) { + return false; + } + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]) + }; + }, + write: colorToString + }, + CSS_RGBA: { + read: function read(original) { + var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) { + return false; + } + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]), + a: parseFloat(test[4]) + }; + }, + write: colorToString + } + } +}, +{ + litmus: Common.isNumber, + conversions: { + HEX: { + read: function read(original) { + return { + space: 'HEX', + hex: original, + conversionName: 'HEX' + }; + }, + write: function write(color) { + return color.hex; + } + } + } +}, +{ + litmus: Common.isArray, + conversions: { + RGB_ARRAY: { + read: function read(original) { + if (original.length !== 3) { + return false; + } + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2] + }; + }, + write: function write(color) { + return [color.r, color.g, color.b]; + } + }, + RGBA_ARRAY: { + read: function read(original) { + if (original.length !== 4) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2], + a: original[3] + }; + }, + write: function write(color) { + return [color.r, color.g, color.b, color.a]; + } + } + } +}, +{ + litmus: Common.isObject, + conversions: { + RGBA_OBJ: { + read: function read(original) { + if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b, + a: original.a + }; + } + return false; + }, + write: function write(color) { + return { + r: color.r, + g: color.g, + b: color.b, + a: color.a + }; + } + }, + RGB_OBJ: { + read: function read(original) { + if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b + }; + } + return false; + }, + write: function write(color) { + return { + r: color.r, + g: color.g, + b: color.b + }; + } + }, + HSVA_OBJ: { + read: function read(original) { + if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v, + a: original.a + }; + } + return false; + }, + write: function write(color) { + return { + h: color.h, + s: color.s, + v: color.v, + a: color.a + }; + } + }, + HSV_OBJ: { + read: function read(original) { + if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v + }; + } + return false; + }, + write: function write(color) { + return { + h: color.h, + s: color.s, + v: color.v + }; + } + } + } +}]; +var result = void 0; +var toReturn = void 0; +var interpret = function interpret() { + toReturn = false; + var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0]; + Common.each(INTERPRETATIONS, function (family) { + if (family.litmus(original)) { + Common.each(family.conversions, function (conversion, conversionName) { + result = conversion.read(original); + if (toReturn === false && result !== false) { + toReturn = result; + result.conversionName = conversionName; + result.conversion = conversion; + return Common.BREAK; + } + }); + return Common.BREAK; + } + }); + return toReturn; +}; + +var tmpComponent = void 0; +var ColorMath = { + hsv_to_rgb: function hsv_to_rgb(h, s, v) { + var hi = Math.floor(h / 60) % 6; + var f = h / 60 - Math.floor(h / 60); + var p = v * (1.0 - s); + var q = v * (1.0 - f * s); + var t = v * (1.0 - (1.0 - f) * s); + var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi]; + return { + r: c[0] * 255, + g: c[1] * 255, + b: c[2] * 255 + }; + }, + rgb_to_hsv: function rgb_to_hsv(r, g, b) { + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h = void 0; + var s = void 0; + if (max !== 0) { + s = delta / max; + } else { + return { + h: NaN, + s: 0, + v: 0 + }; + } + if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else { + h = 4 + (r - g) / delta; + } + h /= 6; + if (h < 0) { + h += 1; + } + return { + h: h * 360, + s: s, + v: max / 255 + }; + }, + rgb_to_hex: function rgb_to_hex(r, g, b) { + var hex = this.hex_with_component(0, 2, r); + hex = this.hex_with_component(hex, 1, g); + hex = this.hex_with_component(hex, 0, b); + return hex; + }, + component_from_hex: function component_from_hex(hex, componentIndex) { + return hex >> componentIndex * 8 & 0xFF; + }, + hex_with_component: function hex_with_component(hex, componentIndex, value) { + return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent); + } +}; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; +}; + + + + + + + + + + + +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + + + + + + + +var get = function get(object, property, receiver) { + if (object === null) object = Function.prototype; + var desc = Object.getOwnPropertyDescriptor(object, property); + + if (desc === undefined) { + var parent = Object.getPrototypeOf(object); + + if (parent === null) { + return undefined; + } else { + return get(parent, property, receiver); + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get; + + if (getter === undefined) { + return undefined; + } + + return getter.call(receiver); + } +}; + +var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +}; + + + + + + + + + + + +var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; +}; + +var Color = function () { + function Color() { + classCallCheck(this, Color); + this.__state = interpret.apply(this, arguments); + if (this.__state === false) { + throw new Error('Failed to interpret color arguments'); + } + this.__state.a = this.__state.a || 1; + } + createClass(Color, [{ + key: 'toString', + value: function toString() { + return colorToString(this); + } + }, { + key: 'toHexString', + value: function toHexString() { + return colorToString(this, true); + } + }, { + key: 'toOriginal', + value: function toOriginal() { + return this.__state.conversion.write(this); + } + }]); + return Color; +}(); +function defineRGBComponent(target, component, componentHexIndex) { + Object.defineProperty(target, component, { + get: function get$$1() { + if (this.__state.space === 'RGB') { + return this.__state[component]; + } + Color.recalculateRGB(this, component, componentHexIndex); + return this.__state[component]; + }, + set: function set$$1(v) { + if (this.__state.space !== 'RGB') { + Color.recalculateRGB(this, component, componentHexIndex); + this.__state.space = 'RGB'; + } + this.__state[component] = v; + } + }); +} +function defineHSVComponent(target, component) { + Object.defineProperty(target, component, { + get: function get$$1() { + if (this.__state.space === 'HSV') { + return this.__state[component]; + } + Color.recalculateHSV(this); + return this.__state[component]; + }, + set: function set$$1(v) { + if (this.__state.space !== 'HSV') { + Color.recalculateHSV(this); + this.__state.space = 'HSV'; + } + this.__state[component] = v; + } + }); +} +Color.recalculateRGB = function (color, component, componentHexIndex) { + if (color.__state.space === 'HEX') { + color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex); + } else if (color.__state.space === 'HSV') { + Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); + } else { + throw new Error('Corrupted color state'); + } +}; +Color.recalculateHSV = function (color) { + var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b); + Common.extend(color.__state, { + s: result.s, + v: result.v + }); + if (!Common.isNaN(result.h)) { + color.__state.h = result.h; + } else if (Common.isUndefined(color.__state.h)) { + color.__state.h = 0; + } +}; +Color.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a']; +defineRGBComponent(Color.prototype, 'r', 2); +defineRGBComponent(Color.prototype, 'g', 1); +defineRGBComponent(Color.prototype, 'b', 0); +defineHSVComponent(Color.prototype, 'h'); +defineHSVComponent(Color.prototype, 's'); +defineHSVComponent(Color.prototype, 'v'); +Object.defineProperty(Color.prototype, 'a', { + get: function get$$1() { + return this.__state.a; + }, + set: function set$$1(v) { + this.__state.a = v; + } +}); +Object.defineProperty(Color.prototype, 'hex', { + get: function get$$1() { + if (!this.__state.space !== 'HEX') { + this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b); + } + return this.__state.hex; + }, + set: function set$$1(v) { + this.__state.space = 'HEX'; + this.__state.hex = v; + } +}); + +var Controller = function () { + function Controller(object, property) { + classCallCheck(this, Controller); + this.initialValue = object[property]; + this.domElement = document.createElement('div'); + this.object = object; + this.property = property; + this.__onChange = undefined; + this.__onFinishChange = undefined; + } + createClass(Controller, [{ + key: 'onChange', + value: function onChange(fnc) { + this.__onChange = fnc; + return this; + } + }, { + key: 'onFinishChange', + value: function onFinishChange(fnc) { + this.__onFinishChange = fnc; + return this; + } + }, { + key: 'setValue', + value: function setValue(newValue) { + this.object[this.property] = newValue; + if (this.__onChange) { + this.__onChange.call(this, newValue); + } + this.updateDisplay(); + return this; + } + }, { + key: 'getValue', + value: function getValue() { + return this.object[this.property]; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + return this; + } + }, { + key: 'isModified', + value: function isModified() { + return this.initialValue !== this.getValue(); + } + }]); + return Controller; +}(); + +var EVENT_MAP = { + HTMLEvents: ['change'], + MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'], + KeyboardEvents: ['keydown'] +}; +var EVENT_MAP_INV = {}; +Common.each(EVENT_MAP, function (v, k) { + Common.each(v, function (e) { + EVENT_MAP_INV[e] = k; + }); +}); +var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; +function cssValueToPixels(val) { + if (val === '0' || Common.isUndefined(val)) { + return 0; + } + var match = val.match(CSS_VALUE_PIXELS); + if (!Common.isNull(match)) { + return parseFloat(match[1]); + } + return 0; +} +var dom = { + makeSelectable: function makeSelectable(elem, selectable) { + if (elem === undefined || elem.style === undefined) return; + elem.onselectstart = selectable ? function () { + return false; + } : function () {}; + elem.style.MozUserSelect = selectable ? 'auto' : 'none'; + elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; + elem.unselectable = selectable ? 'on' : 'off'; + }, + makeFullscreen: function makeFullscreen(elem, hor, vert) { + var vertical = vert; + var horizontal = hor; + if (Common.isUndefined(horizontal)) { + horizontal = true; + } + if (Common.isUndefined(vertical)) { + vertical = true; + } + elem.style.position = 'absolute'; + if (horizontal) { + elem.style.left = 0; + elem.style.right = 0; + } + if (vertical) { + elem.style.top = 0; + elem.style.bottom = 0; + } + }, + fakeEvent: function fakeEvent(elem, eventType, pars, aux) { + var params = pars || {}; + var className = EVENT_MAP_INV[eventType]; + if (!className) { + throw new Error('Event type ' + eventType + ' not supported.'); + } + var evt = document.createEvent(className); + switch (className) { + case 'MouseEvents': + { + var clientX = params.x || params.clientX || 0; + var clientY = params.y || params.clientY || 0; + evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0, + 0, + clientX, + clientY, + false, false, false, false, 0, null); + break; + } + case 'KeyboardEvents': + { + var init = evt.initKeyboardEvent || evt.initKeyEvent; + Common.defaults(params, { + cancelable: true, + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false, + keyCode: undefined, + charCode: undefined + }); + init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode); + break; + } + default: + { + evt.initEvent(eventType, params.bubbles || false, params.cancelable || true); + break; + } + } + Common.defaults(evt, aux); + elem.dispatchEvent(evt); + }, + bind: function bind(elem, event, func, newBool) { + var bool = newBool || false; + if (elem.addEventListener) { + elem.addEventListener(event, func, bool); + } else if (elem.attachEvent) { + elem.attachEvent('on' + event, func); + } + return dom; + }, + unbind: function unbind(elem, event, func, newBool) { + var bool = newBool || false; + if (elem.removeEventListener) { + elem.removeEventListener(event, func, bool); + } else if (elem.detachEvent) { + elem.detachEvent('on' + event, func); + } + return dom; + }, + addClass: function addClass(elem, className) { + if (elem.className === undefined) { + elem.className = className; + } else if (elem.className !== className) { + var classes = elem.className.split(/ +/); + if (classes.indexOf(className) === -1) { + classes.push(className); + elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); + } + } + return dom; + }, + removeClass: function removeClass(elem, className) { + if (className) { + if (elem.className === className) { + elem.removeAttribute('class'); + } else { + var classes = elem.className.split(/ +/); + var index = classes.indexOf(className); + if (index !== -1) { + classes.splice(index, 1); + elem.className = classes.join(' '); + } + } + } else { + elem.className = undefined; + } + return dom; + }, + hasClass: function hasClass(elem, className) { + return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; + }, + getWidth: function getWidth(elem) { + var style = getComputedStyle(elem); + return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width); + }, + getHeight: function getHeight(elem) { + var style = getComputedStyle(elem); + return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height); + }, + getOffset: function getOffset(el) { + var elem = el; + var offset = { left: 0, top: 0 }; + if (elem.offsetParent) { + do { + offset.left += elem.offsetLeft; + offset.top += elem.offsetTop; + elem = elem.offsetParent; + } while (elem); + } + return offset; + }, + isActive: function isActive(elem) { + return elem === document.activeElement && (elem.type || elem.href); + } +}; + +var BooleanController = function (_Controller) { + inherits(BooleanController, _Controller); + function BooleanController(object, property) { + classCallCheck(this, BooleanController); + var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property)); + var _this = _this2; + _this2.__prev = _this2.getValue(); + _this2.__checkbox = document.createElement('input'); + _this2.__checkbox.setAttribute('type', 'checkbox'); + function onChange() { + _this.setValue(!_this.__prev); + } + dom.bind(_this2.__checkbox, 'change', onChange, false); + _this2.domElement.appendChild(_this2.__checkbox); + _this2.updateDisplay(); + return _this2; + } + createClass(BooleanController, [{ + key: 'setValue', + value: function setValue(v) { + var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + this.__prev = this.getValue(); + return toReturn; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + if (this.getValue() === true) { + this.__checkbox.setAttribute('checked', 'checked'); + this.__checkbox.checked = true; + this.__prev = true; + } else { + this.__checkbox.checked = false; + this.__prev = false; + } + return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this); + } + }]); + return BooleanController; +}(Controller); + +var OptionController = function (_Controller) { + inherits(OptionController, _Controller); + function OptionController(object, property, opts) { + classCallCheck(this, OptionController); + var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property)); + var options = opts; + var _this = _this2; + _this2.__select = document.createElement('select'); + if (Common.isArray(options)) { + var map = {}; + Common.each(options, function (element) { + map[element] = element; + }); + options = map; + } + Common.each(options, function (value, key) { + var opt = document.createElement('option'); + opt.innerHTML = key; + opt.setAttribute('value', value); + _this.__select.appendChild(opt); + }); + _this2.updateDisplay(); + dom.bind(_this2.__select, 'change', function () { + var desiredValue = this.options[this.selectedIndex].value; + _this.setValue(desiredValue); + }); + _this2.domElement.appendChild(_this2.__select); + return _this2; + } + createClass(OptionController, [{ + key: 'setValue', + value: function setValue(v) { + var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + return toReturn; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + if (dom.isActive(this.__select)) return this; + this.__select.value = this.getValue(); + return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this); + } + }]); + return OptionController; +}(Controller); + +var StringController = function (_Controller) { + inherits(StringController, _Controller); + function StringController(object, property) { + classCallCheck(this, StringController); + var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property)); + var _this = _this2; + function onChange() { + _this.setValue(_this.__input.value); + } + function onBlur() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + _this2.__input = document.createElement('input'); + _this2.__input.setAttribute('type', 'text'); + dom.bind(_this2.__input, 'keyup', onChange); + dom.bind(_this2.__input, 'change', onChange); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + this.blur(); + } + }); + _this2.updateDisplay(); + _this2.domElement.appendChild(_this2.__input); + return _this2; + } + createClass(StringController, [{ + key: 'updateDisplay', + value: function updateDisplay() { + if (!dom.isActive(this.__input)) { + this.__input.value = this.getValue(); + } + return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this); + } + }]); + return StringController; +}(Controller); + +function numDecimals(x) { + var _x = x.toString(); + if (_x.indexOf('.') > -1) { + return _x.length - _x.indexOf('.') - 1; + } + return 0; +} +var NumberController = function (_Controller) { + inherits(NumberController, _Controller); + function NumberController(object, property, params) { + classCallCheck(this, NumberController); + var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property)); + var _params = params || {}; + _this.__min = _params.min; + _this.__max = _params.max; + _this.__step = _params.step; + if (Common.isUndefined(_this.__step)) { + if (_this.initialValue === 0) { + _this.__impliedStep = 1; + } else { + _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10; + } + } else { + _this.__impliedStep = _this.__step; + } + _this.__precision = numDecimals(_this.__impliedStep); + return _this; + } + createClass(NumberController, [{ + key: 'setValue', + value: function setValue(v) { + var _v = v; + if (this.__min !== undefined && _v < this.__min) { + _v = this.__min; + } else if (this.__max !== undefined && _v > this.__max) { + _v = this.__max; + } + if (this.__step !== undefined && _v % this.__step !== 0) { + _v = Math.round(_v / this.__step) * this.__step; + } + return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v); + } + }, { + key: 'min', + value: function min(minValue) { + this.__min = minValue; + return this; + } + }, { + key: 'max', + value: function max(maxValue) { + this.__max = maxValue; + return this; + } + }, { + key: 'step', + value: function step(stepValue) { + this.__step = stepValue; + this.__impliedStep = stepValue; + this.__precision = numDecimals(stepValue); + return this; + } + }]); + return NumberController; +}(Controller); + +function roundToDecimal(value, decimals) { + var tenTo = Math.pow(10, decimals); + return Math.round(value * tenTo) / tenTo; +} +var NumberControllerBox = function (_NumberController) { + inherits(NumberControllerBox, _NumberController); + function NumberControllerBox(object, property, params) { + classCallCheck(this, NumberControllerBox); + var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params)); + _this2.__truncationSuspended = false; + var _this = _this2; + var prevY = void 0; + function onChange() { + var attempted = parseFloat(_this.__input.value); + if (!Common.isNaN(attempted)) { + _this.setValue(attempted); + } + } + function onFinish() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + function onBlur() { + onFinish(); + } + function onMouseDrag(e) { + var diff = prevY - e.clientY; + _this.setValue(_this.getValue() + diff * _this.__impliedStep); + prevY = e.clientY; + } + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + onFinish(); + } + function onMouseDown(e) { + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + prevY = e.clientY; + } + _this2.__input = document.createElement('input'); + _this2.__input.setAttribute('type', 'text'); + dom.bind(_this2.__input, 'change', onChange); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__input, 'mousedown', onMouseDown); + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + _this.__truncationSuspended = true; + this.blur(); + _this.__truncationSuspended = false; + onFinish(); + } + }); + _this2.updateDisplay(); + _this2.domElement.appendChild(_this2.__input); + return _this2; + } + createClass(NumberControllerBox, [{ + key: 'updateDisplay', + value: function updateDisplay() { + this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); + return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this); + } + }]); + return NumberControllerBox; +}(NumberController); + +function map(v, i1, i2, o1, o2) { + return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); +} +var NumberControllerSlider = function (_NumberController) { + inherits(NumberControllerSlider, _NumberController); + function NumberControllerSlider(object, property, min, max, step) { + classCallCheck(this, NumberControllerSlider); + var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step })); + var _this = _this2; + _this2.__background = document.createElement('div'); + _this2.__foreground = document.createElement('div'); + dom.bind(_this2.__background, 'mousedown', onMouseDown); + dom.bind(_this2.__background, 'touchstart', onTouchStart); + dom.addClass(_this2.__background, 'slider'); + dom.addClass(_this2.__foreground, 'slider-fg'); + function onMouseDown(e) { + document.activeElement.blur(); + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + onMouseDrag(e); + } + function onMouseDrag(e) { + e.preventDefault(); + var bgRect = _this.__background.getBoundingClientRect(); + _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); + return false; + } + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + function onTouchStart(e) { + if (e.touches.length !== 1) { + return; + } + dom.bind(window, 'touchmove', onTouchMove); + dom.bind(window, 'touchend', onTouchEnd); + onTouchMove(e); + } + function onTouchMove(e) { + var clientX = e.touches[0].clientX; + var bgRect = _this.__background.getBoundingClientRect(); + _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); + } + function onTouchEnd() { + dom.unbind(window, 'touchmove', onTouchMove); + dom.unbind(window, 'touchend', onTouchEnd); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + _this2.updateDisplay(); + _this2.__background.appendChild(_this2.__foreground); + _this2.domElement.appendChild(_this2.__background); + return _this2; + } + createClass(NumberControllerSlider, [{ + key: 'updateDisplay', + value: function updateDisplay() { + var pct = (this.getValue() - this.__min) / (this.__max - this.__min); + this.__foreground.style.width = pct * 100 + '%'; + return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this); + } + }]); + return NumberControllerSlider; +}(NumberController); + +var FunctionController = function (_Controller) { + inherits(FunctionController, _Controller); + function FunctionController(object, property, text) { + classCallCheck(this, FunctionController); + var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property)); + var _this = _this2; + _this2.__button = document.createElement('div'); + _this2.__button.innerHTML = text === undefined ? 'Fire' : text; + dom.bind(_this2.__button, 'click', function (e) { + e.preventDefault(); + _this.fire(); + return false; + }); + dom.addClass(_this2.__button, 'button'); + _this2.domElement.appendChild(_this2.__button); + return _this2; + } + createClass(FunctionController, [{ + key: 'fire', + value: function fire() { + if (this.__onChange) { + this.__onChange.call(this); + } + this.getValue().call(this.object); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + } + }]); + return FunctionController; +}(Controller); + +var ColorController = function (_Controller) { + inherits(ColorController, _Controller); + function ColorController(object, property) { + classCallCheck(this, ColorController); + var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property)); + _this2.__color = new Color(_this2.getValue()); + _this2.__temp = new Color(0); + var _this = _this2; + _this2.domElement = document.createElement('div'); + dom.makeSelectable(_this2.domElement, false); + _this2.__selector = document.createElement('div'); + _this2.__selector.className = 'selector'; + _this2.__saturation_field = document.createElement('div'); + _this2.__saturation_field.className = 'saturation-field'; + _this2.__field_knob = document.createElement('div'); + _this2.__field_knob.className = 'field-knob'; + _this2.__field_knob_border = '2px solid '; + _this2.__hue_knob = document.createElement('div'); + _this2.__hue_knob.className = 'hue-knob'; + _this2.__hue_field = document.createElement('div'); + _this2.__hue_field.className = 'hue-field'; + _this2.__input = document.createElement('input'); + _this2.__input.type = 'text'; + _this2.__input_textShadow = '0 1px 1px '; + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + onBlur.call(this); + } + }); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__selector, 'mousedown', function () { + dom.addClass(this, 'drag').bind(window, 'mouseup', function () { + dom.removeClass(_this.__selector, 'drag'); + }); + }); + dom.bind(_this2.__selector, 'touchstart', function () { + dom.addClass(this, 'drag').bind(window, 'touchend', function () { + dom.removeClass(_this.__selector, 'drag'); + }); + }); + var valueField = document.createElement('div'); + Common.extend(_this2.__selector.style, { + width: '122px', + height: '102px', + padding: '3px', + backgroundColor: '#222', + boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' + }); + Common.extend(_this2.__field_knob.style, { + position: 'absolute', + width: '12px', + height: '12px', + border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'), + boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', + borderRadius: '12px', + zIndex: 1 + }); + Common.extend(_this2.__hue_knob.style, { + position: 'absolute', + width: '15px', + height: '2px', + borderRight: '4px solid #fff', + zIndex: 1 + }); + Common.extend(_this2.__saturation_field.style, { + width: '100px', + height: '100px', + border: '1px solid #555', + marginRight: '3px', + display: 'inline-block', + cursor: 'pointer' + }); + Common.extend(valueField.style, { + width: '100%', + height: '100%', + background: 'none' + }); + linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000'); + Common.extend(_this2.__hue_field.style, { + width: '15px', + height: '100px', + border: '1px solid #555', + cursor: 'ns-resize', + position: 'absolute', + top: '3px', + right: '3px' + }); + hueGradient(_this2.__hue_field); + Common.extend(_this2.__input.style, { + outline: 'none', + textAlign: 'center', + color: '#fff', + border: 0, + fontWeight: 'bold', + textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)' + }); + dom.bind(_this2.__saturation_field, 'mousedown', fieldDown); + dom.bind(_this2.__saturation_field, 'touchstart', fieldDown); + dom.bind(_this2.__field_knob, 'mousedown', fieldDown); + dom.bind(_this2.__field_knob, 'touchstart', fieldDown); + dom.bind(_this2.__hue_field, 'mousedown', fieldDownH); + dom.bind(_this2.__hue_field, 'touchstart', fieldDownH); + function fieldDown(e) { + setSV(e); + dom.bind(window, 'mousemove', setSV); + dom.bind(window, 'touchmove', setSV); + dom.bind(window, 'mouseup', fieldUpSV); + dom.bind(window, 'touchend', fieldUpSV); + } + function fieldDownH(e) { + setH(e); + dom.bind(window, 'mousemove', setH); + dom.bind(window, 'touchmove', setH); + dom.bind(window, 'mouseup', fieldUpH); + dom.bind(window, 'touchend', fieldUpH); + } + function fieldUpSV() { + dom.unbind(window, 'mousemove', setSV); + dom.unbind(window, 'touchmove', setSV); + dom.unbind(window, 'mouseup', fieldUpSV); + dom.unbind(window, 'touchend', fieldUpSV); + onFinish(); + } + function fieldUpH() { + dom.unbind(window, 'mousemove', setH); + dom.unbind(window, 'touchmove', setH); + dom.unbind(window, 'mouseup', fieldUpH); + dom.unbind(window, 'touchend', fieldUpH); + onFinish(); + } + function onBlur() { + var i = interpret(this.value); + if (i !== false) { + _this.__color.__state = i; + _this.setValue(_this.__color.toOriginal()); + } else { + this.value = _this.__color.toString(); + } + } + function onFinish() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.__color.toOriginal()); + } + } + _this2.__saturation_field.appendChild(valueField); + _this2.__selector.appendChild(_this2.__field_knob); + _this2.__selector.appendChild(_this2.__saturation_field); + _this2.__selector.appendChild(_this2.__hue_field); + _this2.__hue_field.appendChild(_this2.__hue_knob); + _this2.domElement.appendChild(_this2.__input); + _this2.domElement.appendChild(_this2.__selector); + _this2.updateDisplay(); + function setSV(e) { + if (e.type.indexOf('touch') === -1) { + e.preventDefault(); + } + var fieldRect = _this.__saturation_field.getBoundingClientRect(); + var _ref = e.touches && e.touches[0] || e, + clientX = _ref.clientX, + clientY = _ref.clientY; + var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left); + var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); + if (v > 1) { + v = 1; + } else if (v < 0) { + v = 0; + } + if (s > 1) { + s = 1; + } else if (s < 0) { + s = 0; + } + _this.__color.v = v; + _this.__color.s = s; + _this.setValue(_this.__color.toOriginal()); + return false; + } + function setH(e) { + if (e.type.indexOf('touch') === -1) { + e.preventDefault(); + } + var fieldRect = _this.__hue_field.getBoundingClientRect(); + var _ref2 = e.touches && e.touches[0] || e, + clientY = _ref2.clientY; + var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); + if (h > 1) { + h = 1; + } else if (h < 0) { + h = 0; + } + _this.__color.h = h * 360; + _this.setValue(_this.__color.toOriginal()); + return false; + } + return _this2; + } + createClass(ColorController, [{ + key: 'updateDisplay', + value: function updateDisplay() { + var i = interpret(this.getValue()); + if (i !== false) { + var mismatch = false; + Common.each(Color.COMPONENTS, function (component) { + if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) { + mismatch = true; + return {}; + } + }, this); + if (mismatch) { + Common.extend(this.__color.__state, i); + } + } + Common.extend(this.__temp.__state, this.__color.__state); + this.__temp.a = 1; + var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0; + var _flip = 255 - flip; + Common.extend(this.__field_knob.style, { + marginLeft: 100 * this.__color.s - 7 + 'px', + marginTop: 100 * (1 - this.__color.v) - 7 + 'px', + backgroundColor: this.__temp.toHexString(), + border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')' + }); + this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'; + this.__temp.s = 1; + this.__temp.v = 1; + linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString()); + this.__input.value = this.__color.toString(); + Common.extend(this.__input.style, { + backgroundColor: this.__color.toHexString(), + color: 'rgb(' + flip + ',' + flip + ',' + flip + ')', + textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)' + }); + } + }]); + return ColorController; +}(Controller); +var vendors = ['-moz-', '-o-', '-webkit-', '-ms-', '']; +function linearGradient(elem, x, a, b) { + elem.style.background = ''; + Common.each(vendors, function (vendor) { + elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); '; + }); +} +function hueGradient(elem) { + elem.style.background = ''; + elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'; + elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; +} + +var css = { + load: function load(url, indoc) { + var doc = indoc || document; + var link = doc.createElement('link'); + link.type = 'text/css'; + link.rel = 'stylesheet'; + link.href = url; + doc.getElementsByTagName('head')[0].appendChild(link); + }, + inject: function inject(cssContent, indoc) { + var doc = indoc || document; + var injected = document.createElement('style'); + injected.type = 'text/css'; + injected.innerHTML = cssContent; + var head = doc.getElementsByTagName('head')[0]; + try { + head.appendChild(injected); + } catch (e) { + } + } +}; + +var saveDialogContents = "
\n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n
"; + +var ControllerFactory = function ControllerFactory(object, property) { + var initialValue = object[property]; + if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) { + return new OptionController(object, property, arguments[2]); + } + if (Common.isNumber(initialValue)) { + if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) { + if (Common.isNumber(arguments[4])) { + return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]); + } + return new NumberControllerSlider(object, property, arguments[2], arguments[3]); + } + if (Common.isNumber(arguments[4])) { + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] }); + } + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); + } + if (Common.isString(initialValue)) { + return new StringController(object, property); + } + if (Common.isFunction(initialValue)) { + return new FunctionController(object, property, ''); + } + if (Common.isBoolean(initialValue)) { + return new BooleanController(object, property); + } + return null; +}; + +function requestAnimationFrame(callback) { + setTimeout(callback, 1000 / 60); +} +var requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame; + +var CenteredDiv = function () { + function CenteredDiv() { + classCallCheck(this, CenteredDiv); + this.backgroundElement = document.createElement('div'); + Common.extend(this.backgroundElement.style, { + backgroundColor: 'rgba(0,0,0,0.8)', + top: 0, + left: 0, + display: 'none', + zIndex: '1000', + opacity: 0, + WebkitTransition: 'opacity 0.2s linear', + transition: 'opacity 0.2s linear' + }); + dom.makeFullscreen(this.backgroundElement); + this.backgroundElement.style.position = 'fixed'; + this.domElement = document.createElement('div'); + Common.extend(this.domElement.style, { + position: 'fixed', + display: 'none', + zIndex: '1001', + opacity: 0, + WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear', + transition: 'transform 0.2s ease-out, opacity 0.2s linear' + }); + document.body.appendChild(this.backgroundElement); + document.body.appendChild(this.domElement); + var _this = this; + dom.bind(this.backgroundElement, 'click', function () { + _this.hide(); + }); + } + createClass(CenteredDiv, [{ + key: 'show', + value: function show() { + var _this = this; + this.backgroundElement.style.display = 'block'; + this.domElement.style.display = 'block'; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + this.layout(); + Common.defer(function () { + _this.backgroundElement.style.opacity = 1; + _this.domElement.style.opacity = 1; + _this.domElement.style.webkitTransform = 'scale(1)'; + }); + } + }, { + key: 'hide', + value: function hide() { + var _this = this; + var hide = function hide() { + _this.domElement.style.display = 'none'; + _this.backgroundElement.style.display = 'none'; + dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); + dom.unbind(_this.domElement, 'transitionend', hide); + dom.unbind(_this.domElement, 'oTransitionEnd', hide); + }; + dom.bind(this.domElement, 'webkitTransitionEnd', hide); + dom.bind(this.domElement, 'transitionend', hide); + dom.bind(this.domElement, 'oTransitionEnd', hide); + this.backgroundElement.style.opacity = 0; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + } + }, { + key: 'layout', + value: function layout() { + this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px'; + this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px'; + } + }]); + return CenteredDiv; +}(); + +var styleSheet = ___$insertStyle(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"); + +css.inject(styleSheet); +var CSS_NAMESPACE = 'dg'; +var HIDE_KEY_CODE = 72; +var CLOSE_BUTTON_HEIGHT = 20; +var DEFAULT_DEFAULT_PRESET_NAME = 'Default'; +var SUPPORTS_LOCAL_STORAGE = function () { + try { + return !!window.localStorage; + } catch (e) { + return false; + } +}(); +var SAVE_DIALOGUE = void 0; +var autoPlaceVirgin = true; +var autoPlaceContainer = void 0; +var hide = false; +var hideableGuis = []; +var GUI = function GUI(pars) { + var _this = this; + var params = pars || {}; + this.domElement = document.createElement('div'); + this.__ul = document.createElement('ul'); + this.domElement.appendChild(this.__ul); + dom.addClass(this.domElement, CSS_NAMESPACE); + this.__folders = {}; + this.__controllers = []; + this.__rememberedObjects = []; + this.__rememberedObjectIndecesToControllers = []; + this.__listening = []; + params = Common.defaults(params, { + closeOnTop: false, + autoPlace: true, + width: GUI.DEFAULT_WIDTH + }); + params = Common.defaults(params, { + resizable: params.autoPlace, + hideable: params.autoPlace + }); + if (!Common.isUndefined(params.load)) { + if (params.preset) { + params.load.preset = params.preset; + } + } else { + params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; + } + if (Common.isUndefined(params.parent) && params.hideable) { + hideableGuis.push(this); + } + params.resizable = Common.isUndefined(params.parent) && params.resizable; + if (params.autoPlace && Common.isUndefined(params.scrollable)) { + params.scrollable = true; + } + var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; + var saveToLocalStorage = void 0; + var titleRow = void 0; + Object.defineProperties(this, + { + parent: { + get: function get$$1() { + return params.parent; + } + }, + scrollable: { + get: function get$$1() { + return params.scrollable; + } + }, + autoPlace: { + get: function get$$1() { + return params.autoPlace; + } + }, + closeOnTop: { + get: function get$$1() { + return params.closeOnTop; + } + }, + preset: { + get: function get$$1() { + if (_this.parent) { + return _this.getRoot().preset; + } + return params.load.preset; + }, + set: function set$$1(v) { + if (_this.parent) { + _this.getRoot().preset = v; + } else { + params.load.preset = v; + } + setPresetSelectIndex(this); + _this.revert(); + } + }, + width: { + get: function get$$1() { + return params.width; + }, + set: function set$$1(v) { + params.width = v; + setWidth(_this, v); + } + }, + name: { + get: function get$$1() { + return params.name; + }, + set: function set$$1(v) { + params.name = v; + if (titleRow) { + titleRow.innerHTML = params.name; + } + } + }, + closed: { + get: function get$$1() { + return params.closed; + }, + set: function set$$1(v) { + params.closed = v; + if (params.closed) { + dom.addClass(_this.__ul, GUI.CLASS_CLOSED); + } else { + dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); + } + this.onResize(); + if (_this.__closeButton) { + _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; + } + } + }, + load: { + get: function get$$1() { + return params.load; + } + }, + useLocalStorage: { + get: function get$$1() { + return useLocalStorage; + }, + set: function set$$1(bool) { + if (SUPPORTS_LOCAL_STORAGE) { + useLocalStorage = bool; + if (bool) { + dom.bind(window, 'unload', saveToLocalStorage); + } else { + dom.unbind(window, 'unload', saveToLocalStorage); + } + localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); + } + } + } + }); + if (Common.isUndefined(params.parent)) { + this.closed = params.closed || false; + dom.addClass(this.domElement, GUI.CLASS_MAIN); + dom.makeSelectable(this.domElement, false); + if (SUPPORTS_LOCAL_STORAGE) { + if (useLocalStorage) { + _this.useLocalStorage = true; + var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui')); + if (savedGui) { + params.load = JSON.parse(savedGui); + } + } + } + this.__closeButton = document.createElement('div'); + this.__closeButton.innerHTML = GUI.TEXT_CLOSED; + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); + if (params.closeOnTop) { + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP); + this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]); + } else { + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM); + this.domElement.appendChild(this.__closeButton); + } + dom.bind(this.__closeButton, 'click', function () { + _this.closed = !_this.closed; + }); + } else { + if (params.closed === undefined) { + params.closed = true; + } + var titleRowName = document.createTextNode(params.name); + dom.addClass(titleRowName, 'controller-name'); + titleRow = addRow(_this, titleRowName); + var onClickTitle = function onClickTitle(e) { + e.preventDefault(); + _this.closed = !_this.closed; + return false; + }; + dom.addClass(this.__ul, GUI.CLASS_CLOSED); + dom.addClass(titleRow, 'title'); + dom.bind(titleRow, 'click', onClickTitle); + if (!params.closed) { + this.closed = false; + } + } + if (params.autoPlace) { + if (Common.isUndefined(params.parent)) { + if (autoPlaceVirgin) { + autoPlaceContainer = document.createElement('div'); + dom.addClass(autoPlaceContainer, CSS_NAMESPACE); + dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER); + document.body.appendChild(autoPlaceContainer); + autoPlaceVirgin = false; + } + autoPlaceContainer.appendChild(this.domElement); + dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); + } + if (!this.parent) { + setWidth(_this, params.width); + } + } + this.__resizeHandler = function () { + _this.onResizeDebounced(); + }; + dom.bind(window, 'resize', this.__resizeHandler); + dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler); + dom.bind(this.__ul, 'transitionend', this.__resizeHandler); + dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler); + this.onResize(); + if (params.resizable) { + addResizeHandle(this); + } + saveToLocalStorage = function saveToLocalStorage() { + if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') { + localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); + } + }; + this.saveToLocalStorageIfPossible = saveToLocalStorage; + function resetWidth() { + var root = _this.getRoot(); + root.width += 1; + Common.defer(function () { + root.width -= 1; + }); + } + if (!params.parent) { + resetWidth(); + } +}; +GUI.toggleHide = function () { + hide = !hide; + Common.each(hideableGuis, function (gui) { + gui.domElement.style.display = hide ? 'none' : ''; + }); +}; +GUI.CLASS_AUTO_PLACE = 'a'; +GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; +GUI.CLASS_MAIN = 'main'; +GUI.CLASS_CONTROLLER_ROW = 'cr'; +GUI.CLASS_TOO_TALL = 'taller-than-window'; +GUI.CLASS_CLOSED = 'closed'; +GUI.CLASS_CLOSE_BUTTON = 'close-button'; +GUI.CLASS_CLOSE_TOP = 'close-top'; +GUI.CLASS_CLOSE_BOTTOM = 'close-bottom'; +GUI.CLASS_DRAG = 'drag'; +GUI.DEFAULT_WIDTH = 245; +GUI.TEXT_CLOSED = 'Close Controls'; +GUI.TEXT_OPEN = 'Open Controls'; +GUI._keydownHandler = function (e) { + if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) { + GUI.toggleHide(); + } +}; +dom.bind(window, 'keydown', GUI._keydownHandler, false); +Common.extend(GUI.prototype, +{ + add: function add(object, property) { + return _add(this, object, property, { + factoryArgs: Array.prototype.slice.call(arguments, 2) + }); + }, + addColor: function addColor(object, property) { + return _add(this, object, property, { + color: true + }); + }, + remove: function remove(controller) { + this.__ul.removeChild(controller.__li); + this.__controllers.splice(this.__controllers.indexOf(controller), 1); + var _this = this; + Common.defer(function () { + _this.onResize(); + }); + }, + destroy: function destroy() { + if (this.parent) { + throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.'); + } + if (this.autoPlace) { + autoPlaceContainer.removeChild(this.domElement); + } + var _this = this; + Common.each(this.__folders, function (subfolder) { + _this.removeFolder(subfolder); + }); + dom.unbind(window, 'keydown', GUI._keydownHandler, false); + removeListeners(this); + }, + addFolder: function addFolder(name) { + if (this.__folders[name] !== undefined) { + throw new Error('You already have a folder in this GUI by the' + ' name "' + name + '"'); + } + var newGuiParams = { name: name, parent: this }; + newGuiParams.autoPlace = this.autoPlace; + if (this.load && + this.load.folders && + this.load.folders[name]) { + newGuiParams.closed = this.load.folders[name].closed; + newGuiParams.load = this.load.folders[name]; + } + var gui = new GUI(newGuiParams); + this.__folders[name] = gui; + var li = addRow(this, gui.domElement); + dom.addClass(li, 'folder'); + return gui; + }, + removeFolder: function removeFolder(folder) { + this.__ul.removeChild(folder.domElement.parentElement); + delete this.__folders[folder.name]; + if (this.load && + this.load.folders && + this.load.folders[folder.name]) { + delete this.load.folders[folder.name]; + } + removeListeners(folder); + var _this = this; + Common.each(folder.__folders, function (subfolder) { + folder.removeFolder(subfolder); + }); + Common.defer(function () { + _this.onResize(); + }); + }, + open: function open() { + this.closed = false; + }, + close: function close() { + this.closed = true; + }, + hide: function hide() { + this.domElement.style.display = 'none'; + }, + show: function show() { + this.domElement.style.display = ''; + }, + onResize: function onResize() { + var root = this.getRoot(); + if (root.scrollable) { + var top = dom.getOffset(root.__ul).top; + var h = 0; + Common.each(root.__ul.childNodes, function (node) { + if (!(root.autoPlace && node === root.__save_row)) { + h += dom.getHeight(node); + } + }); + if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { + dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; + } else { + dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = 'auto'; + } + } + if (root.__resize_handle) { + Common.defer(function () { + root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; + }); + } + if (root.__closeButton) { + root.__closeButton.style.width = root.width + 'px'; + } + }, + onResizeDebounced: Common.debounce(function () { + this.onResize(); + }, 50), + remember: function remember() { + if (Common.isUndefined(SAVE_DIALOGUE)) { + SAVE_DIALOGUE = new CenteredDiv(); + SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents; + } + if (this.parent) { + throw new Error('You can only call remember on a top level GUI.'); + } + var _this = this; + Common.each(Array.prototype.slice.call(arguments), function (object) { + if (_this.__rememberedObjects.length === 0) { + addSaveMenu(_this); + } + if (_this.__rememberedObjects.indexOf(object) === -1) { + _this.__rememberedObjects.push(object); + } + }); + if (this.autoPlace) { + setWidth(this, this.width); + } + }, + getRoot: function getRoot() { + var gui = this; + while (gui.parent) { + gui = gui.parent; + } + return gui; + }, + getSaveObject: function getSaveObject() { + var toReturn = this.load; + toReturn.closed = this.closed; + if (this.__rememberedObjects.length > 0) { + toReturn.preset = this.preset; + if (!toReturn.remembered) { + toReturn.remembered = {}; + } + toReturn.remembered[this.preset] = getCurrentPreset(this); + } + toReturn.folders = {}; + Common.each(this.__folders, function (element, key) { + toReturn.folders[key] = element.getSaveObject(); + }); + return toReturn; + }, + save: function save() { + if (!this.load.remembered) { + this.load.remembered = {}; + } + this.load.remembered[this.preset] = getCurrentPreset(this); + markPresetModified(this, false); + this.saveToLocalStorageIfPossible(); + }, + saveAs: function saveAs(presetName) { + if (!this.load.remembered) { + this.load.remembered = {}; + this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); + } + this.load.remembered[presetName] = getCurrentPreset(this); + this.preset = presetName; + addPresetOption(this, presetName, true); + this.saveToLocalStorageIfPossible(); + }, + revert: function revert(gui) { + Common.each(this.__controllers, function (controller) { + if (!this.getRoot().load.remembered) { + controller.setValue(controller.initialValue); + } else { + recallSavedValue(gui || this.getRoot(), controller); + } + if (controller.__onFinishChange) { + controller.__onFinishChange.call(controller, controller.getValue()); + } + }, this); + Common.each(this.__folders, function (folder) { + folder.revert(folder); + }); + if (!gui) { + markPresetModified(this.getRoot(), false); + } + }, + listen: function listen(controller) { + var init = this.__listening.length === 0; + this.__listening.push(controller); + if (init) { + updateDisplays(this.__listening); + } + }, + updateDisplay: function updateDisplay() { + Common.each(this.__controllers, function (controller) { + controller.updateDisplay(); + }); + Common.each(this.__folders, function (folder) { + folder.updateDisplay(); + }); + } +}); +function addRow(gui, newDom, liBefore) { + var li = document.createElement('li'); + if (newDom) { + li.appendChild(newDom); + } + if (liBefore) { + gui.__ul.insertBefore(li, liBefore); + } else { + gui.__ul.appendChild(li); + } + gui.onResize(); + return li; +} +function removeListeners(gui) { + dom.unbind(window, 'resize', gui.__resizeHandler); + if (gui.saveToLocalStorageIfPossible) { + dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible); + } +} +function markPresetModified(gui, modified) { + var opt = gui.__preset_select[gui.__preset_select.selectedIndex]; + if (modified) { + opt.innerHTML = opt.value + '*'; + } else { + opt.innerHTML = opt.value; + } +} +function augmentController(gui, li, controller) { + controller.__li = li; + controller.__gui = gui; + Common.extend(controller, { + options: function options(_options) { + if (arguments.length > 1) { + var nextSibling = controller.__li.nextElementSibling; + controller.remove(); + return _add(gui, controller.object, controller.property, { + before: nextSibling, + factoryArgs: [Common.toArray(arguments)] + }); + } + if (Common.isArray(_options) || Common.isObject(_options)) { + var _nextSibling = controller.__li.nextElementSibling; + controller.remove(); + return _add(gui, controller.object, controller.property, { + before: _nextSibling, + factoryArgs: [_options] + }); + } + }, + name: function name(_name) { + controller.__li.firstElementChild.firstElementChild.innerHTML = _name; + return controller; + }, + listen: function listen() { + controller.__gui.listen(controller); + return controller; + }, + remove: function remove() { + controller.__gui.remove(controller); + return controller; + } + }); + if (controller instanceof NumberControllerSlider) { + var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step }); + Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) { + var pc = controller[method]; + var pb = box[method]; + controller[method] = box[method] = function () { + var args = Array.prototype.slice.call(arguments); + pb.apply(box, args); + return pc.apply(controller, args); + }; + }); + dom.addClass(li, 'has-slider'); + controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); + } else if (controller instanceof NumberControllerBox) { + var r = function r(returned) { + if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) { + var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML; + var wasListening = controller.__gui.__listening.indexOf(controller) > -1; + controller.remove(); + var newController = _add(gui, controller.object, controller.property, { + before: controller.__li.nextElementSibling, + factoryArgs: [controller.__min, controller.__max, controller.__step] + }); + newController.name(oldName); + if (wasListening) newController.listen(); + return newController; + } + return returned; + }; + controller.min = Common.compose(r, controller.min); + controller.max = Common.compose(r, controller.max); + } else if (controller instanceof BooleanController) { + dom.bind(li, 'click', function () { + dom.fakeEvent(controller.__checkbox, 'click'); + }); + dom.bind(controller.__checkbox, 'click', function (e) { + e.stopPropagation(); + }); + } else if (controller instanceof FunctionController) { + dom.bind(li, 'click', function () { + dom.fakeEvent(controller.__button, 'click'); + }); + dom.bind(li, 'mouseover', function () { + dom.addClass(controller.__button, 'hover'); + }); + dom.bind(li, 'mouseout', function () { + dom.removeClass(controller.__button, 'hover'); + }); + } else if (controller instanceof ColorController) { + dom.addClass(li, 'color'); + controller.updateDisplay = Common.compose(function (val) { + li.style.borderLeftColor = controller.__color.toString(); + return val; + }, controller.updateDisplay); + controller.updateDisplay(); + } + controller.setValue = Common.compose(function (val) { + if (gui.getRoot().__preset_select && controller.isModified()) { + markPresetModified(gui.getRoot(), true); + } + return val; + }, controller.setValue); +} +function recallSavedValue(gui, controller) { + var root = gui.getRoot(); + var matchedIndex = root.__rememberedObjects.indexOf(controller.object); + if (matchedIndex !== -1) { + var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex]; + if (controllerMap === undefined) { + controllerMap = {}; + root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap; + } + controllerMap[controller.property] = controller; + if (root.load && root.load.remembered) { + var presetMap = root.load.remembered; + var preset = void 0; + if (presetMap[gui.preset]) { + preset = presetMap[gui.preset]; + } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) { + preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME]; + } else { + return; + } + if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) { + var value = preset[matchedIndex][controller.property]; + controller.initialValue = value; + controller.setValue(value); + } + } + } +} +function _add(gui, object, property, params) { + if (object[property] === undefined) { + throw new Error('Object "' + object + '" has no property "' + property + '"'); + } + var controller = void 0; + if (params.color) { + controller = new ColorController(object, property); + } else { + var factoryArgs = [object, property].concat(params.factoryArgs); + controller = ControllerFactory.apply(gui, factoryArgs); + } + if (params.before instanceof Controller) { + params.before = params.before.__li; + } + recallSavedValue(gui, controller); + dom.addClass(controller.domElement, 'c'); + var name = document.createElement('span'); + dom.addClass(name, 'property-name'); + name.innerHTML = controller.property; + var container = document.createElement('div'); + container.appendChild(name); + container.appendChild(controller.domElement); + var li = addRow(gui, container, params.before); + dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); + if (controller instanceof ColorController) { + dom.addClass(li, 'color'); + } else { + dom.addClass(li, _typeof(controller.getValue())); + } + augmentController(gui, li, controller); + gui.__controllers.push(controller); + return controller; +} +function getLocalStorageHash(gui, key) { + return document.location.href + '.' + key; +} +function addPresetOption(gui, name, setSelected) { + var opt = document.createElement('option'); + opt.innerHTML = name; + opt.value = name; + gui.__preset_select.appendChild(opt); + if (setSelected) { + gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; + } +} +function showHideExplain(gui, explain) { + explain.style.display = gui.useLocalStorage ? 'block' : 'none'; +} +function addSaveMenu(gui) { + var div = gui.__save_row = document.createElement('li'); + dom.addClass(gui.domElement, 'has-save'); + gui.__ul.insertBefore(div, gui.__ul.firstChild); + dom.addClass(div, 'save-row'); + var gears = document.createElement('span'); + gears.innerHTML = ' '; + dom.addClass(gears, 'button gears'); + var button = document.createElement('span'); + button.innerHTML = 'Save'; + dom.addClass(button, 'button'); + dom.addClass(button, 'save'); + var button2 = document.createElement('span'); + button2.innerHTML = 'New'; + dom.addClass(button2, 'button'); + dom.addClass(button2, 'save-as'); + var button3 = document.createElement('span'); + button3.innerHTML = 'Revert'; + dom.addClass(button3, 'button'); + dom.addClass(button3, 'revert'); + var select = gui.__preset_select = document.createElement('select'); + if (gui.load && gui.load.remembered) { + Common.each(gui.load.remembered, function (value, key) { + addPresetOption(gui, key, key === gui.preset); + }); + } else { + addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); + } + dom.bind(select, 'change', function () { + for (var index = 0; index < gui.__preset_select.length; index++) { + gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; + } + gui.preset = this.value; + }); + div.appendChild(select); + div.appendChild(gears); + div.appendChild(button); + div.appendChild(button2); + div.appendChild(button3); + if (SUPPORTS_LOCAL_STORAGE) { + var explain = document.getElementById('dg-local-explain'); + var localStorageCheckBox = document.getElementById('dg-local-storage'); + var saveLocally = document.getElementById('dg-save-locally'); + saveLocally.style.display = 'block'; + if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { + localStorageCheckBox.setAttribute('checked', 'checked'); + } + showHideExplain(gui, explain); + dom.bind(localStorageCheckBox, 'change', function () { + gui.useLocalStorage = !gui.useLocalStorage; + showHideExplain(gui, explain); + }); + } + var newConstructorTextArea = document.getElementById('dg-new-constructor'); + dom.bind(newConstructorTextArea, 'keydown', function (e) { + if (e.metaKey && (e.which === 67 || e.keyCode === 67)) { + SAVE_DIALOGUE.hide(); + } + }); + dom.bind(gears, 'click', function () { + newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); + SAVE_DIALOGUE.show(); + newConstructorTextArea.focus(); + newConstructorTextArea.select(); + }); + dom.bind(button, 'click', function () { + gui.save(); + }); + dom.bind(button2, 'click', function () { + var presetName = prompt('Enter a new preset name.'); + if (presetName) { + gui.saveAs(presetName); + } + }); + dom.bind(button3, 'click', function () { + gui.revert(); + }); +} +function addResizeHandle(gui) { + var pmouseX = void 0; + gui.__resize_handle = document.createElement('div'); + Common.extend(gui.__resize_handle.style, { + width: '6px', + marginLeft: '-3px', + height: '200px', + cursor: 'ew-resize', + position: 'absolute' + }); + function drag(e) { + e.preventDefault(); + gui.width += pmouseX - e.clientX; + gui.onResize(); + pmouseX = e.clientX; + return false; + } + function dragStop() { + dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.unbind(window, 'mousemove', drag); + dom.unbind(window, 'mouseup', dragStop); + } + function dragStart(e) { + e.preventDefault(); + pmouseX = e.clientX; + dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.bind(window, 'mousemove', drag); + dom.bind(window, 'mouseup', dragStop); + return false; + } + dom.bind(gui.__resize_handle, 'mousedown', dragStart); + dom.bind(gui.__closeButton, 'mousedown', dragStart); + gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); +} +function setWidth(gui, w) { + gui.domElement.style.width = w + 'px'; + if (gui.__save_row && gui.autoPlace) { + gui.__save_row.style.width = w + 'px'; + } + if (gui.__closeButton) { + gui.__closeButton.style.width = w + 'px'; + } +} +function getCurrentPreset(gui, useInitialValues) { + var toReturn = {}; + Common.each(gui.__rememberedObjects, function (val, index) { + var savedValues = {}; + var controllerMap = gui.__rememberedObjectIndecesToControllers[index]; + Common.each(controllerMap, function (controller, property) { + savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue(); + }); + toReturn[index] = savedValues; + }); + return toReturn; +} +function setPresetSelectIndex(gui) { + for (var index = 0; index < gui.__preset_select.length; index++) { + if (gui.__preset_select[index].value === gui.preset) { + gui.__preset_select.selectedIndex = index; + } + } +} +function updateDisplays(controllerArray) { + if (controllerArray.length !== 0) { + requestAnimationFrame$1.call(window, function () { + updateDisplays(controllerArray); + }); + } + Common.each(controllerArray, function (c) { + c.updateDisplay(); + }); +} + +var color = { + Color: Color, + math: ColorMath, + interpret: interpret +}; +var controllers = { + Controller: Controller, + BooleanController: BooleanController, + OptionController: OptionController, + StringController: StringController, + NumberController: NumberController, + NumberControllerBox: NumberControllerBox, + NumberControllerSlider: NumberControllerSlider, + FunctionController: FunctionController, + ColorController: ColorController +}; +var dom$1 = { dom: dom }; +var gui = { GUI: GUI }; +var GUI$1 = GUI; +var index = { + color: color, + controllers: controllers, + dom: dom$1, + gui: gui, + GUI: GUI$1 +}; + +export { color, controllers, dom$1 as dom, gui, GUI$1 as GUI }; +export default index; +//# sourceMappingURL=dat.gui.module.js.map diff --git a/build/dat.gui.module.js.map b/build/dat.gui.module.js.map new file mode 100644 index 000000000..15c522a3f --- /dev/null +++ b/build/dat.gui.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dat.gui.module.js","sources":["../src/dat/color/toString.js","../src/dat/utils/common.js","../src/dat/color/interpret.js","../src/dat/color/math.js","../src/dat/color/Color.js","../src/dat/controllers/Controller.js","../src/dat/dom/dom.js","../src/dat/controllers/BooleanController.js","../src/dat/controllers/OptionController.js","../src/dat/controllers/StringController.js","../src/dat/controllers/NumberController.js","../src/dat/controllers/NumberControllerBox.js","../src/dat/controllers/NumberControllerSlider.js","../src/dat/controllers/FunctionController.js","../src/dat/controllers/ColorController.js","../src/dat/utils/css.js","../src/dat/gui/saveDialogue.html.js","../src/dat/controllers/ControllerFactory.js","../src/dat/utils/requestAnimationFrame.js","../src/dat/dom/CenteredDiv.js","../src/dat/gui/GUI.js","../src/dat/index.js"],"sourcesContent":["/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nexport default function(color, forceCSSHex) {\n const colorFormat = color.__state.conversionName.toString();\n\n const r = Math.round(color.r);\n const g = Math.round(color.g);\n const b = Math.round(color.b);\n const a = color.a;\n const h = Math.round(color.h);\n const s = color.s.toFixed(1);\n const v = color.v.toFixed(1);\n\n if (forceCSSHex || (colorFormat === 'THREE_CHAR_HEX') || (colorFormat === 'SIX_CHAR_HEX')) {\n let str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n\n return 'unknown format';\n}\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nconst ARR_EACH = Array.prototype.forEach;\nconst ARR_SLICE = Array.prototype.slice;\n\n/**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\nconst Common = {\n BREAK: {},\n\n extend: function(target) {\n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n const keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function(key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n\n return target;\n },\n\n defaults: function(target) {\n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n const keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function(key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n\n return target;\n },\n\n compose: function() {\n const toCall = ARR_SLICE.call(arguments);\n return function() {\n let args = ARR_SLICE.call(arguments);\n for (let i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n\n each: function(obj, itr, scope) {\n if (!obj) {\n return;\n }\n\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n let key;\n let l;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (const key in obj) {\n if (itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n }\n },\n\n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n\n // if the function is called repeatedly, wait until threshold passes until we execute the function\n debounce: function(func, threshold, callImmediately) {\n let timeout;\n\n return function() {\n const obj = this;\n const args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n\n const callNow = callImmediately || !timeout;\n\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n\n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n\n isNull: function(obj) {\n return obj === null;\n },\n\n isNaN: function(obj) {\n return isNaN(obj);\n },\n\n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n\n isObject: function(obj) {\n return obj === Object(obj);\n },\n\n isNumber: function(obj) {\n return obj === obj + 0;\n },\n\n isString: function(obj) {\n return obj === obj + '';\n },\n\n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n\n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n\n};\n\nexport default Common;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport toString from './toString';\nimport common from '../utils/common';\n\nconst INTERPRETATIONS = [\n // Strings\n {\n litmus: common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function(original) {\n const test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString(), 0)\n };\n },\n\n write: toString\n },\n\n SIX_CHAR_HEX: {\n read: function(original) {\n const test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n\n write: toString\n },\n\n CSS_RGB: {\n read: function(original) {\n const test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n\n write: toString\n },\n\n CSS_RGBA: {\n read: function(original) {\n const test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n\n write: toString\n }\n }\n },\n\n // Numbers\n {\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n litmus: common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function(original) {\n if (original.length !== 3) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n },\n\n // Objects\n {\n litmus: common.isObject,\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n }\n];\n\nlet result;\nlet toReturn;\n\nconst interpret = function() {\n toReturn = false;\n\n const original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n common.each(INTERPRETATIONS, function(family) {\n if (family.litmus(original)) {\n common.each(family.conversions, function(conversion, conversionName) {\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n }\n });\n\n return common.BREAK;\n }\n });\n\n return toReturn;\n};\n\nexport default interpret;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nlet tmpComponent;\n\nconst ColorMath = {\n hsv_to_rgb: function(h, s, v) {\n const hi = Math.floor(h / 60) % 6;\n\n const f = h / 60 - Math.floor(h / 60);\n const p = v * (1.0 - s);\n const q = v * (1.0 - (f * s));\n const t = v * (1.0 - ((1.0 - f) * s));\n\n const c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n\n rgb_to_hsv: function(r, g, b) {\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n const delta = max - min;\n let h;\n let s;\n\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n let hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~(0xFF << tmpComponent));\n }\n};\n\nexport default ColorMath;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport interpret from './interpret';\nimport math from './math';\nimport colorToString from './toString';\nimport common from '../utils/common';\n\nclass Color {\n constructor() {\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n\n this.__state.a = this.__state.a || 1;\n }\n\n toString() {\n return colorToString(this);\n }\n\n toHexString() {\n return colorToString(this, true);\n }\n\n toOriginal() {\n return this.__state.conversion.write(this);\n }\n}\n\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n Color.recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n },\n\n set: function(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n }\n });\n}\n\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n\n Color.recalculateHSV(this);\n\n return this.__state[component];\n },\n\n set: function(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n }\n });\n}\n\n\nColor.recalculateRGB = function(color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\n\nColor.recalculateHSV = function(color) {\n const result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\n\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\n\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\n\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\n\nObject.defineProperty(Color.prototype, 'a', {\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n});\n\nObject.defineProperty(Color.prototype, 'hex', {\n get: function() {\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n },\n\n set: function(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nexport default Color;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass Controller {\n constructor(object, property) {\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n }\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {Controller} this\n */\n onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {Controller} this\n */\n onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n\n this.updateDisplay();\n return this;\n }\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue() {\n return this.object[this.property];\n }\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {Controller} this\n */\n updateDisplay() {\n return this;\n }\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified() {\n return this.initialValue !== this.getValue();\n }\n}\n\nexport default Controller;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport common from '../utils/common';\n\nconst EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\n\nconst EVENT_MAP_INV = {};\ncommon.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n});\n\nconst CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\nfunction cssValueToPixels(val) {\n if (val === '0' || common.isUndefined(val)) {\n return 0;\n }\n\n const match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n}\n\n/**\n * @namespace\n * @member dat.dom\n */\nconst dom = {\n\n /**\n *\n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vert\n */\n makeFullscreen: function(elem, hor, vert) {\n let vertical = vert;\n let horizontal = hor;\n\n if (common.isUndefined(horizontal)) {\n horizontal = true;\n }\n\n if (common.isUndefined(vertical)) {\n vertical = true;\n }\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, pars, aux) {\n const params = pars || {};\n const className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n const evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n const clientX = params.x || params.clientX || 0;\n const clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, // screen X\n 0, // screen Y\n clientX, // client X\n clientY, // client Y\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n const init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, newBool) {\n const bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, newBool) {\n const bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n const classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n const classes = elem.className.split(/ +/);\n const index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n const style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style.width);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n const style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style.height);\n },\n\n /**\n *\n * @param el\n */\n getOffset: function(el) {\n let elem = el;\n const offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n *\n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n\n};\n\nexport default dom;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a checkbox input to alter the boolean property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass BooleanController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n const _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n }\n\n setValue(v) {\n const toReturn = super.setValue(v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n\n updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n\n return super.updateDisplay();\n }\n}\n\nexport default BooleanController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\n/**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n */\nclass OptionController extends Controller {\n constructor(object, property, opts) {\n super(object, property);\n\n let options = opts;\n\n const _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n const map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n const opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n const desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n }\n\n setValue(v) {\n const toReturn = super.setValue(v);\n\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n\n updateDisplay() {\n if (dom.isActive(this.__select)) return this; // prevent number from updating if user is trying to manually update\n this.__select.value = this.getValue();\n return super.updateDisplay();\n }\n}\n\nexport default OptionController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass StringController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n const _this = this;\n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n }\n\n updateDisplay() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return super.updateDisplay();\n }\n}\n\nexport default StringController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport common from '../utils/common';\n\nfunction numDecimals(x) {\n const _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n\n return 0;\n}\n\n/**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n */\nclass NumberController extends Controller {\n constructor(object, property, params) {\n super(object, property);\n\n const _params = params || {};\n\n this.__min = _params.min;\n this.__max = _params.max;\n this.__step = _params.step;\n\n if (common.isUndefined(this.__step)) {\n if (this.initialValue === 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n this.__impliedStep = this.__step;\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n }\n\n setValue(v) {\n let _v = v;\n\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n\n return super.setValue(_v);\n }\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min(minValue) {\n this.__min = minValue;\n return this;\n }\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n}\n\nexport default NumberController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport NumberController from './NumberController';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nfunction roundToDecimal(value, decimals) {\n const tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\n\n/**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n */\nclass NumberControllerBox extends NumberController {\n constructor(object, property, params) {\n super(object, property, params);\n\n this.__truncationSuspended = false;\n\n const _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n let prevY;\n\n function onChange() {\n const attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onBlur() {\n onFinish();\n }\n\n function onMouseDrag(e) {\n const diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prevY = e.clientY;\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n // When pressing enter, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n }\n\n updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return super.updateDisplay();\n }\n}\n\nexport default NumberControllerBox;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport NumberController from './NumberController';\nimport dom from '../dom/dom';\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\n\n/**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n */\nclass NumberControllerSlider extends NumberController {\n constructor(object, property, min, max, step) {\n super(object, property, { min: min, max: max, step: step });\n\n const _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n dom.bind(this.__background, 'touchstart', onTouchStart);\n\n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n document.activeElement.blur();\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n e.preventDefault();\n\n const bgRect = _this.__background.getBoundingClientRect();\n\n _this.setValue(\n map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)\n );\n\n return false;\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onTouchStart(e) {\n if (e.touches.length !== 1) { return; }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n\n function onTouchMove(e) {\n const clientX = e.touches[0].clientX;\n const bgRect = _this.__background.getBoundingClientRect();\n\n _this.setValue(\n map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)\n );\n }\n\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n }\n\n updateDisplay() {\n const pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return super.updateDisplay();\n }\n}\n\nexport default NumberControllerSlider;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass FunctionController extends Controller {\n constructor(object, property, text) {\n super(object, property);\n\n const _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n }\n\n fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n}\n\nexport default FunctionController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\nimport Color from '../color/Color';\nimport interpret from '../color/interpret';\nimport common from '../utils/common';\n\n/**\n * @class Represents a given property of an object that is a color.\n * @param {Object} object\n * @param {string} property\n */\nclass ColorController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n const _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(/* e */) {\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(/* e */) {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n\n dom.bind(this.__selector, 'touchstart', function(/* e */) {\n dom\n .addClass(this, 'drag')\n .bind(window, 'touchend', function(/* e */) {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n\n const valueField = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n\n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__saturation_field, 'touchstart', fieldDown);\n\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'touchstart', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', fieldDownH);\n dom.bind(this.__hue_field, 'touchstart', fieldDownH);\n\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n\n function onBlur() {\n const i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n\n this.__saturation_field.appendChild(valueField);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) { e.preventDefault(); }\n\n const fieldRect = _this.__saturation_field.getBoundingClientRect();\n const { clientX, clientY } = (e.touches && e.touches[0]) || e;\n let s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n let v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n }\n\n function setH(e) {\n if (e.type.indexOf('touch') === -1) { e.preventDefault(); }\n\n const fieldRect = _this.__hue_field.getBoundingClientRect();\n const { clientY } = (e.touches && e.touches[0]) || e;\n let h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n }\n }\n\n updateDisplay() {\n const i = interpret(this.getValue());\n\n if (i !== false) {\n let mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) && !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n const flip = (this.__color.v < 0.5 || this.__color.s > 0.5) ? 255 : 0;\n const _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n\n this.__input.value = this.__color.toString();\n\n common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n}\n\nconst vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\n\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\n\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nexport default ColorController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nconst css = {\n load: function(url, indoc) {\n const doc = indoc || document;\n const link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n\n inject: function(cssContent, indoc) {\n const doc = indoc || document;\n const injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n const head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) { // Unable to inject CSS, probably because of a Content Security Policy\n }\n }\n};\n\nexport default css;\n","const saveDialogContents = `
\n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n
`;\n\nexport default saveDialogContents;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport OptionController from './OptionController';\nimport NumberControllerBox from './NumberControllerBox';\nimport NumberControllerSlider from './NumberControllerSlider';\nimport StringController from './StringController';\nimport FunctionController from './FunctionController';\nimport BooleanController from './BooleanController';\nimport common from '../utils/common';\n\nconst ControllerFactory = function(object, property) {\n const initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n if (common.isNumber(initialValue)) {\n // Has min and max? (slider)\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n // has step?\n if (common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property,\n arguments[2], arguments[3], arguments[4]);\n }\n\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n\n // number box\n if (common.isNumber(arguments[4])) { // has step\n return new NumberControllerBox(object, property,\n { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n return null;\n};\n\nexport default ControllerFactory;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\n\nexport default window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n requestAnimationFrame;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nclass CenteredDiv {\n constructor() {\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n const _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n }\n\n show() {\n const _this = this;\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n\n /**\n * Hide centered div\n */\n hide() {\n const _this = this;\n\n const hide = function() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n\n layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n}\n\nexport default CenteredDiv;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport css from '../utils/css';\nimport saveDialogueContents from './saveDialogue.html';\nimport ControllerFactory from '../controllers/ControllerFactory';\nimport Controller from '../controllers/Controller';\nimport BooleanController from '../controllers/BooleanController';\nimport FunctionController from '../controllers/FunctionController';\nimport NumberControllerBox from '../controllers/NumberControllerBox';\nimport NumberControllerSlider from '../controllers/NumberControllerSlider';\nimport ColorController from '../controllers/ColorController';\nimport requestAnimationFrame from '../utils/requestAnimationFrame';\nimport CenteredDiv from '../dom/CenteredDiv';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nimport styleSheet from './style.scss'; // CSS to embed in build\n\ncss.inject(styleSheet);\n\n/** @ignore Outer-most className for GUI's */\nconst CSS_NAMESPACE = 'dg';\n\nconst HIDE_KEY_CODE = 72;\n\n/** @ignore The only value shared between the JS and SCSS. Use caution. */\nconst CLOSE_BUTTON_HEIGHT = 20;\n\nconst DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\nconst SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}());\n\nlet SAVE_DIALOGUE;\n\n/** @ignore Have we yet to create an autoPlace GUI? */\nlet autoPlaceVirgin = true;\n\n/** @ignore Fixed position div that auto place GUI's go inside */\nlet autoPlaceContainer;\n\n/** @ignore Are we hiding the GUI's ? */\nlet hide = false;\n\n/** @private GUI's which should be hidden */\nconst hideableGuis = [];\n\n/**\n * @class A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n *\n * @typicalname gui\n *\n * @example\n * // Creating a GUI with options.\n * var gui = new dat.GUI({name: 'My GUI'});\n *\n * @example\n * // Creating a GUI and a subfolder.\n * var gui = new dat.GUI();\n * var folder1 = gui.addFolder('Flow Field');\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.autoPlace=true]\n * @param {Boolean} [params.hideable=true] If true, GUI is shown/hidden by h keypress.\n * @param {Boolean} [params.closed=false] If true, starts closed\n * @param {Boolean} [params.closeOnTop=false] If true, close/open button shows on top of the GUI\n */\nconst GUI = function(pars) {\n const _this = this;\n\n let params = pars || {};\n\n /**\n * Outermost DOM Element\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n // Default parameters\n params = common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n if (!common.isUndefined(params.load)) {\n // Explicit preset\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n let useLocalStorage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n let saveToLocalStorage;\n let titleRow;\n\n Object.defineProperties(this,\n /** @lends GUI.prototype */\n {\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * Handles GUI's position of open/close button\n * @type Boolean\n */\n closeOnTop: {\n get: function() {\n return params.closeOnTop;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n\n return params.load.preset;\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return useLocalStorage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n\n const savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n\n dom.bind(this.__closeButton, 'click', function() {\n _this.closed = !_this.closed;\n });\n // Oh, you're a nested GUI!\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n const titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n\n titleRow = addRow(_this, titleRowName);\n\n const onClickTitle = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n\n if (!params.closed) {\n this.closed = false;\n }\n }\n\n if (params.autoPlace) {\n if (common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n\n // Put it in the dom for you.\n autoPlaceContainer.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n\n\n // Make it not elastic.\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n\n this.__resizeHandler = function() {\n _this.onResizeDebounced();\n };\n\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n saveToLocalStorage = function() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n\n // expose this method publicly\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n\n function resetWidth() {\n const root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n};\n\nGUI.toggleHide = function() {\n hide = !hide;\n common.each(hideableGuis, function(gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\n\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\n\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\n\nGUI._keydownHandler = function(e) {\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\n\ncommon.extend(\n GUI.prototype,\n\n /** @lends GUI.prototype */\n {\n\n /**\n * Adds a new {@link Controller} to the GUI. The type of controller created\n * is inferred from the initial value of object[property]. For\n * color properties, see {@link addColor}.\n *\n * @param {Object} object The object to be manipulated\n * @param {String} property The name of the property to be manipulated\n * @param {Number} [min] Minimum allowed value\n * @param {Number} [max] Maximum allowed value\n * @param {Number} [step] Increment by which to change value\n * @returns {Controller} The controller that was added to the GUI.\n * @instance\n *\n * @example\n * // Add a string controller.\n * var person = {name: 'Sam'};\n * gui.add(person, 'name');\n *\n * @example\n * // Add a number controller slider.\n * var person = {age: 45};\n * gui.add(person, 'age', 0, 100);\n */\n add: function(object, property) {\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n },\n\n /**\n * Adds a new color controller to the GUI.\n *\n * @param object\n * @param property\n * @returns {Controller} The controller that was added to the GUI.\n * @instance\n *\n * @example\n * var palette = {\n * color1: '#FF0000', // CSS string\n * color2: [ 0, 128, 255 ], // RGB array\n * color3: [ 0, 128, 255, 0.3 ], // RGB with alpha\n * color4: { h: 350, s: 0.9, v: 0.3 } // Hue, saturation, value\n * };\n * gui.addColor(palette, 'color1');\n * gui.addColor(palette, 'color2');\n * gui.addColor(palette, 'color3');\n * gui.addColor(palette, 'color4');\n */\n addColor: function(object, property) {\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n },\n\n /**\n * Removes the given controller from the GUI.\n * @param {Controller} controller\n * @instance\n */\n remove: function(controller) {\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n const _this = this;\n common.defer(function() {\n _this.onResize();\n });\n },\n\n /**\n * Removes the root GUI from the document and unbinds all event listeners.\n * For subfolders, use `gui.removeFolder(folder)` instead.\n * @instance\n */\n destroy: function() {\n if (this.parent) {\n throw new Error(\n 'Only the root GUI should be removed with .destroy(). ' +\n 'For subfolders, use gui.removeFolder(folder) instead.'\n );\n }\n\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n\n const _this = this;\n common.each(this.__folders, function(subfolder) {\n _this.removeFolder(subfolder);\n });\n\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n\n removeListeners(this);\n },\n\n /**\n * Creates a new subfolder GUI instance.\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n const newGuiParams = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n newGuiParams.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n // Start me closed if I was closed\n newGuiParams.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n newGuiParams.load = this.load.folders[name];\n }\n\n const gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n\n const li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n\n /**\n * Removes a subfolder GUI instance.\n * @param {dat.gui.GUI} folder The folder to remove.\n * @instance\n */\n removeFolder: function(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n\n delete this.__folders[folder.name];\n\n // Do we have saved appearance data for this folder?\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n\n removeListeners(folder);\n\n const _this = this;\n\n common.each(folder.__folders, function(subfolder) {\n folder.removeFolder(subfolder);\n });\n\n common.defer(function() {\n _this.onResize();\n });\n },\n\n /**\n * Opens the GUI.\n */\n open: function() {\n this.closed = false;\n },\n\n /**\n * Closes the GUI.\n */\n close: function() {\n this.closed = true;\n },\n\n /**\n * Hides the GUI.\n */\n hide: function() {\n this.domElement.style.display = 'none';\n },\n\n /**\n * Shows the GUI.\n */\n show: function() {\n this.domElement.style.display = '';\n },\n\n\n onResize: function() {\n // we debounce this function to prevent performance issues when rotating on tablet/mobile\n const root = this.getRoot();\n if (root.scrollable) {\n const top = dom.getOffset(root.__ul).top;\n let h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n\n onResizeDebounced: common.debounce(function() { this.onResize(); }, 50),\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {...Object} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n * @ignore\n */\n remember: function() {\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n\n const _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n let gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n const toReturn = this.load;\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n },\n\n save: function() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n\n saveAs: function(presetName) {\n if (!this.load.remembered) {\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n\n revert: function(gui) {\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n\n // fire onFinishChange callback\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n\n listen: function(controller) {\n const init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n\n updateDisplay: function() {\n common.each(this.__controllers, function(controller) {\n controller.updateDisplay();\n });\n common.each(this.__folders, function(folder) {\n folder.updateDisplay();\n });\n }\n }\n);\n\n/**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [newDom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n *\n * @ignore\n */\nfunction addRow(gui, newDom, liBefore) {\n const li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\n\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\n\nfunction markPresetModified(gui, modified) {\n const opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\n\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, /** @lends Controller.prototype */ {\n /**\n * @param {Array|Object} options\n * @return {Controller}\n */\n options: function(options) {\n if (arguments.length > 1) {\n const nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: nextSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n const nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: nextSibling,\n factoryArgs: [options]\n }\n );\n }\n },\n\n /**\n * Sets the name of the controller.\n * @param {string} name\n * @return {Controller}\n */\n name: function(name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = name;\n return controller;\n },\n\n /**\n * Sets controller to listen for changes on its underlying object.\n * @return {Controller}\n */\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n /**\n * Removes the controller from its parent GUI.\n * @return {Controller}\n */\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n const box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function(method) {\n const pc = controller[method];\n const pb = box[method];\n controller[method] = box[method] = function() {\n const args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n const r = function(returned) {\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n // Well, then lets just replace this with a slider.\n\n // lets remember if the old controller had a specific name or was listening\n const oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n const wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n\n controller.remove();\n const newController = add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n newController.name(oldName);\n if (wasListening) newController.listen();\n\n return newController;\n }\n\n return returned;\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n }\n\n controller.setValue = common.compose(function(val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n\n return val;\n }, controller.setValue);\n}\n\nfunction recallSavedValue(gui, controller) {\n // Find the topmost GUI, that's where remembered objects live.\n const root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n const matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matchedIndex !== -1) {\n // Let me fetch a map of controllers for thcommon.isObject.\n let controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] =\n controllerMap;\n }\n\n // Keep track of this controller\n controllerMap[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n const presetMap = root.load.remembered;\n\n // Which preset are we trying to load?\n let preset;\n\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n // Uhh, you can have the default instead?\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n // Nada.\n return;\n }\n\n // Did the loaded object remember thcommon.isObject? && Did we remember this particular property?\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n // We did remember something for this guy ...\n const value = preset[matchedIndex][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\n\nfunction add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error(`Object \"${object}\" has no property \"${property}\"`);\n }\n\n let controller;\n\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n const factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n const name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n const container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n const li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, typeof controller.getValue());\n }\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n}\n\nfunction getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n}\n\nfunction addPresetOption(gui, name, setSelected) {\n const opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\n\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\n\nfunction addSaveMenu(gui) {\n const div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n const gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n const button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n const button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n const button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n const select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n for (let index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n const explain = document.getElementById('dg-local-explain');\n const localStorageCheckBox = document.getElementById('dg-local-storage');\n const saveLocally = document.getElementById('dg-save-locally');\n\n saveLocally.style.display = 'block';\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n showHideExplain(gui, explain);\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n\n const newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n const presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n // div.appendChild(button2);\n}\n\nfunction addResizeHandle(gui) {\n let pmouseX;\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n // border: '1px solid blue'\n\n });\n\n function drag(e) {\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n }\n\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n\n function dragStart(e) {\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n }\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\n\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\n\nfunction getCurrentPreset(gui, useInitialValues) {\n const toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n const savedValues = {};\n\n // The controllers I've made for thcommon.isObject by property\n const controllerMap =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controllerMap, function(controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = savedValues;\n });\n\n return toReturn;\n}\n\nfunction setPresetSelectIndex(gui) {\n for (let index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\n\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame.call(window, function() {\n updateDisplays(controllerArray);\n });\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n}\n\nexport default GUI;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Color from './color/Color';\nimport math from './color/math';\nimport interpret from './color/interpret';\n\nimport Controller from './controllers/Controller';\nimport BooleanController from './controllers/BooleanController';\nimport OptionController from './controllers/OptionController';\nimport StringController from './controllers/StringController';\nimport NumberController from './controllers/NumberController';\nimport NumberControllerBox from './controllers/NumberControllerBox';\nimport NumberControllerSlider from './controllers/NumberControllerSlider';\nimport FunctionController from './controllers/FunctionController';\nimport ColorController from './controllers/ColorController';\n\nimport domImport from './dom/dom';\nimport GUIImport from './gui/GUI';\n\nexport const color = {\n Color: Color,\n math: math,\n interpret: interpret\n};\n\nexport const controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\n\nexport const dom = { dom: domImport };\n\nexport const gui = { GUI: GUIImport };\n\nexport const GUI = GUIImport;\n\nexport default {\n color,\n controllers,\n dom,\n gui,\n GUI\n};\n"],"names":["color","forceCSSHex","colorFormat","__state","conversionName","toString","r","Math","round","g","b","a","h","s","toFixed","v","str","hex","length","ARR_EACH","Array","prototype","forEach","ARR_SLICE","slice","Common","target","each","call","arguments","obj","keys","isObject","Object","key","isUndefined","bind","toCall","args","i","apply","itr","scope","l","BREAK","fnc","func","threshold","callImmediately","timeout","delayed","callNow","setTimeout","toArray","undefined","isNaN","isArray","constructor","INTERPRETATIONS","common","isString","original","test","match","parseInt","parseFloat","isNumber","result","toReturn","interpret","family","litmus","conversions","conversion","read","tmpComponent","ColorMath","hi","floor","f","p","q","t","c","min","max","delta","NaN","hex_with_component","componentIndex","value","Color","Error","colorToString","write","defineRGBComponent","component","componentHexIndex","defineProperty","space","recalculateRGB","defineHSVComponent","recalculateHSV","math","component_from_hex","extend","hsv_to_rgb","rgb_to_hsv","COMPONENTS","rgb_to_hex","Controller","object","property","initialValue","domElement","document","createElement","__onChange","__onFinishChange","newValue","updateDisplay","getValue","EVENT_MAP","EVENT_MAP_INV","k","e","CSS_VALUE_PIXELS","cssValueToPixels","val","isNull","dom","elem","selectable","style","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","hor","vert","vertical","horizontal","position","left","right","top","bottom","eventType","pars","aux","params","className","evt","createEvent","clientX","x","clientY","y","initMouseEvent","bubbles","cancelable","window","clickCount","init","initKeyboardEvent","initKeyEvent","defaults","ctrlKey","altKey","shiftKey","metaKey","keyCode","charCode","initEvent","dispatchEvent","event","newBool","bool","addEventListener","attachEvent","removeEventListener","detachEvent","classes","split","indexOf","push","join","replace","removeAttribute","index","splice","RegExp","getComputedStyle","width","height","el","offset","offsetParent","offsetLeft","offsetTop","activeElement","type","href","BooleanController","_this","__prev","__checkbox","setAttribute","onChange","setValue","appendChild","checked","OptionController","opts","options","__select","map","element","opt","innerHTML","desiredValue","selectedIndex","isActive","StringController","__input","onBlur","blur","numDecimals","_x","NumberController","_params","__min","__max","__step","step","__impliedStep","pow","log","abs","LN10","__precision","_v","minValue","maxValue","stepValue","roundToDecimal","decimals","tenTo","NumberControllerBox","__truncationSuspended","prevY","attempted","onFinish","onMouseDrag","diff","onMouseUp","unbind","onMouseDown","i1","i2","o1","o2","NumberControllerSlider","__background","__foreground","onTouchStart","addClass","preventDefault","bgRect","getBoundingClientRect","touches","onTouchMove","onTouchEnd","pct","FunctionController","text","__button","fire","ColorController","__color","__temp","makeSelectable","__selector","__saturation_field","__field_knob","__field_knob_border","__hue_knob","__hue_field","__input_textShadow","removeClass","valueField","fieldDown","fieldDownH","setSV","fieldUpSV","setH","fieldUpH","toOriginal","fieldRect","mismatch","flip","_flip","toHexString","marginTop","vendors","linearGradient","background","vendor","cssText","hueGradient","css","url","indoc","doc","link","rel","getElementsByTagName","cssContent","injected","head","saveDialogContents","ControllerFactory","isFunction","isBoolean","requestAnimationFrame","callback","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","CenteredDiv","backgroundElement","makeFullscreen","body","hide","display","opacity","webkitTransform","layout","defer","innerWidth","getWidth","innerHeight","getHeight","inject","styleSheet","CSS_NAMESPACE","HIDE_KEY_CODE","CLOSE_BUTTON_HEIGHT","DEFAULT_DEFAULT_PRESET_NAME","SUPPORTS_LOCAL_STORAGE","localStorage","SAVE_DIALOGUE","autoPlaceVirgin","autoPlaceContainer","hideableGuis","GUI","__ul","__folders","__controllers","__rememberedObjects","__rememberedObjectIndecesToControllers","__listening","DEFAULT_WIDTH","autoPlace","load","preset","parent","hideable","resizable","scrollable","useLocalStorage","getItem","getLocalStorageHash","saveToLocalStorage","titleRow","defineProperties","closeOnTop","getRoot","revert","name","closed","CLASS_CLOSED","onResize","__closeButton","TEXT_OPEN","TEXT_CLOSED","setItem","CLASS_MAIN","savedGui","JSON","parse","CLASS_CLOSE_BUTTON","CLASS_CLOSE_TOP","insertBefore","childNodes","CLASS_CLOSE_BOTTOM","titleRowName","createTextNode","addRow","onClickTitle","CLASS_AUTO_PLACE_CONTAINER","CLASS_AUTO_PLACE","__resizeHandler","onResizeDebounced","stringify","getSaveObject","saveToLocalStorageIfPossible","resetWidth","root","toggleHide","gui","CLASS_CONTROLLER_ROW","CLASS_TOO_TALL","CLASS_DRAG","_keydownHandler","which","add","controller","removeChild","__li","subfolder","removeFolder","newGuiParams","folders","li","folder","parentElement","getOffset","node","__save_row","__resize_handle","offsetHeight","debounce","saveDialogueContents","remembered","getCurrentPreset","presetName","newDom","liBefore","removeListeners","markPresetModified","modified","__preset_select","augmentController","__gui","nextSibling","nextElementSibling","remove","firstElementChild","listen","box","method","pc","pb","returned","oldName","wasListening","newController","compose","fakeEvent","stopPropagation","borderLeftColor","isModified","recallSavedValue","matchedIndex","controllerMap","presetMap","factoryArgs","concat","before","container","location","addPresetOption","setSelected","showHideExplain","explain","addSaveMenu","div","firstChild","gears","button","button2","button3","select","getElementById","localStorageCheckBox","saveLocally","newConstructorTextArea","show","focus","save","prompt","saveAs","addResizeHandle","pmouseX","drag","dragStop","dragStart","setWidth","w","useInitialValues","savedValues","setPresetSelectIndex","updateDisplays","controllerArray","controllers","domImport","GUIImport"],"mappings":"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"} \ No newline at end of file diff --git a/public/js/myGui.js b/public/js/myGui.js index ce5494a37..bc6ceadd5 100644 --- a/public/js/myGui.js +++ b/public/js/myGui.js @@ -1,11 +1,3 @@ -let FizzyText = function() { - this.message = 'dat.gui'; - this.speed = 0.8; - this.displayOutline = false; - this.explode = function() { ... }; - // Define render logic ... -} - window.onload = function() { var text = new FizzyText(); var gui = new dat.GUI(); @@ -14,3 +6,11 @@ window.onload = function() { gui.add(text, 'displayOutline'); gui.add(text, 'explode'); } + +let FizzyText = function() { + this.message = 'dat.gui'; + this.speed = 0.8; + this.displayOutline = false; + this.explode = function() { ... }; + // Define render logic ... +} From 9473930c7859ef0a0dcbef069e08d27be525bcb8 Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 13:24:09 -0400 Subject: [PATCH 19/54] adding files was dumb. found a cdn --- build/dat.gui.css | 1 - build/dat.gui.js | 2537 ----------------------------------- build/dat.gui.js.map | 1 - build/dat.gui.min.js | 13 - build/dat.gui.module.js | 2523 ---------------------------------- build/dat.gui.module.js.map | 1 - public/index.html | 2 +- 7 files changed, 1 insertion(+), 5077 deletions(-) delete mode 100644 build/dat.gui.css delete mode 100644 build/dat.gui.js delete mode 100644 build/dat.gui.js.map delete mode 100644 build/dat.gui.min.js delete mode 100644 build/dat.gui.module.js delete mode 100644 build/dat.gui.module.js.map diff --git a/build/dat.gui.css b/build/dat.gui.css deleted file mode 100644 index c039f4538..000000000 --- a/build/dat.gui.css +++ /dev/null @@ -1 +0,0 @@ -.dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda} diff --git a/build/dat.gui.js b/build/dat.gui.js deleted file mode 100644 index 85fadecc2..000000000 --- a/build/dat.gui.js +++ /dev/null @@ -1,2537 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (factory((global.dat = {}))); -}(this, (function (exports) { 'use strict'; - -function ___$insertStyle(css) { - if (!css) { - return; - } - if (typeof window === 'undefined') { - return; - } - - var style = document.createElement('style'); - - style.setAttribute('type', 'text/css'); - style.innerHTML = css; - document.head.appendChild(style); - - return css; -} - -function colorToString (color, forceCSSHex) { - var colorFormat = color.__state.conversionName.toString(); - var r = Math.round(color.r); - var g = Math.round(color.g); - var b = Math.round(color.b); - var a = color.a; - var h = Math.round(color.h); - var s = color.s.toFixed(1); - var v = color.v.toFixed(1); - if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') { - var str = color.hex.toString(16); - while (str.length < 6) { - str = '0' + str; - } - return '#' + str; - } else if (colorFormat === 'CSS_RGB') { - return 'rgb(' + r + ',' + g + ',' + b + ')'; - } else if (colorFormat === 'CSS_RGBA') { - return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; - } else if (colorFormat === 'HEX') { - return '0x' + color.hex.toString(16); - } else if (colorFormat === 'RGB_ARRAY') { - return '[' + r + ',' + g + ',' + b + ']'; - } else if (colorFormat === 'RGBA_ARRAY') { - return '[' + r + ',' + g + ',' + b + ',' + a + ']'; - } else if (colorFormat === 'RGB_OBJ') { - return '{r:' + r + ',g:' + g + ',b:' + b + '}'; - } else if (colorFormat === 'RGBA_OBJ') { - return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}'; - } else if (colorFormat === 'HSV_OBJ') { - return '{h:' + h + ',s:' + s + ',v:' + v + '}'; - } else if (colorFormat === 'HSVA_OBJ') { - return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}'; - } - return 'unknown format'; -} - -var ARR_EACH = Array.prototype.forEach; -var ARR_SLICE = Array.prototype.slice; -var Common = { - BREAK: {}, - extend: function extend(target) { - this.each(ARR_SLICE.call(arguments, 1), function (obj) { - var keys = this.isObject(obj) ? Object.keys(obj) : []; - keys.forEach(function (key) { - if (!this.isUndefined(obj[key])) { - target[key] = obj[key]; - } - }.bind(this)); - }, this); - return target; - }, - defaults: function defaults(target) { - this.each(ARR_SLICE.call(arguments, 1), function (obj) { - var keys = this.isObject(obj) ? Object.keys(obj) : []; - keys.forEach(function (key) { - if (this.isUndefined(target[key])) { - target[key] = obj[key]; - } - }.bind(this)); - }, this); - return target; - }, - compose: function compose() { - var toCall = ARR_SLICE.call(arguments); - return function () { - var args = ARR_SLICE.call(arguments); - for (var i = toCall.length - 1; i >= 0; i--) { - args = [toCall[i].apply(this, args)]; - } - return args[0]; - }; - }, - each: function each(obj, itr, scope) { - if (!obj) { - return; - } - if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) { - obj.forEach(itr, scope); - } else if (obj.length === obj.length + 0) { - var key = void 0; - var l = void 0; - for (key = 0, l = obj.length; key < l; key++) { - if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) { - return; - } - } - } else { - for (var _key in obj) { - if (itr.call(scope, obj[_key], _key) === this.BREAK) { - return; - } - } - } - }, - defer: function defer(fnc) { - setTimeout(fnc, 0); - }, - debounce: function debounce(func, threshold, callImmediately) { - var timeout = void 0; - return function () { - var obj = this; - var args = arguments; - function delayed() { - timeout = null; - if (!callImmediately) func.apply(obj, args); - } - var callNow = callImmediately || !timeout; - clearTimeout(timeout); - timeout = setTimeout(delayed, threshold); - if (callNow) { - func.apply(obj, args); - } - }; - }, - toArray: function toArray(obj) { - if (obj.toArray) return obj.toArray(); - return ARR_SLICE.call(obj); - }, - isUndefined: function isUndefined(obj) { - return obj === undefined; - }, - isNull: function isNull(obj) { - return obj === null; - }, - isNaN: function (_isNaN) { - function isNaN(_x) { - return _isNaN.apply(this, arguments); - } - isNaN.toString = function () { - return _isNaN.toString(); - }; - return isNaN; - }(function (obj) { - return isNaN(obj); - }), - isArray: Array.isArray || function (obj) { - return obj.constructor === Array; - }, - isObject: function isObject(obj) { - return obj === Object(obj); - }, - isNumber: function isNumber(obj) { - return obj === obj + 0; - }, - isString: function isString(obj) { - return obj === obj + ''; - }, - isBoolean: function isBoolean(obj) { - return obj === false || obj === true; - }, - isFunction: function isFunction(obj) { - return Object.prototype.toString.call(obj) === '[object Function]'; - } -}; - -var INTERPRETATIONS = [ -{ - litmus: Common.isString, - conversions: { - THREE_CHAR_HEX: { - read: function read(original) { - var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); - if (test === null) { - return false; - } - return { - space: 'HEX', - hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0) - }; - }, - write: colorToString - }, - SIX_CHAR_HEX: { - read: function read(original) { - var test = original.match(/^#([A-F0-9]{6})$/i); - if (test === null) { - return false; - } - return { - space: 'HEX', - hex: parseInt('0x' + test[1].toString(), 0) - }; - }, - write: colorToString - }, - CSS_RGB: { - read: function read(original) { - var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); - if (test === null) { - return false; - } - return { - space: 'RGB', - r: parseFloat(test[1]), - g: parseFloat(test[2]), - b: parseFloat(test[3]) - }; - }, - write: colorToString - }, - CSS_RGBA: { - read: function read(original) { - var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); - if (test === null) { - return false; - } - return { - space: 'RGB', - r: parseFloat(test[1]), - g: parseFloat(test[2]), - b: parseFloat(test[3]), - a: parseFloat(test[4]) - }; - }, - write: colorToString - } - } -}, -{ - litmus: Common.isNumber, - conversions: { - HEX: { - read: function read(original) { - return { - space: 'HEX', - hex: original, - conversionName: 'HEX' - }; - }, - write: function write(color) { - return color.hex; - } - } - } -}, -{ - litmus: Common.isArray, - conversions: { - RGB_ARRAY: { - read: function read(original) { - if (original.length !== 3) { - return false; - } - return { - space: 'RGB', - r: original[0], - g: original[1], - b: original[2] - }; - }, - write: function write(color) { - return [color.r, color.g, color.b]; - } - }, - RGBA_ARRAY: { - read: function read(original) { - if (original.length !== 4) return false; - return { - space: 'RGB', - r: original[0], - g: original[1], - b: original[2], - a: original[3] - }; - }, - write: function write(color) { - return [color.r, color.g, color.b, color.a]; - } - } - } -}, -{ - litmus: Common.isObject, - conversions: { - RGBA_OBJ: { - read: function read(original) { - if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) { - return { - space: 'RGB', - r: original.r, - g: original.g, - b: original.b, - a: original.a - }; - } - return false; - }, - write: function write(color) { - return { - r: color.r, - g: color.g, - b: color.b, - a: color.a - }; - } - }, - RGB_OBJ: { - read: function read(original) { - if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) { - return { - space: 'RGB', - r: original.r, - g: original.g, - b: original.b - }; - } - return false; - }, - write: function write(color) { - return { - r: color.r, - g: color.g, - b: color.b - }; - } - }, - HSVA_OBJ: { - read: function read(original) { - if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) { - return { - space: 'HSV', - h: original.h, - s: original.s, - v: original.v, - a: original.a - }; - } - return false; - }, - write: function write(color) { - return { - h: color.h, - s: color.s, - v: color.v, - a: color.a - }; - } - }, - HSV_OBJ: { - read: function read(original) { - if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) { - return { - space: 'HSV', - h: original.h, - s: original.s, - v: original.v - }; - } - return false; - }, - write: function write(color) { - return { - h: color.h, - s: color.s, - v: color.v - }; - } - } - } -}]; -var result = void 0; -var toReturn = void 0; -var interpret = function interpret() { - toReturn = false; - var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0]; - Common.each(INTERPRETATIONS, function (family) { - if (family.litmus(original)) { - Common.each(family.conversions, function (conversion, conversionName) { - result = conversion.read(original); - if (toReturn === false && result !== false) { - toReturn = result; - result.conversionName = conversionName; - result.conversion = conversion; - return Common.BREAK; - } - }); - return Common.BREAK; - } - }); - return toReturn; -}; - -var tmpComponent = void 0; -var ColorMath = { - hsv_to_rgb: function hsv_to_rgb(h, s, v) { - var hi = Math.floor(h / 60) % 6; - var f = h / 60 - Math.floor(h / 60); - var p = v * (1.0 - s); - var q = v * (1.0 - f * s); - var t = v * (1.0 - (1.0 - f) * s); - var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi]; - return { - r: c[0] * 255, - g: c[1] * 255, - b: c[2] * 255 - }; - }, - rgb_to_hsv: function rgb_to_hsv(r, g, b) { - var min = Math.min(r, g, b); - var max = Math.max(r, g, b); - var delta = max - min; - var h = void 0; - var s = void 0; - if (max !== 0) { - s = delta / max; - } else { - return { - h: NaN, - s: 0, - v: 0 - }; - } - if (r === max) { - h = (g - b) / delta; - } else if (g === max) { - h = 2 + (b - r) / delta; - } else { - h = 4 + (r - g) / delta; - } - h /= 6; - if (h < 0) { - h += 1; - } - return { - h: h * 360, - s: s, - v: max / 255 - }; - }, - rgb_to_hex: function rgb_to_hex(r, g, b) { - var hex = this.hex_with_component(0, 2, r); - hex = this.hex_with_component(hex, 1, g); - hex = this.hex_with_component(hex, 0, b); - return hex; - }, - component_from_hex: function component_from_hex(hex, componentIndex) { - return hex >> componentIndex * 8 & 0xFF; - }, - hex_with_component: function hex_with_component(hex, componentIndex, value) { - return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent); - } -}; - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { - return typeof obj; -} : function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; -}; - - - - - - - - - - - -var classCallCheck = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}; - -var createClass = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; -}(); - - - - - - - -var get = function get(object, property, receiver) { - if (object === null) object = Function.prototype; - var desc = Object.getOwnPropertyDescriptor(object, property); - - if (desc === undefined) { - var parent = Object.getPrototypeOf(object); - - if (parent === null) { - return undefined; - } else { - return get(parent, property, receiver); - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get; - - if (getter === undefined) { - return undefined; - } - - return getter.call(receiver); - } -}; - -var inherits = function (subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: false, - writable: true, - configurable: true - } - }); - if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -}; - - - - - - - - - - - -var possibleConstructorReturn = function (self, call) { - if (!self) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return call && (typeof call === "object" || typeof call === "function") ? call : self; -}; - -var Color = function () { - function Color() { - classCallCheck(this, Color); - this.__state = interpret.apply(this, arguments); - if (this.__state === false) { - throw new Error('Failed to interpret color arguments'); - } - this.__state.a = this.__state.a || 1; - } - createClass(Color, [{ - key: 'toString', - value: function toString() { - return colorToString(this); - } - }, { - key: 'toHexString', - value: function toHexString() { - return colorToString(this, true); - } - }, { - key: 'toOriginal', - value: function toOriginal() { - return this.__state.conversion.write(this); - } - }]); - return Color; -}(); -function defineRGBComponent(target, component, componentHexIndex) { - Object.defineProperty(target, component, { - get: function get$$1() { - if (this.__state.space === 'RGB') { - return this.__state[component]; - } - Color.recalculateRGB(this, component, componentHexIndex); - return this.__state[component]; - }, - set: function set$$1(v) { - if (this.__state.space !== 'RGB') { - Color.recalculateRGB(this, component, componentHexIndex); - this.__state.space = 'RGB'; - } - this.__state[component] = v; - } - }); -} -function defineHSVComponent(target, component) { - Object.defineProperty(target, component, { - get: function get$$1() { - if (this.__state.space === 'HSV') { - return this.__state[component]; - } - Color.recalculateHSV(this); - return this.__state[component]; - }, - set: function set$$1(v) { - if (this.__state.space !== 'HSV') { - Color.recalculateHSV(this); - this.__state.space = 'HSV'; - } - this.__state[component] = v; - } - }); -} -Color.recalculateRGB = function (color, component, componentHexIndex) { - if (color.__state.space === 'HEX') { - color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex); - } else if (color.__state.space === 'HSV') { - Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); - } else { - throw new Error('Corrupted color state'); - } -}; -Color.recalculateHSV = function (color) { - var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b); - Common.extend(color.__state, { - s: result.s, - v: result.v - }); - if (!Common.isNaN(result.h)) { - color.__state.h = result.h; - } else if (Common.isUndefined(color.__state.h)) { - color.__state.h = 0; - } -}; -Color.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a']; -defineRGBComponent(Color.prototype, 'r', 2); -defineRGBComponent(Color.prototype, 'g', 1); -defineRGBComponent(Color.prototype, 'b', 0); -defineHSVComponent(Color.prototype, 'h'); -defineHSVComponent(Color.prototype, 's'); -defineHSVComponent(Color.prototype, 'v'); -Object.defineProperty(Color.prototype, 'a', { - get: function get$$1() { - return this.__state.a; - }, - set: function set$$1(v) { - this.__state.a = v; - } -}); -Object.defineProperty(Color.prototype, 'hex', { - get: function get$$1() { - if (!this.__state.space !== 'HEX') { - this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b); - } - return this.__state.hex; - }, - set: function set$$1(v) { - this.__state.space = 'HEX'; - this.__state.hex = v; - } -}); - -var Controller = function () { - function Controller(object, property) { - classCallCheck(this, Controller); - this.initialValue = object[property]; - this.domElement = document.createElement('div'); - this.object = object; - this.property = property; - this.__onChange = undefined; - this.__onFinishChange = undefined; - } - createClass(Controller, [{ - key: 'onChange', - value: function onChange(fnc) { - this.__onChange = fnc; - return this; - } - }, { - key: 'onFinishChange', - value: function onFinishChange(fnc) { - this.__onFinishChange = fnc; - return this; - } - }, { - key: 'setValue', - value: function setValue(newValue) { - this.object[this.property] = newValue; - if (this.__onChange) { - this.__onChange.call(this, newValue); - } - this.updateDisplay(); - return this; - } - }, { - key: 'getValue', - value: function getValue() { - return this.object[this.property]; - } - }, { - key: 'updateDisplay', - value: function updateDisplay() { - return this; - } - }, { - key: 'isModified', - value: function isModified() { - return this.initialValue !== this.getValue(); - } - }]); - return Controller; -}(); - -var EVENT_MAP = { - HTMLEvents: ['change'], - MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'], - KeyboardEvents: ['keydown'] -}; -var EVENT_MAP_INV = {}; -Common.each(EVENT_MAP, function (v, k) { - Common.each(v, function (e) { - EVENT_MAP_INV[e] = k; - }); -}); -var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; -function cssValueToPixels(val) { - if (val === '0' || Common.isUndefined(val)) { - return 0; - } - var match = val.match(CSS_VALUE_PIXELS); - if (!Common.isNull(match)) { - return parseFloat(match[1]); - } - return 0; -} -var dom = { - makeSelectable: function makeSelectable(elem, selectable) { - if (elem === undefined || elem.style === undefined) return; - elem.onselectstart = selectable ? function () { - return false; - } : function () {}; - elem.style.MozUserSelect = selectable ? 'auto' : 'none'; - elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; - elem.unselectable = selectable ? 'on' : 'off'; - }, - makeFullscreen: function makeFullscreen(elem, hor, vert) { - var vertical = vert; - var horizontal = hor; - if (Common.isUndefined(horizontal)) { - horizontal = true; - } - if (Common.isUndefined(vertical)) { - vertical = true; - } - elem.style.position = 'absolute'; - if (horizontal) { - elem.style.left = 0; - elem.style.right = 0; - } - if (vertical) { - elem.style.top = 0; - elem.style.bottom = 0; - } - }, - fakeEvent: function fakeEvent(elem, eventType, pars, aux) { - var params = pars || {}; - var className = EVENT_MAP_INV[eventType]; - if (!className) { - throw new Error('Event type ' + eventType + ' not supported.'); - } - var evt = document.createEvent(className); - switch (className) { - case 'MouseEvents': - { - var clientX = params.x || params.clientX || 0; - var clientY = params.y || params.clientY || 0; - evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0, - 0, - clientX, - clientY, - false, false, false, false, 0, null); - break; - } - case 'KeyboardEvents': - { - var init = evt.initKeyboardEvent || evt.initKeyEvent; - Common.defaults(params, { - cancelable: true, - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false, - keyCode: undefined, - charCode: undefined - }); - init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode); - break; - } - default: - { - evt.initEvent(eventType, params.bubbles || false, params.cancelable || true); - break; - } - } - Common.defaults(evt, aux); - elem.dispatchEvent(evt); - }, - bind: function bind(elem, event, func, newBool) { - var bool = newBool || false; - if (elem.addEventListener) { - elem.addEventListener(event, func, bool); - } else if (elem.attachEvent) { - elem.attachEvent('on' + event, func); - } - return dom; - }, - unbind: function unbind(elem, event, func, newBool) { - var bool = newBool || false; - if (elem.removeEventListener) { - elem.removeEventListener(event, func, bool); - } else if (elem.detachEvent) { - elem.detachEvent('on' + event, func); - } - return dom; - }, - addClass: function addClass(elem, className) { - if (elem.className === undefined) { - elem.className = className; - } else if (elem.className !== className) { - var classes = elem.className.split(/ +/); - if (classes.indexOf(className) === -1) { - classes.push(className); - elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); - } - } - return dom; - }, - removeClass: function removeClass(elem, className) { - if (className) { - if (elem.className === className) { - elem.removeAttribute('class'); - } else { - var classes = elem.className.split(/ +/); - var index = classes.indexOf(className); - if (index !== -1) { - classes.splice(index, 1); - elem.className = classes.join(' '); - } - } - } else { - elem.className = undefined; - } - return dom; - }, - hasClass: function hasClass(elem, className) { - return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; - }, - getWidth: function getWidth(elem) { - var style = getComputedStyle(elem); - return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width); - }, - getHeight: function getHeight(elem) { - var style = getComputedStyle(elem); - return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height); - }, - getOffset: function getOffset(el) { - var elem = el; - var offset = { left: 0, top: 0 }; - if (elem.offsetParent) { - do { - offset.left += elem.offsetLeft; - offset.top += elem.offsetTop; - elem = elem.offsetParent; - } while (elem); - } - return offset; - }, - isActive: function isActive(elem) { - return elem === document.activeElement && (elem.type || elem.href); - } -}; - -var BooleanController = function (_Controller) { - inherits(BooleanController, _Controller); - function BooleanController(object, property) { - classCallCheck(this, BooleanController); - var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property)); - var _this = _this2; - _this2.__prev = _this2.getValue(); - _this2.__checkbox = document.createElement('input'); - _this2.__checkbox.setAttribute('type', 'checkbox'); - function onChange() { - _this.setValue(!_this.__prev); - } - dom.bind(_this2.__checkbox, 'change', onChange, false); - _this2.domElement.appendChild(_this2.__checkbox); - _this2.updateDisplay(); - return _this2; - } - createClass(BooleanController, [{ - key: 'setValue', - value: function setValue(v) { - var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - this.__prev = this.getValue(); - return toReturn; - } - }, { - key: 'updateDisplay', - value: function updateDisplay() { - if (this.getValue() === true) { - this.__checkbox.setAttribute('checked', 'checked'); - this.__checkbox.checked = true; - this.__prev = true; - } else { - this.__checkbox.checked = false; - this.__prev = false; - } - return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this); - } - }]); - return BooleanController; -}(Controller); - -var OptionController = function (_Controller) { - inherits(OptionController, _Controller); - function OptionController(object, property, opts) { - classCallCheck(this, OptionController); - var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property)); - var options = opts; - var _this = _this2; - _this2.__select = document.createElement('select'); - if (Common.isArray(options)) { - var map = {}; - Common.each(options, function (element) { - map[element] = element; - }); - options = map; - } - Common.each(options, function (value, key) { - var opt = document.createElement('option'); - opt.innerHTML = key; - opt.setAttribute('value', value); - _this.__select.appendChild(opt); - }); - _this2.updateDisplay(); - dom.bind(_this2.__select, 'change', function () { - var desiredValue = this.options[this.selectedIndex].value; - _this.setValue(desiredValue); - }); - _this2.domElement.appendChild(_this2.__select); - return _this2; - } - createClass(OptionController, [{ - key: 'setValue', - value: function setValue(v) { - var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - return toReturn; - } - }, { - key: 'updateDisplay', - value: function updateDisplay() { - if (dom.isActive(this.__select)) return this; - this.__select.value = this.getValue(); - return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this); - } - }]); - return OptionController; -}(Controller); - -var StringController = function (_Controller) { - inherits(StringController, _Controller); - function StringController(object, property) { - classCallCheck(this, StringController); - var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property)); - var _this = _this2; - function onChange() { - _this.setValue(_this.__input.value); - } - function onBlur() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - _this2.__input = document.createElement('input'); - _this2.__input.setAttribute('type', 'text'); - dom.bind(_this2.__input, 'keyup', onChange); - dom.bind(_this2.__input, 'change', onChange); - dom.bind(_this2.__input, 'blur', onBlur); - dom.bind(_this2.__input, 'keydown', function (e) { - if (e.keyCode === 13) { - this.blur(); - } - }); - _this2.updateDisplay(); - _this2.domElement.appendChild(_this2.__input); - return _this2; - } - createClass(StringController, [{ - key: 'updateDisplay', - value: function updateDisplay() { - if (!dom.isActive(this.__input)) { - this.__input.value = this.getValue(); - } - return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this); - } - }]); - return StringController; -}(Controller); - -function numDecimals(x) { - var _x = x.toString(); - if (_x.indexOf('.') > -1) { - return _x.length - _x.indexOf('.') - 1; - } - return 0; -} -var NumberController = function (_Controller) { - inherits(NumberController, _Controller); - function NumberController(object, property, params) { - classCallCheck(this, NumberController); - var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property)); - var _params = params || {}; - _this.__min = _params.min; - _this.__max = _params.max; - _this.__step = _params.step; - if (Common.isUndefined(_this.__step)) { - if (_this.initialValue === 0) { - _this.__impliedStep = 1; - } else { - _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10; - } - } else { - _this.__impliedStep = _this.__step; - } - _this.__precision = numDecimals(_this.__impliedStep); - return _this; - } - createClass(NumberController, [{ - key: 'setValue', - value: function setValue(v) { - var _v = v; - if (this.__min !== undefined && _v < this.__min) { - _v = this.__min; - } else if (this.__max !== undefined && _v > this.__max) { - _v = this.__max; - } - if (this.__step !== undefined && _v % this.__step !== 0) { - _v = Math.round(_v / this.__step) * this.__step; - } - return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v); - } - }, { - key: 'min', - value: function min(minValue) { - this.__min = minValue; - return this; - } - }, { - key: 'max', - value: function max(maxValue) { - this.__max = maxValue; - return this; - } - }, { - key: 'step', - value: function step(stepValue) { - this.__step = stepValue; - this.__impliedStep = stepValue; - this.__precision = numDecimals(stepValue); - return this; - } - }]); - return NumberController; -}(Controller); - -function roundToDecimal(value, decimals) { - var tenTo = Math.pow(10, decimals); - return Math.round(value * tenTo) / tenTo; -} -var NumberControllerBox = function (_NumberController) { - inherits(NumberControllerBox, _NumberController); - function NumberControllerBox(object, property, params) { - classCallCheck(this, NumberControllerBox); - var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params)); - _this2.__truncationSuspended = false; - var _this = _this2; - var prevY = void 0; - function onChange() { - var attempted = parseFloat(_this.__input.value); - if (!Common.isNaN(attempted)) { - _this.setValue(attempted); - } - } - function onFinish() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - function onBlur() { - onFinish(); - } - function onMouseDrag(e) { - var diff = prevY - e.clientY; - _this.setValue(_this.getValue() + diff * _this.__impliedStep); - prevY = e.clientY; - } - function onMouseUp() { - dom.unbind(window, 'mousemove', onMouseDrag); - dom.unbind(window, 'mouseup', onMouseUp); - onFinish(); - } - function onMouseDown(e) { - dom.bind(window, 'mousemove', onMouseDrag); - dom.bind(window, 'mouseup', onMouseUp); - prevY = e.clientY; - } - _this2.__input = document.createElement('input'); - _this2.__input.setAttribute('type', 'text'); - dom.bind(_this2.__input, 'change', onChange); - dom.bind(_this2.__input, 'blur', onBlur); - dom.bind(_this2.__input, 'mousedown', onMouseDown); - dom.bind(_this2.__input, 'keydown', function (e) { - if (e.keyCode === 13) { - _this.__truncationSuspended = true; - this.blur(); - _this.__truncationSuspended = false; - onFinish(); - } - }); - _this2.updateDisplay(); - _this2.domElement.appendChild(_this2.__input); - return _this2; - } - createClass(NumberControllerBox, [{ - key: 'updateDisplay', - value: function updateDisplay() { - this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); - return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this); - } - }]); - return NumberControllerBox; -}(NumberController); - -function map(v, i1, i2, o1, o2) { - return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); -} -var NumberControllerSlider = function (_NumberController) { - inherits(NumberControllerSlider, _NumberController); - function NumberControllerSlider(object, property, min, max, step) { - classCallCheck(this, NumberControllerSlider); - var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step })); - var _this = _this2; - _this2.__background = document.createElement('div'); - _this2.__foreground = document.createElement('div'); - dom.bind(_this2.__background, 'mousedown', onMouseDown); - dom.bind(_this2.__background, 'touchstart', onTouchStart); - dom.addClass(_this2.__background, 'slider'); - dom.addClass(_this2.__foreground, 'slider-fg'); - function onMouseDown(e) { - document.activeElement.blur(); - dom.bind(window, 'mousemove', onMouseDrag); - dom.bind(window, 'mouseup', onMouseUp); - onMouseDrag(e); - } - function onMouseDrag(e) { - e.preventDefault(); - var bgRect = _this.__background.getBoundingClientRect(); - _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); - return false; - } - function onMouseUp() { - dom.unbind(window, 'mousemove', onMouseDrag); - dom.unbind(window, 'mouseup', onMouseUp); - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - function onTouchStart(e) { - if (e.touches.length !== 1) { - return; - } - dom.bind(window, 'touchmove', onTouchMove); - dom.bind(window, 'touchend', onTouchEnd); - onTouchMove(e); - } - function onTouchMove(e) { - var clientX = e.touches[0].clientX; - var bgRect = _this.__background.getBoundingClientRect(); - _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); - } - function onTouchEnd() { - dom.unbind(window, 'touchmove', onTouchMove); - dom.unbind(window, 'touchend', onTouchEnd); - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - _this2.updateDisplay(); - _this2.__background.appendChild(_this2.__foreground); - _this2.domElement.appendChild(_this2.__background); - return _this2; - } - createClass(NumberControllerSlider, [{ - key: 'updateDisplay', - value: function updateDisplay() { - var pct = (this.getValue() - this.__min) / (this.__max - this.__min); - this.__foreground.style.width = pct * 100 + '%'; - return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this); - } - }]); - return NumberControllerSlider; -}(NumberController); - -var FunctionController = function (_Controller) { - inherits(FunctionController, _Controller); - function FunctionController(object, property, text) { - classCallCheck(this, FunctionController); - var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property)); - var _this = _this2; - _this2.__button = document.createElement('div'); - _this2.__button.innerHTML = text === undefined ? 'Fire' : text; - dom.bind(_this2.__button, 'click', function (e) { - e.preventDefault(); - _this.fire(); - return false; - }); - dom.addClass(_this2.__button, 'button'); - _this2.domElement.appendChild(_this2.__button); - return _this2; - } - createClass(FunctionController, [{ - key: 'fire', - value: function fire() { - if (this.__onChange) { - this.__onChange.call(this); - } - this.getValue().call(this.object); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - } - }]); - return FunctionController; -}(Controller); - -var ColorController = function (_Controller) { - inherits(ColorController, _Controller); - function ColorController(object, property) { - classCallCheck(this, ColorController); - var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property)); - _this2.__color = new Color(_this2.getValue()); - _this2.__temp = new Color(0); - var _this = _this2; - _this2.domElement = document.createElement('div'); - dom.makeSelectable(_this2.domElement, false); - _this2.__selector = document.createElement('div'); - _this2.__selector.className = 'selector'; - _this2.__saturation_field = document.createElement('div'); - _this2.__saturation_field.className = 'saturation-field'; - _this2.__field_knob = document.createElement('div'); - _this2.__field_knob.className = 'field-knob'; - _this2.__field_knob_border = '2px solid '; - _this2.__hue_knob = document.createElement('div'); - _this2.__hue_knob.className = 'hue-knob'; - _this2.__hue_field = document.createElement('div'); - _this2.__hue_field.className = 'hue-field'; - _this2.__input = document.createElement('input'); - _this2.__input.type = 'text'; - _this2.__input_textShadow = '0 1px 1px '; - dom.bind(_this2.__input, 'keydown', function (e) { - if (e.keyCode === 13) { - onBlur.call(this); - } - }); - dom.bind(_this2.__input, 'blur', onBlur); - dom.bind(_this2.__selector, 'mousedown', function () { - dom.addClass(this, 'drag').bind(window, 'mouseup', function () { - dom.removeClass(_this.__selector, 'drag'); - }); - }); - dom.bind(_this2.__selector, 'touchstart', function () { - dom.addClass(this, 'drag').bind(window, 'touchend', function () { - dom.removeClass(_this.__selector, 'drag'); - }); - }); - var valueField = document.createElement('div'); - Common.extend(_this2.__selector.style, { - width: '122px', - height: '102px', - padding: '3px', - backgroundColor: '#222', - boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' - }); - Common.extend(_this2.__field_knob.style, { - position: 'absolute', - width: '12px', - height: '12px', - border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'), - boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', - borderRadius: '12px', - zIndex: 1 - }); - Common.extend(_this2.__hue_knob.style, { - position: 'absolute', - width: '15px', - height: '2px', - borderRight: '4px solid #fff', - zIndex: 1 - }); - Common.extend(_this2.__saturation_field.style, { - width: '100px', - height: '100px', - border: '1px solid #555', - marginRight: '3px', - display: 'inline-block', - cursor: 'pointer' - }); - Common.extend(valueField.style, { - width: '100%', - height: '100%', - background: 'none' - }); - linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000'); - Common.extend(_this2.__hue_field.style, { - width: '15px', - height: '100px', - border: '1px solid #555', - cursor: 'ns-resize', - position: 'absolute', - top: '3px', - right: '3px' - }); - hueGradient(_this2.__hue_field); - Common.extend(_this2.__input.style, { - outline: 'none', - textAlign: 'center', - color: '#fff', - border: 0, - fontWeight: 'bold', - textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)' - }); - dom.bind(_this2.__saturation_field, 'mousedown', fieldDown); - dom.bind(_this2.__saturation_field, 'touchstart', fieldDown); - dom.bind(_this2.__field_knob, 'mousedown', fieldDown); - dom.bind(_this2.__field_knob, 'touchstart', fieldDown); - dom.bind(_this2.__hue_field, 'mousedown', fieldDownH); - dom.bind(_this2.__hue_field, 'touchstart', fieldDownH); - function fieldDown(e) { - setSV(e); - dom.bind(window, 'mousemove', setSV); - dom.bind(window, 'touchmove', setSV); - dom.bind(window, 'mouseup', fieldUpSV); - dom.bind(window, 'touchend', fieldUpSV); - } - function fieldDownH(e) { - setH(e); - dom.bind(window, 'mousemove', setH); - dom.bind(window, 'touchmove', setH); - dom.bind(window, 'mouseup', fieldUpH); - dom.bind(window, 'touchend', fieldUpH); - } - function fieldUpSV() { - dom.unbind(window, 'mousemove', setSV); - dom.unbind(window, 'touchmove', setSV); - dom.unbind(window, 'mouseup', fieldUpSV); - dom.unbind(window, 'touchend', fieldUpSV); - onFinish(); - } - function fieldUpH() { - dom.unbind(window, 'mousemove', setH); - dom.unbind(window, 'touchmove', setH); - dom.unbind(window, 'mouseup', fieldUpH); - dom.unbind(window, 'touchend', fieldUpH); - onFinish(); - } - function onBlur() { - var i = interpret(this.value); - if (i !== false) { - _this.__color.__state = i; - _this.setValue(_this.__color.toOriginal()); - } else { - this.value = _this.__color.toString(); - } - } - function onFinish() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.__color.toOriginal()); - } - } - _this2.__saturation_field.appendChild(valueField); - _this2.__selector.appendChild(_this2.__field_knob); - _this2.__selector.appendChild(_this2.__saturation_field); - _this2.__selector.appendChild(_this2.__hue_field); - _this2.__hue_field.appendChild(_this2.__hue_knob); - _this2.domElement.appendChild(_this2.__input); - _this2.domElement.appendChild(_this2.__selector); - _this2.updateDisplay(); - function setSV(e) { - if (e.type.indexOf('touch') === -1) { - e.preventDefault(); - } - var fieldRect = _this.__saturation_field.getBoundingClientRect(); - var _ref = e.touches && e.touches[0] || e, - clientX = _ref.clientX, - clientY = _ref.clientY; - var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left); - var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); - if (v > 1) { - v = 1; - } else if (v < 0) { - v = 0; - } - if (s > 1) { - s = 1; - } else if (s < 0) { - s = 0; - } - _this.__color.v = v; - _this.__color.s = s; - _this.setValue(_this.__color.toOriginal()); - return false; - } - function setH(e) { - if (e.type.indexOf('touch') === -1) { - e.preventDefault(); - } - var fieldRect = _this.__hue_field.getBoundingClientRect(); - var _ref2 = e.touches && e.touches[0] || e, - clientY = _ref2.clientY; - var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); - if (h > 1) { - h = 1; - } else if (h < 0) { - h = 0; - } - _this.__color.h = h * 360; - _this.setValue(_this.__color.toOriginal()); - return false; - } - return _this2; - } - createClass(ColorController, [{ - key: 'updateDisplay', - value: function updateDisplay() { - var i = interpret(this.getValue()); - if (i !== false) { - var mismatch = false; - Common.each(Color.COMPONENTS, function (component) { - if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) { - mismatch = true; - return {}; - } - }, this); - if (mismatch) { - Common.extend(this.__color.__state, i); - } - } - Common.extend(this.__temp.__state, this.__color.__state); - this.__temp.a = 1; - var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0; - var _flip = 255 - flip; - Common.extend(this.__field_knob.style, { - marginLeft: 100 * this.__color.s - 7 + 'px', - marginTop: 100 * (1 - this.__color.v) - 7 + 'px', - backgroundColor: this.__temp.toHexString(), - border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')' - }); - this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'; - this.__temp.s = 1; - this.__temp.v = 1; - linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString()); - this.__input.value = this.__color.toString(); - Common.extend(this.__input.style, { - backgroundColor: this.__color.toHexString(), - color: 'rgb(' + flip + ',' + flip + ',' + flip + ')', - textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)' - }); - } - }]); - return ColorController; -}(Controller); -var vendors = ['-moz-', '-o-', '-webkit-', '-ms-', '']; -function linearGradient(elem, x, a, b) { - elem.style.background = ''; - Common.each(vendors, function (vendor) { - elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); '; - }); -} -function hueGradient(elem) { - elem.style.background = ''; - elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'; - elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; -} - -var css = { - load: function load(url, indoc) { - var doc = indoc || document; - var link = doc.createElement('link'); - link.type = 'text/css'; - link.rel = 'stylesheet'; - link.href = url; - doc.getElementsByTagName('head')[0].appendChild(link); - }, - inject: function inject(cssContent, indoc) { - var doc = indoc || document; - var injected = document.createElement('style'); - injected.type = 'text/css'; - injected.innerHTML = cssContent; - var head = doc.getElementsByTagName('head')[0]; - try { - head.appendChild(injected); - } catch (e) { - } - } -}; - -var saveDialogContents = "
\n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n
"; - -var ControllerFactory = function ControllerFactory(object, property) { - var initialValue = object[property]; - if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) { - return new OptionController(object, property, arguments[2]); - } - if (Common.isNumber(initialValue)) { - if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) { - if (Common.isNumber(arguments[4])) { - return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]); - } - return new NumberControllerSlider(object, property, arguments[2], arguments[3]); - } - if (Common.isNumber(arguments[4])) { - return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] }); - } - return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); - } - if (Common.isString(initialValue)) { - return new StringController(object, property); - } - if (Common.isFunction(initialValue)) { - return new FunctionController(object, property, ''); - } - if (Common.isBoolean(initialValue)) { - return new BooleanController(object, property); - } - return null; -}; - -function requestAnimationFrame(callback) { - setTimeout(callback, 1000 / 60); -} -var requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame; - -var CenteredDiv = function () { - function CenteredDiv() { - classCallCheck(this, CenteredDiv); - this.backgroundElement = document.createElement('div'); - Common.extend(this.backgroundElement.style, { - backgroundColor: 'rgba(0,0,0,0.8)', - top: 0, - left: 0, - display: 'none', - zIndex: '1000', - opacity: 0, - WebkitTransition: 'opacity 0.2s linear', - transition: 'opacity 0.2s linear' - }); - dom.makeFullscreen(this.backgroundElement); - this.backgroundElement.style.position = 'fixed'; - this.domElement = document.createElement('div'); - Common.extend(this.domElement.style, { - position: 'fixed', - display: 'none', - zIndex: '1001', - opacity: 0, - WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear', - transition: 'transform 0.2s ease-out, opacity 0.2s linear' - }); - document.body.appendChild(this.backgroundElement); - document.body.appendChild(this.domElement); - var _this = this; - dom.bind(this.backgroundElement, 'click', function () { - _this.hide(); - }); - } - createClass(CenteredDiv, [{ - key: 'show', - value: function show() { - var _this = this; - this.backgroundElement.style.display = 'block'; - this.domElement.style.display = 'block'; - this.domElement.style.opacity = 0; - this.domElement.style.webkitTransform = 'scale(1.1)'; - this.layout(); - Common.defer(function () { - _this.backgroundElement.style.opacity = 1; - _this.domElement.style.opacity = 1; - _this.domElement.style.webkitTransform = 'scale(1)'; - }); - } - }, { - key: 'hide', - value: function hide() { - var _this = this; - var hide = function hide() { - _this.domElement.style.display = 'none'; - _this.backgroundElement.style.display = 'none'; - dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); - dom.unbind(_this.domElement, 'transitionend', hide); - dom.unbind(_this.domElement, 'oTransitionEnd', hide); - }; - dom.bind(this.domElement, 'webkitTransitionEnd', hide); - dom.bind(this.domElement, 'transitionend', hide); - dom.bind(this.domElement, 'oTransitionEnd', hide); - this.backgroundElement.style.opacity = 0; - this.domElement.style.opacity = 0; - this.domElement.style.webkitTransform = 'scale(1.1)'; - } - }, { - key: 'layout', - value: function layout() { - this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px'; - this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px'; - } - }]); - return CenteredDiv; -}(); - -var styleSheet = ___$insertStyle(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"); - -css.inject(styleSheet); -var CSS_NAMESPACE = 'dg'; -var HIDE_KEY_CODE = 72; -var CLOSE_BUTTON_HEIGHT = 20; -var DEFAULT_DEFAULT_PRESET_NAME = 'Default'; -var SUPPORTS_LOCAL_STORAGE = function () { - try { - return !!window.localStorage; - } catch (e) { - return false; - } -}(); -var SAVE_DIALOGUE = void 0; -var autoPlaceVirgin = true; -var autoPlaceContainer = void 0; -var hide = false; -var hideableGuis = []; -var GUI = function GUI(pars) { - var _this = this; - var params = pars || {}; - this.domElement = document.createElement('div'); - this.__ul = document.createElement('ul'); - this.domElement.appendChild(this.__ul); - dom.addClass(this.domElement, CSS_NAMESPACE); - this.__folders = {}; - this.__controllers = []; - this.__rememberedObjects = []; - this.__rememberedObjectIndecesToControllers = []; - this.__listening = []; - params = Common.defaults(params, { - closeOnTop: false, - autoPlace: true, - width: GUI.DEFAULT_WIDTH - }); - params = Common.defaults(params, { - resizable: params.autoPlace, - hideable: params.autoPlace - }); - if (!Common.isUndefined(params.load)) { - if (params.preset) { - params.load.preset = params.preset; - } - } else { - params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; - } - if (Common.isUndefined(params.parent) && params.hideable) { - hideableGuis.push(this); - } - params.resizable = Common.isUndefined(params.parent) && params.resizable; - if (params.autoPlace && Common.isUndefined(params.scrollable)) { - params.scrollable = true; - } - var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; - var saveToLocalStorage = void 0; - var titleRow = void 0; - Object.defineProperties(this, - { - parent: { - get: function get$$1() { - return params.parent; - } - }, - scrollable: { - get: function get$$1() { - return params.scrollable; - } - }, - autoPlace: { - get: function get$$1() { - return params.autoPlace; - } - }, - closeOnTop: { - get: function get$$1() { - return params.closeOnTop; - } - }, - preset: { - get: function get$$1() { - if (_this.parent) { - return _this.getRoot().preset; - } - return params.load.preset; - }, - set: function set$$1(v) { - if (_this.parent) { - _this.getRoot().preset = v; - } else { - params.load.preset = v; - } - setPresetSelectIndex(this); - _this.revert(); - } - }, - width: { - get: function get$$1() { - return params.width; - }, - set: function set$$1(v) { - params.width = v; - setWidth(_this, v); - } - }, - name: { - get: function get$$1() { - return params.name; - }, - set: function set$$1(v) { - params.name = v; - if (titleRow) { - titleRow.innerHTML = params.name; - } - } - }, - closed: { - get: function get$$1() { - return params.closed; - }, - set: function set$$1(v) { - params.closed = v; - if (params.closed) { - dom.addClass(_this.__ul, GUI.CLASS_CLOSED); - } else { - dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); - } - this.onResize(); - if (_this.__closeButton) { - _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; - } - } - }, - load: { - get: function get$$1() { - return params.load; - } - }, - useLocalStorage: { - get: function get$$1() { - return useLocalStorage; - }, - set: function set$$1(bool) { - if (SUPPORTS_LOCAL_STORAGE) { - useLocalStorage = bool; - if (bool) { - dom.bind(window, 'unload', saveToLocalStorage); - } else { - dom.unbind(window, 'unload', saveToLocalStorage); - } - localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); - } - } - } - }); - if (Common.isUndefined(params.parent)) { - this.closed = params.closed || false; - dom.addClass(this.domElement, GUI.CLASS_MAIN); - dom.makeSelectable(this.domElement, false); - if (SUPPORTS_LOCAL_STORAGE) { - if (useLocalStorage) { - _this.useLocalStorage = true; - var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui')); - if (savedGui) { - params.load = JSON.parse(savedGui); - } - } - } - this.__closeButton = document.createElement('div'); - this.__closeButton.innerHTML = GUI.TEXT_CLOSED; - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); - if (params.closeOnTop) { - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP); - this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]); - } else { - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM); - this.domElement.appendChild(this.__closeButton); - } - dom.bind(this.__closeButton, 'click', function () { - _this.closed = !_this.closed; - }); - } else { - if (params.closed === undefined) { - params.closed = true; - } - var titleRowName = document.createTextNode(params.name); - dom.addClass(titleRowName, 'controller-name'); - titleRow = addRow(_this, titleRowName); - var onClickTitle = function onClickTitle(e) { - e.preventDefault(); - _this.closed = !_this.closed; - return false; - }; - dom.addClass(this.__ul, GUI.CLASS_CLOSED); - dom.addClass(titleRow, 'title'); - dom.bind(titleRow, 'click', onClickTitle); - if (!params.closed) { - this.closed = false; - } - } - if (params.autoPlace) { - if (Common.isUndefined(params.parent)) { - if (autoPlaceVirgin) { - autoPlaceContainer = document.createElement('div'); - dom.addClass(autoPlaceContainer, CSS_NAMESPACE); - dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER); - document.body.appendChild(autoPlaceContainer); - autoPlaceVirgin = false; - } - autoPlaceContainer.appendChild(this.domElement); - dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); - } - if (!this.parent) { - setWidth(_this, params.width); - } - } - this.__resizeHandler = function () { - _this.onResizeDebounced(); - }; - dom.bind(window, 'resize', this.__resizeHandler); - dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler); - dom.bind(this.__ul, 'transitionend', this.__resizeHandler); - dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler); - this.onResize(); - if (params.resizable) { - addResizeHandle(this); - } - saveToLocalStorage = function saveToLocalStorage() { - if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') { - localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); - } - }; - this.saveToLocalStorageIfPossible = saveToLocalStorage; - function resetWidth() { - var root = _this.getRoot(); - root.width += 1; - Common.defer(function () { - root.width -= 1; - }); - } - if (!params.parent) { - resetWidth(); - } -}; -GUI.toggleHide = function () { - hide = !hide; - Common.each(hideableGuis, function (gui) { - gui.domElement.style.display = hide ? 'none' : ''; - }); -}; -GUI.CLASS_AUTO_PLACE = 'a'; -GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; -GUI.CLASS_MAIN = 'main'; -GUI.CLASS_CONTROLLER_ROW = 'cr'; -GUI.CLASS_TOO_TALL = 'taller-than-window'; -GUI.CLASS_CLOSED = 'closed'; -GUI.CLASS_CLOSE_BUTTON = 'close-button'; -GUI.CLASS_CLOSE_TOP = 'close-top'; -GUI.CLASS_CLOSE_BOTTOM = 'close-bottom'; -GUI.CLASS_DRAG = 'drag'; -GUI.DEFAULT_WIDTH = 245; -GUI.TEXT_CLOSED = 'Close Controls'; -GUI.TEXT_OPEN = 'Open Controls'; -GUI._keydownHandler = function (e) { - if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) { - GUI.toggleHide(); - } -}; -dom.bind(window, 'keydown', GUI._keydownHandler, false); -Common.extend(GUI.prototype, -{ - add: function add(object, property) { - return _add(this, object, property, { - factoryArgs: Array.prototype.slice.call(arguments, 2) - }); - }, - addColor: function addColor(object, property) { - return _add(this, object, property, { - color: true - }); - }, - remove: function remove(controller) { - this.__ul.removeChild(controller.__li); - this.__controllers.splice(this.__controllers.indexOf(controller), 1); - var _this = this; - Common.defer(function () { - _this.onResize(); - }); - }, - destroy: function destroy() { - if (this.parent) { - throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.'); - } - if (this.autoPlace) { - autoPlaceContainer.removeChild(this.domElement); - } - var _this = this; - Common.each(this.__folders, function (subfolder) { - _this.removeFolder(subfolder); - }); - dom.unbind(window, 'keydown', GUI._keydownHandler, false); - removeListeners(this); - }, - addFolder: function addFolder(name) { - if (this.__folders[name] !== undefined) { - throw new Error('You already have a folder in this GUI by the' + ' name "' + name + '"'); - } - var newGuiParams = { name: name, parent: this }; - newGuiParams.autoPlace = this.autoPlace; - if (this.load && - this.load.folders && - this.load.folders[name]) { - newGuiParams.closed = this.load.folders[name].closed; - newGuiParams.load = this.load.folders[name]; - } - var gui = new GUI(newGuiParams); - this.__folders[name] = gui; - var li = addRow(this, gui.domElement); - dom.addClass(li, 'folder'); - return gui; - }, - removeFolder: function removeFolder(folder) { - this.__ul.removeChild(folder.domElement.parentElement); - delete this.__folders[folder.name]; - if (this.load && - this.load.folders && - this.load.folders[folder.name]) { - delete this.load.folders[folder.name]; - } - removeListeners(folder); - var _this = this; - Common.each(folder.__folders, function (subfolder) { - folder.removeFolder(subfolder); - }); - Common.defer(function () { - _this.onResize(); - }); - }, - open: function open() { - this.closed = false; - }, - close: function close() { - this.closed = true; - }, - hide: function hide() { - this.domElement.style.display = 'none'; - }, - show: function show() { - this.domElement.style.display = ''; - }, - onResize: function onResize() { - var root = this.getRoot(); - if (root.scrollable) { - var top = dom.getOffset(root.__ul).top; - var h = 0; - Common.each(root.__ul.childNodes, function (node) { - if (!(root.autoPlace && node === root.__save_row)) { - h += dom.getHeight(node); - } - }); - if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { - dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); - root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; - } else { - dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); - root.__ul.style.height = 'auto'; - } - } - if (root.__resize_handle) { - Common.defer(function () { - root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; - }); - } - if (root.__closeButton) { - root.__closeButton.style.width = root.width + 'px'; - } - }, - onResizeDebounced: Common.debounce(function () { - this.onResize(); - }, 50), - remember: function remember() { - if (Common.isUndefined(SAVE_DIALOGUE)) { - SAVE_DIALOGUE = new CenteredDiv(); - SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents; - } - if (this.parent) { - throw new Error('You can only call remember on a top level GUI.'); - } - var _this = this; - Common.each(Array.prototype.slice.call(arguments), function (object) { - if (_this.__rememberedObjects.length === 0) { - addSaveMenu(_this); - } - if (_this.__rememberedObjects.indexOf(object) === -1) { - _this.__rememberedObjects.push(object); - } - }); - if (this.autoPlace) { - setWidth(this, this.width); - } - }, - getRoot: function getRoot() { - var gui = this; - while (gui.parent) { - gui = gui.parent; - } - return gui; - }, - getSaveObject: function getSaveObject() { - var toReturn = this.load; - toReturn.closed = this.closed; - if (this.__rememberedObjects.length > 0) { - toReturn.preset = this.preset; - if (!toReturn.remembered) { - toReturn.remembered = {}; - } - toReturn.remembered[this.preset] = getCurrentPreset(this); - } - toReturn.folders = {}; - Common.each(this.__folders, function (element, key) { - toReturn.folders[key] = element.getSaveObject(); - }); - return toReturn; - }, - save: function save() { - if (!this.load.remembered) { - this.load.remembered = {}; - } - this.load.remembered[this.preset] = getCurrentPreset(this); - markPresetModified(this, false); - this.saveToLocalStorageIfPossible(); - }, - saveAs: function saveAs(presetName) { - if (!this.load.remembered) { - this.load.remembered = {}; - this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); - } - this.load.remembered[presetName] = getCurrentPreset(this); - this.preset = presetName; - addPresetOption(this, presetName, true); - this.saveToLocalStorageIfPossible(); - }, - revert: function revert(gui) { - Common.each(this.__controllers, function (controller) { - if (!this.getRoot().load.remembered) { - controller.setValue(controller.initialValue); - } else { - recallSavedValue(gui || this.getRoot(), controller); - } - if (controller.__onFinishChange) { - controller.__onFinishChange.call(controller, controller.getValue()); - } - }, this); - Common.each(this.__folders, function (folder) { - folder.revert(folder); - }); - if (!gui) { - markPresetModified(this.getRoot(), false); - } - }, - listen: function listen(controller) { - var init = this.__listening.length === 0; - this.__listening.push(controller); - if (init) { - updateDisplays(this.__listening); - } - }, - updateDisplay: function updateDisplay() { - Common.each(this.__controllers, function (controller) { - controller.updateDisplay(); - }); - Common.each(this.__folders, function (folder) { - folder.updateDisplay(); - }); - } -}); -function addRow(gui, newDom, liBefore) { - var li = document.createElement('li'); - if (newDom) { - li.appendChild(newDom); - } - if (liBefore) { - gui.__ul.insertBefore(li, liBefore); - } else { - gui.__ul.appendChild(li); - } - gui.onResize(); - return li; -} -function removeListeners(gui) { - dom.unbind(window, 'resize', gui.__resizeHandler); - if (gui.saveToLocalStorageIfPossible) { - dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible); - } -} -function markPresetModified(gui, modified) { - var opt = gui.__preset_select[gui.__preset_select.selectedIndex]; - if (modified) { - opt.innerHTML = opt.value + '*'; - } else { - opt.innerHTML = opt.value; - } -} -function augmentController(gui, li, controller) { - controller.__li = li; - controller.__gui = gui; - Common.extend(controller, { - options: function options(_options) { - if (arguments.length > 1) { - var nextSibling = controller.__li.nextElementSibling; - controller.remove(); - return _add(gui, controller.object, controller.property, { - before: nextSibling, - factoryArgs: [Common.toArray(arguments)] - }); - } - if (Common.isArray(_options) || Common.isObject(_options)) { - var _nextSibling = controller.__li.nextElementSibling; - controller.remove(); - return _add(gui, controller.object, controller.property, { - before: _nextSibling, - factoryArgs: [_options] - }); - } - }, - name: function name(_name) { - controller.__li.firstElementChild.firstElementChild.innerHTML = _name; - return controller; - }, - listen: function listen() { - controller.__gui.listen(controller); - return controller; - }, - remove: function remove() { - controller.__gui.remove(controller); - return controller; - } - }); - if (controller instanceof NumberControllerSlider) { - var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step }); - Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) { - var pc = controller[method]; - var pb = box[method]; - controller[method] = box[method] = function () { - var args = Array.prototype.slice.call(arguments); - pb.apply(box, args); - return pc.apply(controller, args); - }; - }); - dom.addClass(li, 'has-slider'); - controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); - } else if (controller instanceof NumberControllerBox) { - var r = function r(returned) { - if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) { - var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML; - var wasListening = controller.__gui.__listening.indexOf(controller) > -1; - controller.remove(); - var newController = _add(gui, controller.object, controller.property, { - before: controller.__li.nextElementSibling, - factoryArgs: [controller.__min, controller.__max, controller.__step] - }); - newController.name(oldName); - if (wasListening) newController.listen(); - return newController; - } - return returned; - }; - controller.min = Common.compose(r, controller.min); - controller.max = Common.compose(r, controller.max); - } else if (controller instanceof BooleanController) { - dom.bind(li, 'click', function () { - dom.fakeEvent(controller.__checkbox, 'click'); - }); - dom.bind(controller.__checkbox, 'click', function (e) { - e.stopPropagation(); - }); - } else if (controller instanceof FunctionController) { - dom.bind(li, 'click', function () { - dom.fakeEvent(controller.__button, 'click'); - }); - dom.bind(li, 'mouseover', function () { - dom.addClass(controller.__button, 'hover'); - }); - dom.bind(li, 'mouseout', function () { - dom.removeClass(controller.__button, 'hover'); - }); - } else if (controller instanceof ColorController) { - dom.addClass(li, 'color'); - controller.updateDisplay = Common.compose(function (val) { - li.style.borderLeftColor = controller.__color.toString(); - return val; - }, controller.updateDisplay); - controller.updateDisplay(); - } - controller.setValue = Common.compose(function (val) { - if (gui.getRoot().__preset_select && controller.isModified()) { - markPresetModified(gui.getRoot(), true); - } - return val; - }, controller.setValue); -} -function recallSavedValue(gui, controller) { - var root = gui.getRoot(); - var matchedIndex = root.__rememberedObjects.indexOf(controller.object); - if (matchedIndex !== -1) { - var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex]; - if (controllerMap === undefined) { - controllerMap = {}; - root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap; - } - controllerMap[controller.property] = controller; - if (root.load && root.load.remembered) { - var presetMap = root.load.remembered; - var preset = void 0; - if (presetMap[gui.preset]) { - preset = presetMap[gui.preset]; - } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) { - preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME]; - } else { - return; - } - if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) { - var value = preset[matchedIndex][controller.property]; - controller.initialValue = value; - controller.setValue(value); - } - } - } -} -function _add(gui, object, property, params) { - if (object[property] === undefined) { - throw new Error('Object "' + object + '" has no property "' + property + '"'); - } - var controller = void 0; - if (params.color) { - controller = new ColorController(object, property); - } else { - var factoryArgs = [object, property].concat(params.factoryArgs); - controller = ControllerFactory.apply(gui, factoryArgs); - } - if (params.before instanceof Controller) { - params.before = params.before.__li; - } - recallSavedValue(gui, controller); - dom.addClass(controller.domElement, 'c'); - var name = document.createElement('span'); - dom.addClass(name, 'property-name'); - name.innerHTML = controller.property; - var container = document.createElement('div'); - container.appendChild(name); - container.appendChild(controller.domElement); - var li = addRow(gui, container, params.before); - dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); - if (controller instanceof ColorController) { - dom.addClass(li, 'color'); - } else { - dom.addClass(li, _typeof(controller.getValue())); - } - augmentController(gui, li, controller); - gui.__controllers.push(controller); - return controller; -} -function getLocalStorageHash(gui, key) { - return document.location.href + '.' + key; -} -function addPresetOption(gui, name, setSelected) { - var opt = document.createElement('option'); - opt.innerHTML = name; - opt.value = name; - gui.__preset_select.appendChild(opt); - if (setSelected) { - gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; - } -} -function showHideExplain(gui, explain) { - explain.style.display = gui.useLocalStorage ? 'block' : 'none'; -} -function addSaveMenu(gui) { - var div = gui.__save_row = document.createElement('li'); - dom.addClass(gui.domElement, 'has-save'); - gui.__ul.insertBefore(div, gui.__ul.firstChild); - dom.addClass(div, 'save-row'); - var gears = document.createElement('span'); - gears.innerHTML = ' '; - dom.addClass(gears, 'button gears'); - var button = document.createElement('span'); - button.innerHTML = 'Save'; - dom.addClass(button, 'button'); - dom.addClass(button, 'save'); - var button2 = document.createElement('span'); - button2.innerHTML = 'New'; - dom.addClass(button2, 'button'); - dom.addClass(button2, 'save-as'); - var button3 = document.createElement('span'); - button3.innerHTML = 'Revert'; - dom.addClass(button3, 'button'); - dom.addClass(button3, 'revert'); - var select = gui.__preset_select = document.createElement('select'); - if (gui.load && gui.load.remembered) { - Common.each(gui.load.remembered, function (value, key) { - addPresetOption(gui, key, key === gui.preset); - }); - } else { - addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); - } - dom.bind(select, 'change', function () { - for (var index = 0; index < gui.__preset_select.length; index++) { - gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; - } - gui.preset = this.value; - }); - div.appendChild(select); - div.appendChild(gears); - div.appendChild(button); - div.appendChild(button2); - div.appendChild(button3); - if (SUPPORTS_LOCAL_STORAGE) { - var explain = document.getElementById('dg-local-explain'); - var localStorageCheckBox = document.getElementById('dg-local-storage'); - var saveLocally = document.getElementById('dg-save-locally'); - saveLocally.style.display = 'block'; - if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { - localStorageCheckBox.setAttribute('checked', 'checked'); - } - showHideExplain(gui, explain); - dom.bind(localStorageCheckBox, 'change', function () { - gui.useLocalStorage = !gui.useLocalStorage; - showHideExplain(gui, explain); - }); - } - var newConstructorTextArea = document.getElementById('dg-new-constructor'); - dom.bind(newConstructorTextArea, 'keydown', function (e) { - if (e.metaKey && (e.which === 67 || e.keyCode === 67)) { - SAVE_DIALOGUE.hide(); - } - }); - dom.bind(gears, 'click', function () { - newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); - SAVE_DIALOGUE.show(); - newConstructorTextArea.focus(); - newConstructorTextArea.select(); - }); - dom.bind(button, 'click', function () { - gui.save(); - }); - dom.bind(button2, 'click', function () { - var presetName = prompt('Enter a new preset name.'); - if (presetName) { - gui.saveAs(presetName); - } - }); - dom.bind(button3, 'click', function () { - gui.revert(); - }); -} -function addResizeHandle(gui) { - var pmouseX = void 0; - gui.__resize_handle = document.createElement('div'); - Common.extend(gui.__resize_handle.style, { - width: '6px', - marginLeft: '-3px', - height: '200px', - cursor: 'ew-resize', - position: 'absolute' - }); - function drag(e) { - e.preventDefault(); - gui.width += pmouseX - e.clientX; - gui.onResize(); - pmouseX = e.clientX; - return false; - } - function dragStop() { - dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); - dom.unbind(window, 'mousemove', drag); - dom.unbind(window, 'mouseup', dragStop); - } - function dragStart(e) { - e.preventDefault(); - pmouseX = e.clientX; - dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); - dom.bind(window, 'mousemove', drag); - dom.bind(window, 'mouseup', dragStop); - return false; - } - dom.bind(gui.__resize_handle, 'mousedown', dragStart); - dom.bind(gui.__closeButton, 'mousedown', dragStart); - gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); -} -function setWidth(gui, w) { - gui.domElement.style.width = w + 'px'; - if (gui.__save_row && gui.autoPlace) { - gui.__save_row.style.width = w + 'px'; - } - if (gui.__closeButton) { - gui.__closeButton.style.width = w + 'px'; - } -} -function getCurrentPreset(gui, useInitialValues) { - var toReturn = {}; - Common.each(gui.__rememberedObjects, function (val, index) { - var savedValues = {}; - var controllerMap = gui.__rememberedObjectIndecesToControllers[index]; - Common.each(controllerMap, function (controller, property) { - savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue(); - }); - toReturn[index] = savedValues; - }); - return toReturn; -} -function setPresetSelectIndex(gui) { - for (var index = 0; index < gui.__preset_select.length; index++) { - if (gui.__preset_select[index].value === gui.preset) { - gui.__preset_select.selectedIndex = index; - } - } -} -function updateDisplays(controllerArray) { - if (controllerArray.length !== 0) { - requestAnimationFrame$1.call(window, function () { - updateDisplays(controllerArray); - }); - } - Common.each(controllerArray, function (c) { - c.updateDisplay(); - }); -} - -var color = { - Color: Color, - math: ColorMath, - interpret: interpret -}; -var controllers = { - Controller: Controller, - BooleanController: BooleanController, - OptionController: OptionController, - StringController: StringController, - NumberController: NumberController, - NumberControllerBox: NumberControllerBox, - NumberControllerSlider: NumberControllerSlider, - FunctionController: FunctionController, - ColorController: ColorController -}; -var dom$1 = { dom: dom }; -var gui = { GUI: GUI }; -var GUI$1 = GUI; -var index = { - color: color, - controllers: controllers, - dom: dom$1, - gui: gui, - GUI: GUI$1 -}; - -exports.color = color; -exports.controllers = controllers; -exports.dom = dom$1; -exports.gui = gui; -exports.GUI = GUI$1; -exports['default'] = index; - -Object.defineProperty(exports, '__esModule', { value: true }); - -}))); -//# sourceMappingURL=dat.gui.js.map diff --git a/build/dat.gui.js.map b/build/dat.gui.js.map deleted file mode 100644 index eb8553546..000000000 --- a/build/dat.gui.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dat.gui.js","sources":["../src/dat/color/toString.js","../src/dat/utils/common.js","../src/dat/color/interpret.js","../src/dat/color/math.js","../src/dat/color/Color.js","../src/dat/controllers/Controller.js","../src/dat/dom/dom.js","../src/dat/controllers/BooleanController.js","../src/dat/controllers/OptionController.js","../src/dat/controllers/StringController.js","../src/dat/controllers/NumberController.js","../src/dat/controllers/NumberControllerBox.js","../src/dat/controllers/NumberControllerSlider.js","../src/dat/controllers/FunctionController.js","../src/dat/controllers/ColorController.js","../src/dat/utils/css.js","../src/dat/gui/saveDialogue.html.js","../src/dat/controllers/ControllerFactory.js","../src/dat/utils/requestAnimationFrame.js","../src/dat/dom/CenteredDiv.js","../src/dat/gui/GUI.js","../src/dat/index.js"],"sourcesContent":["/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nexport default function(color, forceCSSHex) {\n const colorFormat = color.__state.conversionName.toString();\n\n const r = Math.round(color.r);\n const g = Math.round(color.g);\n const b = Math.round(color.b);\n const a = color.a;\n const h = Math.round(color.h);\n const s = color.s.toFixed(1);\n const v = color.v.toFixed(1);\n\n if (forceCSSHex || (colorFormat === 'THREE_CHAR_HEX') || (colorFormat === 'SIX_CHAR_HEX')) {\n let str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n\n return 'unknown format';\n}\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nconst ARR_EACH = Array.prototype.forEach;\nconst ARR_SLICE = Array.prototype.slice;\n\n/**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\nconst Common = {\n BREAK: {},\n\n extend: function(target) {\n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n const keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function(key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n\n return target;\n },\n\n defaults: function(target) {\n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n const keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function(key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n\n return target;\n },\n\n compose: function() {\n const toCall = ARR_SLICE.call(arguments);\n return function() {\n let args = ARR_SLICE.call(arguments);\n for (let i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n\n each: function(obj, itr, scope) {\n if (!obj) {\n return;\n }\n\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n let key;\n let l;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (const key in obj) {\n if (itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n }\n },\n\n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n\n // if the function is called repeatedly, wait until threshold passes until we execute the function\n debounce: function(func, threshold, callImmediately) {\n let timeout;\n\n return function() {\n const obj = this;\n const args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n\n const callNow = callImmediately || !timeout;\n\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n\n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n\n isNull: function(obj) {\n return obj === null;\n },\n\n isNaN: function(obj) {\n return isNaN(obj);\n },\n\n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n\n isObject: function(obj) {\n return obj === Object(obj);\n },\n\n isNumber: function(obj) {\n return obj === obj + 0;\n },\n\n isString: function(obj) {\n return obj === obj + '';\n },\n\n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n\n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n\n};\n\nexport default Common;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport toString from './toString';\nimport common from '../utils/common';\n\nconst INTERPRETATIONS = [\n // Strings\n {\n litmus: common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function(original) {\n const test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString(), 0)\n };\n },\n\n write: toString\n },\n\n SIX_CHAR_HEX: {\n read: function(original) {\n const test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n\n write: toString\n },\n\n CSS_RGB: {\n read: function(original) {\n const test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n\n write: toString\n },\n\n CSS_RGBA: {\n read: function(original) {\n const test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n\n write: toString\n }\n }\n },\n\n // Numbers\n {\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n litmus: common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function(original) {\n if (original.length !== 3) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n },\n\n // Objects\n {\n litmus: common.isObject,\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n }\n];\n\nlet result;\nlet toReturn;\n\nconst interpret = function() {\n toReturn = false;\n\n const original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n common.each(INTERPRETATIONS, function(family) {\n if (family.litmus(original)) {\n common.each(family.conversions, function(conversion, conversionName) {\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n }\n });\n\n return common.BREAK;\n }\n });\n\n return toReturn;\n};\n\nexport default interpret;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nlet tmpComponent;\n\nconst ColorMath = {\n hsv_to_rgb: function(h, s, v) {\n const hi = Math.floor(h / 60) % 6;\n\n const f = h / 60 - Math.floor(h / 60);\n const p = v * (1.0 - s);\n const q = v * (1.0 - (f * s));\n const t = v * (1.0 - ((1.0 - f) * s));\n\n const c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n\n rgb_to_hsv: function(r, g, b) {\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n const delta = max - min;\n let h;\n let s;\n\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n let hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~(0xFF << tmpComponent));\n }\n};\n\nexport default ColorMath;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport interpret from './interpret';\nimport math from './math';\nimport colorToString from './toString';\nimport common from '../utils/common';\n\nclass Color {\n constructor() {\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n\n this.__state.a = this.__state.a || 1;\n }\n\n toString() {\n return colorToString(this);\n }\n\n toHexString() {\n return colorToString(this, true);\n }\n\n toOriginal() {\n return this.__state.conversion.write(this);\n }\n}\n\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n Color.recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n },\n\n set: function(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n }\n });\n}\n\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n\n Color.recalculateHSV(this);\n\n return this.__state[component];\n },\n\n set: function(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n }\n });\n}\n\n\nColor.recalculateRGB = function(color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\n\nColor.recalculateHSV = function(color) {\n const result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\n\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\n\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\n\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\n\nObject.defineProperty(Color.prototype, 'a', {\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n});\n\nObject.defineProperty(Color.prototype, 'hex', {\n get: function() {\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n },\n\n set: function(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nexport default Color;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass Controller {\n constructor(object, property) {\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n }\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {Controller} this\n */\n onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {Controller} this\n */\n onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n\n this.updateDisplay();\n return this;\n }\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue() {\n return this.object[this.property];\n }\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {Controller} this\n */\n updateDisplay() {\n return this;\n }\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified() {\n return this.initialValue !== this.getValue();\n }\n}\n\nexport default Controller;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport common from '../utils/common';\n\nconst EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\n\nconst EVENT_MAP_INV = {};\ncommon.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n});\n\nconst CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\nfunction cssValueToPixels(val) {\n if (val === '0' || common.isUndefined(val)) {\n return 0;\n }\n\n const match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n}\n\n/**\n * @namespace\n * @member dat.dom\n */\nconst dom = {\n\n /**\n *\n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vert\n */\n makeFullscreen: function(elem, hor, vert) {\n let vertical = vert;\n let horizontal = hor;\n\n if (common.isUndefined(horizontal)) {\n horizontal = true;\n }\n\n if (common.isUndefined(vertical)) {\n vertical = true;\n }\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, pars, aux) {\n const params = pars || {};\n const className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n const evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n const clientX = params.x || params.clientX || 0;\n const clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, // screen X\n 0, // screen Y\n clientX, // client X\n clientY, // client Y\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n const init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, newBool) {\n const bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, newBool) {\n const bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n const classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n const classes = elem.className.split(/ +/);\n const index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n const style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style.width);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n const style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style.height);\n },\n\n /**\n *\n * @param el\n */\n getOffset: function(el) {\n let elem = el;\n const offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n *\n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n\n};\n\nexport default dom;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a checkbox input to alter the boolean property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass BooleanController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n const _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n }\n\n setValue(v) {\n const toReturn = super.setValue(v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n\n updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n\n return super.updateDisplay();\n }\n}\n\nexport default BooleanController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\n/**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n */\nclass OptionController extends Controller {\n constructor(object, property, opts) {\n super(object, property);\n\n let options = opts;\n\n const _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n const map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n const opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n const desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n }\n\n setValue(v) {\n const toReturn = super.setValue(v);\n\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n\n updateDisplay() {\n if (dom.isActive(this.__select)) return this; // prevent number from updating if user is trying to manually update\n this.__select.value = this.getValue();\n return super.updateDisplay();\n }\n}\n\nexport default OptionController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass StringController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n const _this = this;\n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n }\n\n updateDisplay() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return super.updateDisplay();\n }\n}\n\nexport default StringController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport common from '../utils/common';\n\nfunction numDecimals(x) {\n const _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n\n return 0;\n}\n\n/**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n */\nclass NumberController extends Controller {\n constructor(object, property, params) {\n super(object, property);\n\n const _params = params || {};\n\n this.__min = _params.min;\n this.__max = _params.max;\n this.__step = _params.step;\n\n if (common.isUndefined(this.__step)) {\n if (this.initialValue === 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n this.__impliedStep = this.__step;\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n }\n\n setValue(v) {\n let _v = v;\n\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n\n return super.setValue(_v);\n }\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min(minValue) {\n this.__min = minValue;\n return this;\n }\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n}\n\nexport default NumberController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport NumberController from './NumberController';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nfunction roundToDecimal(value, decimals) {\n const tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\n\n/**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n */\nclass NumberControllerBox extends NumberController {\n constructor(object, property, params) {\n super(object, property, params);\n\n this.__truncationSuspended = false;\n\n const _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n let prevY;\n\n function onChange() {\n const attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onBlur() {\n onFinish();\n }\n\n function onMouseDrag(e) {\n const diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prevY = e.clientY;\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n // When pressing enter, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n }\n\n updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return super.updateDisplay();\n }\n}\n\nexport default NumberControllerBox;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport NumberController from './NumberController';\nimport dom from '../dom/dom';\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\n\n/**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n */\nclass NumberControllerSlider extends NumberController {\n constructor(object, property, min, max, step) {\n super(object, property, { min: min, max: max, step: step });\n\n const _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n dom.bind(this.__background, 'touchstart', onTouchStart);\n\n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n document.activeElement.blur();\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n e.preventDefault();\n\n const bgRect = _this.__background.getBoundingClientRect();\n\n _this.setValue(\n map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)\n );\n\n return false;\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onTouchStart(e) {\n if (e.touches.length !== 1) { return; }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n\n function onTouchMove(e) {\n const clientX = e.touches[0].clientX;\n const bgRect = _this.__background.getBoundingClientRect();\n\n _this.setValue(\n map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)\n );\n }\n\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n }\n\n updateDisplay() {\n const pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return super.updateDisplay();\n }\n}\n\nexport default NumberControllerSlider;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass FunctionController extends Controller {\n constructor(object, property, text) {\n super(object, property);\n\n const _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n }\n\n fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n}\n\nexport default FunctionController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\nimport Color from '../color/Color';\nimport interpret from '../color/interpret';\nimport common from '../utils/common';\n\n/**\n * @class Represents a given property of an object that is a color.\n * @param {Object} object\n * @param {string} property\n */\nclass ColorController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n const _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(/* e */) {\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(/* e */) {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n\n dom.bind(this.__selector, 'touchstart', function(/* e */) {\n dom\n .addClass(this, 'drag')\n .bind(window, 'touchend', function(/* e */) {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n\n const valueField = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n\n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__saturation_field, 'touchstart', fieldDown);\n\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'touchstart', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', fieldDownH);\n dom.bind(this.__hue_field, 'touchstart', fieldDownH);\n\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n\n function onBlur() {\n const i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n\n this.__saturation_field.appendChild(valueField);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) { e.preventDefault(); }\n\n const fieldRect = _this.__saturation_field.getBoundingClientRect();\n const { clientX, clientY } = (e.touches && e.touches[0]) || e;\n let s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n let v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n }\n\n function setH(e) {\n if (e.type.indexOf('touch') === -1) { e.preventDefault(); }\n\n const fieldRect = _this.__hue_field.getBoundingClientRect();\n const { clientY } = (e.touches && e.touches[0]) || e;\n let h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n }\n }\n\n updateDisplay() {\n const i = interpret(this.getValue());\n\n if (i !== false) {\n let mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) && !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n const flip = (this.__color.v < 0.5 || this.__color.s > 0.5) ? 255 : 0;\n const _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n\n this.__input.value = this.__color.toString();\n\n common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n}\n\nconst vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\n\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\n\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nexport default ColorController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nconst css = {\n load: function(url, indoc) {\n const doc = indoc || document;\n const link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n\n inject: function(cssContent, indoc) {\n const doc = indoc || document;\n const injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n const head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) { // Unable to inject CSS, probably because of a Content Security Policy\n }\n }\n};\n\nexport default css;\n","const saveDialogContents = `
\n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n
`;\n\nexport default saveDialogContents;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport OptionController from './OptionController';\nimport NumberControllerBox from './NumberControllerBox';\nimport NumberControllerSlider from './NumberControllerSlider';\nimport StringController from './StringController';\nimport FunctionController from './FunctionController';\nimport BooleanController from './BooleanController';\nimport common from '../utils/common';\n\nconst ControllerFactory = function(object, property) {\n const initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n if (common.isNumber(initialValue)) {\n // Has min and max? (slider)\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n // has step?\n if (common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property,\n arguments[2], arguments[3], arguments[4]);\n }\n\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n\n // number box\n if (common.isNumber(arguments[4])) { // has step\n return new NumberControllerBox(object, property,\n { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n return null;\n};\n\nexport default ControllerFactory;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\n\nexport default window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n requestAnimationFrame;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nclass CenteredDiv {\n constructor() {\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n const _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n }\n\n show() {\n const _this = this;\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n\n /**\n * Hide centered div\n */\n hide() {\n const _this = this;\n\n const hide = function() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n\n layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n}\n\nexport default CenteredDiv;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport css from '../utils/css';\nimport saveDialogueContents from './saveDialogue.html';\nimport ControllerFactory from '../controllers/ControllerFactory';\nimport Controller from '../controllers/Controller';\nimport BooleanController from '../controllers/BooleanController';\nimport FunctionController from '../controllers/FunctionController';\nimport NumberControllerBox from '../controllers/NumberControllerBox';\nimport NumberControllerSlider from '../controllers/NumberControllerSlider';\nimport ColorController from '../controllers/ColorController';\nimport requestAnimationFrame from '../utils/requestAnimationFrame';\nimport CenteredDiv from '../dom/CenteredDiv';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nimport styleSheet from './style.scss'; // CSS to embed in build\n\ncss.inject(styleSheet);\n\n/** @ignore Outer-most className for GUI's */\nconst CSS_NAMESPACE = 'dg';\n\nconst HIDE_KEY_CODE = 72;\n\n/** @ignore The only value shared between the JS and SCSS. Use caution. */\nconst CLOSE_BUTTON_HEIGHT = 20;\n\nconst DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\nconst SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}());\n\nlet SAVE_DIALOGUE;\n\n/** @ignore Have we yet to create an autoPlace GUI? */\nlet autoPlaceVirgin = true;\n\n/** @ignore Fixed position div that auto place GUI's go inside */\nlet autoPlaceContainer;\n\n/** @ignore Are we hiding the GUI's ? */\nlet hide = false;\n\n/** @private GUI's which should be hidden */\nconst hideableGuis = [];\n\n/**\n * @class A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n *\n * @typicalname gui\n *\n * @example\n * // Creating a GUI with options.\n * var gui = new dat.GUI({name: 'My GUI'});\n *\n * @example\n * // Creating a GUI and a subfolder.\n * var gui = new dat.GUI();\n * var folder1 = gui.addFolder('Flow Field');\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.autoPlace=true]\n * @param {Boolean} [params.hideable=true] If true, GUI is shown/hidden by h keypress.\n * @param {Boolean} [params.closed=false] If true, starts closed\n * @param {Boolean} [params.closeOnTop=false] If true, close/open button shows on top of the GUI\n */\nconst GUI = function(pars) {\n const _this = this;\n\n let params = pars || {};\n\n /**\n * Outermost DOM Element\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n // Default parameters\n params = common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n if (!common.isUndefined(params.load)) {\n // Explicit preset\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n let useLocalStorage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n let saveToLocalStorage;\n let titleRow;\n\n Object.defineProperties(this,\n /** @lends GUI.prototype */\n {\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * Handles GUI's position of open/close button\n * @type Boolean\n */\n closeOnTop: {\n get: function() {\n return params.closeOnTop;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n\n return params.load.preset;\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return useLocalStorage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n\n const savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n\n dom.bind(this.__closeButton, 'click', function() {\n _this.closed = !_this.closed;\n });\n // Oh, you're a nested GUI!\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n const titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n\n titleRow = addRow(_this, titleRowName);\n\n const onClickTitle = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n\n if (!params.closed) {\n this.closed = false;\n }\n }\n\n if (params.autoPlace) {\n if (common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n\n // Put it in the dom for you.\n autoPlaceContainer.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n\n\n // Make it not elastic.\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n\n this.__resizeHandler = function() {\n _this.onResizeDebounced();\n };\n\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n saveToLocalStorage = function() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n\n // expose this method publicly\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n\n function resetWidth() {\n const root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n};\n\nGUI.toggleHide = function() {\n hide = !hide;\n common.each(hideableGuis, function(gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\n\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\n\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\n\nGUI._keydownHandler = function(e) {\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\n\ncommon.extend(\n GUI.prototype,\n\n /** @lends GUI.prototype */\n {\n\n /**\n * Adds a new {@link Controller} to the GUI. The type of controller created\n * is inferred from the initial value of object[property]. For\n * color properties, see {@link addColor}.\n *\n * @param {Object} object The object to be manipulated\n * @param {String} property The name of the property to be manipulated\n * @param {Number} [min] Minimum allowed value\n * @param {Number} [max] Maximum allowed value\n * @param {Number} [step] Increment by which to change value\n * @returns {Controller} The controller that was added to the GUI.\n * @instance\n *\n * @example\n * // Add a string controller.\n * var person = {name: 'Sam'};\n * gui.add(person, 'name');\n *\n * @example\n * // Add a number controller slider.\n * var person = {age: 45};\n * gui.add(person, 'age', 0, 100);\n */\n add: function(object, property) {\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n },\n\n /**\n * Adds a new color controller to the GUI.\n *\n * @param object\n * @param property\n * @returns {Controller} The controller that was added to the GUI.\n * @instance\n *\n * @example\n * var palette = {\n * color1: '#FF0000', // CSS string\n * color2: [ 0, 128, 255 ], // RGB array\n * color3: [ 0, 128, 255, 0.3 ], // RGB with alpha\n * color4: { h: 350, s: 0.9, v: 0.3 } // Hue, saturation, value\n * };\n * gui.addColor(palette, 'color1');\n * gui.addColor(palette, 'color2');\n * gui.addColor(palette, 'color3');\n * gui.addColor(palette, 'color4');\n */\n addColor: function(object, property) {\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n },\n\n /**\n * Removes the given controller from the GUI.\n * @param {Controller} controller\n * @instance\n */\n remove: function(controller) {\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n const _this = this;\n common.defer(function() {\n _this.onResize();\n });\n },\n\n /**\n * Removes the root GUI from the document and unbinds all event listeners.\n * For subfolders, use `gui.removeFolder(folder)` instead.\n * @instance\n */\n destroy: function() {\n if (this.parent) {\n throw new Error(\n 'Only the root GUI should be removed with .destroy(). ' +\n 'For subfolders, use gui.removeFolder(folder) instead.'\n );\n }\n\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n\n const _this = this;\n common.each(this.__folders, function(subfolder) {\n _this.removeFolder(subfolder);\n });\n\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n\n removeListeners(this);\n },\n\n /**\n * Creates a new subfolder GUI instance.\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n const newGuiParams = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n newGuiParams.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n // Start me closed if I was closed\n newGuiParams.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n newGuiParams.load = this.load.folders[name];\n }\n\n const gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n\n const li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n\n /**\n * Removes a subfolder GUI instance.\n * @param {dat.gui.GUI} folder The folder to remove.\n * @instance\n */\n removeFolder: function(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n\n delete this.__folders[folder.name];\n\n // Do we have saved appearance data for this folder?\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n\n removeListeners(folder);\n\n const _this = this;\n\n common.each(folder.__folders, function(subfolder) {\n folder.removeFolder(subfolder);\n });\n\n common.defer(function() {\n _this.onResize();\n });\n },\n\n /**\n * Opens the GUI.\n */\n open: function() {\n this.closed = false;\n },\n\n /**\n * Closes the GUI.\n */\n close: function() {\n this.closed = true;\n },\n\n /**\n * Hides the GUI.\n */\n hide: function() {\n this.domElement.style.display = 'none';\n },\n\n /**\n * Shows the GUI.\n */\n show: function() {\n this.domElement.style.display = '';\n },\n\n\n onResize: function() {\n // we debounce this function to prevent performance issues when rotating on tablet/mobile\n const root = this.getRoot();\n if (root.scrollable) {\n const top = dom.getOffset(root.__ul).top;\n let h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n\n onResizeDebounced: common.debounce(function() { this.onResize(); }, 50),\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {...Object} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n * @ignore\n */\n remember: function() {\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n\n const _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n let gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n const toReturn = this.load;\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n },\n\n save: function() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n\n saveAs: function(presetName) {\n if (!this.load.remembered) {\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n\n revert: function(gui) {\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n\n // fire onFinishChange callback\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n\n listen: function(controller) {\n const init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n\n updateDisplay: function() {\n common.each(this.__controllers, function(controller) {\n controller.updateDisplay();\n });\n common.each(this.__folders, function(folder) {\n folder.updateDisplay();\n });\n }\n }\n);\n\n/**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [newDom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n *\n * @ignore\n */\nfunction addRow(gui, newDom, liBefore) {\n const li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\n\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\n\nfunction markPresetModified(gui, modified) {\n const opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\n\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, /** @lends Controller.prototype */ {\n /**\n * @param {Array|Object} options\n * @return {Controller}\n */\n options: function(options) {\n if (arguments.length > 1) {\n const nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: nextSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n const nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: nextSibling,\n factoryArgs: [options]\n }\n );\n }\n },\n\n /**\n * Sets the name of the controller.\n * @param {string} name\n * @return {Controller}\n */\n name: function(name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = name;\n return controller;\n },\n\n /**\n * Sets controller to listen for changes on its underlying object.\n * @return {Controller}\n */\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n /**\n * Removes the controller from its parent GUI.\n * @return {Controller}\n */\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n const box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function(method) {\n const pc = controller[method];\n const pb = box[method];\n controller[method] = box[method] = function() {\n const args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n const r = function(returned) {\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n // Well, then lets just replace this with a slider.\n\n // lets remember if the old controller had a specific name or was listening\n const oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n const wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n\n controller.remove();\n const newController = add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n newController.name(oldName);\n if (wasListening) newController.listen();\n\n return newController;\n }\n\n return returned;\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n }\n\n controller.setValue = common.compose(function(val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n\n return val;\n }, controller.setValue);\n}\n\nfunction recallSavedValue(gui, controller) {\n // Find the topmost GUI, that's where remembered objects live.\n const root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n const matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matchedIndex !== -1) {\n // Let me fetch a map of controllers for thcommon.isObject.\n let controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] =\n controllerMap;\n }\n\n // Keep track of this controller\n controllerMap[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n const presetMap = root.load.remembered;\n\n // Which preset are we trying to load?\n let preset;\n\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n // Uhh, you can have the default instead?\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n // Nada.\n return;\n }\n\n // Did the loaded object remember thcommon.isObject? && Did we remember this particular property?\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n // We did remember something for this guy ...\n const value = preset[matchedIndex][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\n\nfunction add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error(`Object \"${object}\" has no property \"${property}\"`);\n }\n\n let controller;\n\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n const factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n const name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n const container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n const li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, typeof controller.getValue());\n }\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n}\n\nfunction getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n}\n\nfunction addPresetOption(gui, name, setSelected) {\n const opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\n\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\n\nfunction addSaveMenu(gui) {\n const div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n const gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n const button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n const button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n const button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n const select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n for (let index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n const explain = document.getElementById('dg-local-explain');\n const localStorageCheckBox = document.getElementById('dg-local-storage');\n const saveLocally = document.getElementById('dg-save-locally');\n\n saveLocally.style.display = 'block';\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n showHideExplain(gui, explain);\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n\n const newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n const presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n // div.appendChild(button2);\n}\n\nfunction addResizeHandle(gui) {\n let pmouseX;\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n // border: '1px solid blue'\n\n });\n\n function drag(e) {\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n }\n\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n\n function dragStart(e) {\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n }\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\n\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\n\nfunction getCurrentPreset(gui, useInitialValues) {\n const toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n const savedValues = {};\n\n // The controllers I've made for thcommon.isObject by property\n const controllerMap =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controllerMap, function(controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = savedValues;\n });\n\n return toReturn;\n}\n\nfunction setPresetSelectIndex(gui) {\n for (let index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\n\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame.call(window, function() {\n updateDisplays(controllerArray);\n });\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n}\n\nexport default GUI;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Color from './color/Color';\nimport math from './color/math';\nimport interpret from './color/interpret';\n\nimport Controller from './controllers/Controller';\nimport BooleanController from './controllers/BooleanController';\nimport OptionController from './controllers/OptionController';\nimport StringController from './controllers/StringController';\nimport NumberController from './controllers/NumberController';\nimport NumberControllerBox from './controllers/NumberControllerBox';\nimport NumberControllerSlider from './controllers/NumberControllerSlider';\nimport FunctionController from './controllers/FunctionController';\nimport ColorController from './controllers/ColorController';\n\nimport domImport from './dom/dom';\nimport GUIImport from './gui/GUI';\n\nexport const color = {\n Color: Color,\n math: math,\n interpret: interpret\n};\n\nexport const controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\n\nexport const dom = { dom: domImport };\n\nexport const gui = { GUI: GUIImport };\n\nexport const GUI = GUIImport;\n\nexport default {\n color,\n controllers,\n dom,\n gui,\n GUI\n};\n"],"names":["color","forceCSSHex","colorFormat","__state","conversionName","toString","r","Math","round","g","b","a","h","s","toFixed","v","str","hex","length","ARR_EACH","Array","prototype","forEach","ARR_SLICE","slice","Common","target","each","call","arguments","obj","keys","isObject","Object","key","isUndefined","bind","toCall","args","i","apply","itr","scope","l","BREAK","fnc","func","threshold","callImmediately","timeout","delayed","callNow","setTimeout","toArray","undefined","isNaN","isArray","constructor","INTERPRETATIONS","common","isString","original","test","match","parseInt","parseFloat","isNumber","result","toReturn","interpret","family","litmus","conversions","conversion","read","tmpComponent","ColorMath","hi","floor","f","p","q","t","c","min","max","delta","NaN","hex_with_component","componentIndex","value","Color","Error","colorToString","write","defineRGBComponent","component","componentHexIndex","defineProperty","space","recalculateRGB","defineHSVComponent","recalculateHSV","math","component_from_hex","extend","hsv_to_rgb","rgb_to_hsv","COMPONENTS","rgb_to_hex","Controller","object","property","initialValue","domElement","document","createElement","__onChange","__onFinishChange","newValue","updateDisplay","getValue","EVENT_MAP","EVENT_MAP_INV","k","e","CSS_VALUE_PIXELS","cssValueToPixels","val","isNull","dom","elem","selectable","style","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","hor","vert","vertical","horizontal","position","left","right","top","bottom","eventType","pars","aux","params","className","evt","createEvent","clientX","x","clientY","y","initMouseEvent","bubbles","cancelable","window","clickCount","init","initKeyboardEvent","initKeyEvent","defaults","ctrlKey","altKey","shiftKey","metaKey","keyCode","charCode","initEvent","dispatchEvent","event","newBool","bool","addEventListener","attachEvent","removeEventListener","detachEvent","classes","split","indexOf","push","join","replace","removeAttribute","index","splice","RegExp","getComputedStyle","width","height","el","offset","offsetParent","offsetLeft","offsetTop","activeElement","type","href","BooleanController","_this","__prev","__checkbox","setAttribute","onChange","setValue","appendChild","checked","OptionController","opts","options","__select","map","element","opt","innerHTML","desiredValue","selectedIndex","isActive","StringController","__input","onBlur","blur","numDecimals","_x","NumberController","_params","__min","__max","__step","step","__impliedStep","pow","log","abs","LN10","__precision","_v","minValue","maxValue","stepValue","roundToDecimal","decimals","tenTo","NumberControllerBox","__truncationSuspended","prevY","attempted","onFinish","onMouseDrag","diff","onMouseUp","unbind","onMouseDown","i1","i2","o1","o2","NumberControllerSlider","__background","__foreground","onTouchStart","addClass","preventDefault","bgRect","getBoundingClientRect","touches","onTouchMove","onTouchEnd","pct","FunctionController","text","__button","fire","ColorController","__color","__temp","makeSelectable","__selector","__saturation_field","__field_knob","__field_knob_border","__hue_knob","__hue_field","__input_textShadow","removeClass","valueField","fieldDown","fieldDownH","setSV","fieldUpSV","setH","fieldUpH","toOriginal","fieldRect","mismatch","flip","_flip","toHexString","marginTop","vendors","linearGradient","background","vendor","cssText","hueGradient","css","url","indoc","doc","link","rel","getElementsByTagName","cssContent","injected","head","saveDialogContents","ControllerFactory","isFunction","isBoolean","requestAnimationFrame","callback","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","CenteredDiv","backgroundElement","makeFullscreen","body","hide","display","opacity","webkitTransform","layout","defer","innerWidth","getWidth","innerHeight","getHeight","inject","styleSheet","CSS_NAMESPACE","HIDE_KEY_CODE","CLOSE_BUTTON_HEIGHT","DEFAULT_DEFAULT_PRESET_NAME","SUPPORTS_LOCAL_STORAGE","localStorage","SAVE_DIALOGUE","autoPlaceVirgin","autoPlaceContainer","hideableGuis","GUI","__ul","__folders","__controllers","__rememberedObjects","__rememberedObjectIndecesToControllers","__listening","DEFAULT_WIDTH","autoPlace","load","preset","parent","hideable","resizable","scrollable","useLocalStorage","getItem","getLocalStorageHash","saveToLocalStorage","titleRow","defineProperties","closeOnTop","getRoot","revert","name","closed","CLASS_CLOSED","onResize","__closeButton","TEXT_OPEN","TEXT_CLOSED","setItem","CLASS_MAIN","savedGui","JSON","parse","CLASS_CLOSE_BUTTON","CLASS_CLOSE_TOP","insertBefore","childNodes","CLASS_CLOSE_BOTTOM","titleRowName","createTextNode","addRow","onClickTitle","CLASS_AUTO_PLACE_CONTAINER","CLASS_AUTO_PLACE","__resizeHandler","onResizeDebounced","stringify","getSaveObject","saveToLocalStorageIfPossible","resetWidth","root","toggleHide","gui","CLASS_CONTROLLER_ROW","CLASS_TOO_TALL","CLASS_DRAG","_keydownHandler","which","add","controller","removeChild","__li","subfolder","removeFolder","newGuiParams","folders","li","folder","parentElement","getOffset","node","__save_row","__resize_handle","offsetHeight","debounce","saveDialogueContents","remembered","getCurrentPreset","presetName","newDom","liBefore","removeListeners","markPresetModified","modified","__preset_select","augmentController","__gui","nextSibling","nextElementSibling","remove","firstElementChild","listen","box","method","pc","pb","returned","oldName","wasListening","newController","compose","fakeEvent","stopPropagation","borderLeftColor","isModified","recallSavedValue","matchedIndex","controllerMap","presetMap","factoryArgs","concat","before","container","location","addPresetOption","setSelected","showHideExplain","explain","addSaveMenu","div","firstChild","gears","button","button2","button3","select","getElementById","localStorageCheckBox","saveLocally","newConstructorTextArea","show","focus","save","prompt","saveAs","addResizeHandle","pmouseX","drag","dragStop","dragStart","setWidth","w","useInitialValues","savedValues","setPresetSelectIndex","updateDisplays","controllerArray","controllers","domImport","GUIImport"],"mappings":"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"} \ No newline at end of file diff --git a/build/dat.gui.min.js b/build/dat.gui.min.js deleted file mode 100644 index 1398e14ab..000000000 --- a/build/dat.gui.min.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.dat={})}(this,function(e){"use strict";function t(e,t){var n=e.__state.conversionName.toString(),o=Math.round(e.r),i=Math.round(e.g),r=Math.round(e.b),s=e.a,a=Math.round(e.h),l=e.s.toFixed(1),d=e.v.toFixed(1);if(t||"THREE_CHAR_HEX"===n||"SIX_CHAR_HEX"===n){for(var c=e.hex.toString(16);c.length<6;)c="0"+c;return"#"+c}return"CSS_RGB"===n?"rgb("+o+","+i+","+r+")":"CSS_RGBA"===n?"rgba("+o+","+i+","+r+","+s+")":"HEX"===n?"0x"+e.hex.toString(16):"RGB_ARRAY"===n?"["+o+","+i+","+r+"]":"RGBA_ARRAY"===n?"["+o+","+i+","+r+","+s+"]":"RGB_OBJ"===n?"{r:"+o+",g:"+i+",b:"+r+"}":"RGBA_OBJ"===n?"{r:"+o+",g:"+i+",b:"+r+",a:"+s+"}":"HSV_OBJ"===n?"{h:"+a+",s:"+l+",v:"+d+"}":"HSVA_OBJ"===n?"{h:"+a+",s:"+l+",v:"+d+",a:"+s+"}":"unknown format"}function n(e,t,n){Object.defineProperty(e,t,{get:function(){return"RGB"===this.__state.space?this.__state[t]:(I.recalculateRGB(this,t,n),this.__state[t])},set:function(e){"RGB"!==this.__state.space&&(I.recalculateRGB(this,t,n),this.__state.space="RGB"),this.__state[t]=e}})}function o(e,t){Object.defineProperty(e,t,{get:function(){return"HSV"===this.__state.space?this.__state[t]:(I.recalculateHSV(this),this.__state[t])},set:function(e){"HSV"!==this.__state.space&&(I.recalculateHSV(this),this.__state.space="HSV"),this.__state[t]=e}})}function i(e){if("0"===e||S.isUndefined(e))return 0;var t=e.match(U);return S.isNull(t)?0:parseFloat(t[1])}function r(e){var t=e.toString();return t.indexOf(".")>-1?t.length-t.indexOf(".")-1:0}function s(e,t){var n=Math.pow(10,t);return Math.round(e*n)/n}function a(e,t,n,o,i){return o+(e-t)/(n-t)*(i-o)}function l(e,t,n,o){e.style.background="",S.each(ee,function(i){e.style.cssText+="background: "+i+"linear-gradient("+t+", "+n+" 0%, "+o+" 100%); "})}function d(e){e.style.background="",e.style.cssText+="background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);",e.style.cssText+="background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);"}function c(e,t,n){var o=document.createElement("li");return t&&o.appendChild(t),n?e.__ul.insertBefore(o,n):e.__ul.appendChild(o),e.onResize(),o}function u(e){X.unbind(window,"resize",e.__resizeHandler),e.saveToLocalStorageIfPossible&&X.unbind(window,"unload",e.saveToLocalStorageIfPossible)}function _(e,t){var n=e.__preset_select[e.__preset_select.selectedIndex];n.innerHTML=t?n.value+"*":n.value}function h(e,t,n){if(n.__li=t,n.__gui=e,S.extend(n,{options:function(t){if(arguments.length>1){var o=n.__li.nextElementSibling;return n.remove(),f(e,n.object,n.property,{before:o,factoryArgs:[S.toArray(arguments)]})}if(S.isArray(t)||S.isObject(t)){var i=n.__li.nextElementSibling;return n.remove(),f(e,n.object,n.property,{before:i,factoryArgs:[t]})}},name:function(e){return n.__li.firstElementChild.firstElementChild.innerHTML=e,n},listen:function(){return n.__gui.listen(n),n},remove:function(){return n.__gui.remove(n),n}}),n instanceof q){var o=new Q(n.object,n.property,{min:n.__min,max:n.__max,step:n.__step});S.each(["updateDisplay","onChange","onFinishChange","step","min","max"],function(e){var t=n[e],i=o[e];n[e]=o[e]=function(){var e=Array.prototype.slice.call(arguments);return i.apply(o,e),t.apply(n,e)}}),X.addClass(t,"has-slider"),n.domElement.insertBefore(o.domElement,n.domElement.firstElementChild)}else if(n instanceof Q){var i=function(t){if(S.isNumber(n.__min)&&S.isNumber(n.__max)){var o=n.__li.firstElementChild.firstElementChild.innerHTML,i=n.__gui.__listening.indexOf(n)>-1;n.remove();var r=f(e,n.object,n.property,{before:n.__li.nextElementSibling,factoryArgs:[n.__min,n.__max,n.__step]});return r.name(o),i&&r.listen(),r}return t};n.min=S.compose(i,n.min),n.max=S.compose(i,n.max)}else n instanceof K?(X.bind(t,"click",function(){X.fakeEvent(n.__checkbox,"click")}),X.bind(n.__checkbox,"click",function(e){e.stopPropagation()})):n instanceof Z?(X.bind(t,"click",function(){X.fakeEvent(n.__button,"click")}),X.bind(t,"mouseover",function(){X.addClass(n.__button,"hover")}),X.bind(t,"mouseout",function(){X.removeClass(n.__button,"hover")})):n instanceof $&&(X.addClass(t,"color"),n.updateDisplay=S.compose(function(e){return t.style.borderLeftColor=n.__color.toString(),e},n.updateDisplay),n.updateDisplay());n.setValue=S.compose(function(t){return e.getRoot().__preset_select&&n.isModified()&&_(e.getRoot(),!0),t},n.setValue)}function p(e,t){var n=e.getRoot(),o=n.__rememberedObjects.indexOf(t.object);if(-1!==o){var i=n.__rememberedObjectIndecesToControllers[o];if(void 0===i&&(i={},n.__rememberedObjectIndecesToControllers[o]=i),i[t.property]=t,n.load&&n.load.remembered){var r=n.load.remembered,s=void 0;if(r[e.preset])s=r[e.preset];else{if(!r[se])return;s=r[se]}if(s[o]&&void 0!==s[o][t.property]){var a=s[o][t.property];t.initialValue=a,t.setValue(a)}}}}function f(e,t,n,o){if(void 0===t[n])throw new Error('Object "'+t+'" has no property "'+n+'"');var i=void 0;if(o.color)i=new $(t,n);else{var r=[t,n].concat(o.factoryArgs);i=ne.apply(e,r)}o.before instanceof z&&(o.before=o.before.__li),p(e,i),X.addClass(i.domElement,"c");var s=document.createElement("span");X.addClass(s,"property-name"),s.innerHTML=i.property;var a=document.createElement("div");a.appendChild(s),a.appendChild(i.domElement);var l=c(e,a,o.before);return X.addClass(l,he.CLASS_CONTROLLER_ROW),i instanceof $?X.addClass(l,"color"):X.addClass(l,H(i.getValue())),h(e,l,i),e.__controllers.push(i),i}function m(e,t){return document.location.href+"."+t}function g(e,t,n){var o=document.createElement("option");o.innerHTML=t,o.value=t,e.__preset_select.appendChild(o),n&&(e.__preset_select.selectedIndex=e.__preset_select.length-1)}function b(e,t){t.style.display=e.useLocalStorage?"block":"none"}function v(e){var t=e.__save_row=document.createElement("li");X.addClass(e.domElement,"has-save"),e.__ul.insertBefore(t,e.__ul.firstChild),X.addClass(t,"save-row");var n=document.createElement("span");n.innerHTML=" ",X.addClass(n,"button gears");var o=document.createElement("span");o.innerHTML="Save",X.addClass(o,"button"),X.addClass(o,"save");var i=document.createElement("span");i.innerHTML="New",X.addClass(i,"button"),X.addClass(i,"save-as");var r=document.createElement("span");r.innerHTML="Revert",X.addClass(r,"button"),X.addClass(r,"revert");var s=e.__preset_select=document.createElement("select");if(e.load&&e.load.remembered?S.each(e.load.remembered,function(t,n){g(e,n,n===e.preset)}):g(e,se,!1),X.bind(s,"change",function(){for(var t=0;t=0;n--)t=[e[n].apply(this,t)];return t[0]}},each:function(e,t,n){if(e)if(A&&e.forEach&&e.forEach===A)e.forEach(t,n);else if(e.length===e.length+0){var o=void 0,i=void 0;for(o=0,i=e.length;o1?S.toArray(arguments):arguments[0];return S.each(O,function(t){if(t.litmus(e))return S.each(t.conversions,function(t,n){if(T=t.read(e),!1===L&&!1!==T)return L=T,T.conversionName=n,T.conversion=t,S.BREAK}),S.BREAK}),L},B=void 0,N={hsv_to_rgb:function(e,t,n){var o=Math.floor(e/60)%6,i=e/60-Math.floor(e/60),r=n*(1-t),s=n*(1-i*t),a=n*(1-(1-i)*t),l=[[n,a,r],[s,n,r],[r,n,a],[r,s,n],[a,r,n],[n,r,s]][o];return{r:255*l[0],g:255*l[1],b:255*l[2]}},rgb_to_hsv:function(e,t,n){var o=Math.min(e,t,n),i=Math.max(e,t,n),r=i-o,s=void 0,a=void 0;return 0===i?{h:NaN,s:0,v:0}:(a=r/i,s=e===i?(t-n)/r:t===i?2+(n-e)/r:4+(e-t)/r,(s/=6)<0&&(s+=1),{h:360*s,s:a,v:i/255})},rgb_to_hex:function(e,t,n){var o=this.hex_with_component(0,2,e);return o=this.hex_with_component(o,1,t),o=this.hex_with_component(o,0,n)},component_from_hex:function(e,t){return e>>8*t&255},hex_with_component:function(e,t,n){return n<<(B=8*t)|e&~(255<this.__max&&(n=this.__max),void 0!==this.__step&&n%this.__step!=0&&(n=Math.round(n/this.__step)*this.__step),j(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"setValue",this).call(this,n)}},{key:"min",value:function(e){return this.__min=e,this}},{key:"max",value:function(e){return this.__max=e,this}},{key:"step",value:function(e){return this.__step=e,this.__impliedStep=e,this.__precision=r(e),this}}]),t}(),Q=function(e){function t(e,n,o){function i(){l.__onFinishChange&&l.__onFinishChange.call(l,l.getValue())}function r(e){var t=d-e.clientY;l.setValue(l.getValue()+t*l.__impliedStep),d=e.clientY}function s(){X.unbind(window,"mousemove",r),X.unbind(window,"mouseup",s),i()}F(this,t);var a=V(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n,o));a.__truncationSuspended=!1;var l=a,d=void 0;return a.__input=document.createElement("input"),a.__input.setAttribute("type","text"),X.bind(a.__input,"change",function(){var e=parseFloat(l.__input.value);S.isNaN(e)||l.setValue(e)}),X.bind(a.__input,"blur",function(){i()}),X.bind(a.__input,"mousedown",function(e){X.bind(window,"mousemove",r),X.bind(window,"mouseup",s),d=e.clientY}),X.bind(a.__input,"keydown",function(e){13===e.keyCode&&(l.__truncationSuspended=!0,this.blur(),l.__truncationSuspended=!1,i())}),a.updateDisplay(),a.domElement.appendChild(a.__input),a}return D(t,W),P(t,[{key:"updateDisplay",value:function(){return this.__input.value=this.__truncationSuspended?this.getValue():s(this.getValue(),this.__precision),j(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}(),q=function(e){function t(e,n,o,i,r){function s(e){e.preventDefault();var t=_.__background.getBoundingClientRect();return _.setValue(a(e.clientX,t.left,t.right,_.__min,_.__max)),!1}function l(){X.unbind(window,"mousemove",s),X.unbind(window,"mouseup",l),_.__onFinishChange&&_.__onFinishChange.call(_,_.getValue())}function d(e){var t=e.touches[0].clientX,n=_.__background.getBoundingClientRect();_.setValue(a(t,n.left,n.right,_.__min,_.__max))}function c(){X.unbind(window,"touchmove",d),X.unbind(window,"touchend",c),_.__onFinishChange&&_.__onFinishChange.call(_,_.getValue())}F(this,t);var u=V(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n,{min:o,max:i,step:r})),_=u;return u.__background=document.createElement("div"),u.__foreground=document.createElement("div"),X.bind(u.__background,"mousedown",function(e){document.activeElement.blur(),X.bind(window,"mousemove",s),X.bind(window,"mouseup",l),s(e)}),X.bind(u.__background,"touchstart",function(e){1===e.touches.length&&(X.bind(window,"touchmove",d),X.bind(window,"touchend",c),d(e))}),X.addClass(u.__background,"slider"),X.addClass(u.__foreground,"slider-fg"),u.updateDisplay(),u.__background.appendChild(u.__foreground),u.domElement.appendChild(u.__background),u}return D(t,W),P(t,[{key:"updateDisplay",value:function(){var e=(this.getValue()-this.__min)/(this.__max-this.__min);return this.__foreground.style.width=100*e+"%",j(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}(),Z=function(e){function t(e,n,o){F(this,t);var i=V(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n)),r=i;return i.__button=document.createElement("div"),i.__button.innerHTML=void 0===o?"Fire":o,X.bind(i.__button,"click",function(e){return e.preventDefault(),r.fire(),!1}),X.addClass(i.__button,"button"),i.domElement.appendChild(i.__button),i}return D(t,z),P(t,[{key:"fire",value:function(){this.__onChange&&this.__onChange.call(this),this.getValue().call(this.object),this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue())}}]),t}(),$=function(e){function t(e,n){function o(e){u(e),X.bind(window,"mousemove",u),X.bind(window,"touchmove",u),X.bind(window,"mouseup",r),X.bind(window,"touchend",r)}function i(e){_(e),X.bind(window,"mousemove",_),X.bind(window,"touchmove",_),X.bind(window,"mouseup",s),X.bind(window,"touchend",s)}function r(){X.unbind(window,"mousemove",u),X.unbind(window,"touchmove",u),X.unbind(window,"mouseup",r),X.unbind(window,"touchend",r),c()}function s(){X.unbind(window,"mousemove",_),X.unbind(window,"touchmove",_),X.unbind(window,"mouseup",s),X.unbind(window,"touchend",s),c()}function a(){var e=R(this.value);!1!==e?(p.__color.__state=e,p.setValue(p.__color.toOriginal())):this.value=p.__color.toString()}function c(){p.__onFinishChange&&p.__onFinishChange.call(p,p.__color.toOriginal())}function u(e){-1===e.type.indexOf("touch")&&e.preventDefault();var t=p.__saturation_field.getBoundingClientRect(),n=e.touches&&e.touches[0]||e,o=n.clientX,i=n.clientY,r=(o-t.left)/(t.right-t.left),s=1-(i-t.top)/(t.bottom-t.top);return s>1?s=1:s<0&&(s=0),r>1?r=1:r<0&&(r=0),p.__color.v=s,p.__color.s=r,p.setValue(p.__color.toOriginal()),!1}function _(e){-1===e.type.indexOf("touch")&&e.preventDefault();var t=p.__hue_field.getBoundingClientRect(),n=1-((e.touches&&e.touches[0]||e).clientY-t.top)/(t.bottom-t.top);return n>1?n=1:n<0&&(n=0),p.__color.h=360*n,p.setValue(p.__color.toOriginal()),!1}F(this,t);var h=V(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n));h.__color=new I(h.getValue()),h.__temp=new I(0);var p=h;h.domElement=document.createElement("div"),X.makeSelectable(h.domElement,!1),h.__selector=document.createElement("div"),h.__selector.className="selector",h.__saturation_field=document.createElement("div"),h.__saturation_field.className="saturation-field",h.__field_knob=document.createElement("div"),h.__field_knob.className="field-knob",h.__field_knob_border="2px solid ",h.__hue_knob=document.createElement("div"),h.__hue_knob.className="hue-knob",h.__hue_field=document.createElement("div"),h.__hue_field.className="hue-field",h.__input=document.createElement("input"),h.__input.type="text",h.__input_textShadow="0 1px 1px ",X.bind(h.__input,"keydown",function(e){13===e.keyCode&&a.call(this)}),X.bind(h.__input,"blur",a),X.bind(h.__selector,"mousedown",function(){X.addClass(this,"drag").bind(window,"mouseup",function(){X.removeClass(p.__selector,"drag")})}),X.bind(h.__selector,"touchstart",function(){X.addClass(this,"drag").bind(window,"touchend",function(){X.removeClass(p.__selector,"drag")})});var f=document.createElement("div");return S.extend(h.__selector.style,{width:"122px",height:"102px",padding:"3px",backgroundColor:"#222",boxShadow:"0px 1px 3px rgba(0,0,0,0.3)"}),S.extend(h.__field_knob.style,{position:"absolute",width:"12px",height:"12px",border:h.__field_knob_border+(h.__color.v<.5?"#fff":"#000"),boxShadow:"0px 1px 3px rgba(0,0,0,0.5)",borderRadius:"12px",zIndex:1}),S.extend(h.__hue_knob.style,{position:"absolute",width:"15px",height:"2px",borderRight:"4px solid #fff",zIndex:1}),S.extend(h.__saturation_field.style,{width:"100px",height:"100px",border:"1px solid #555",marginRight:"3px",display:"inline-block",cursor:"pointer"}),S.extend(f.style,{width:"100%",height:"100%",background:"none"}),l(f,"top","rgba(0,0,0,0)","#000"),S.extend(h.__hue_field.style,{width:"15px",height:"100px",border:"1px solid #555",cursor:"ns-resize",position:"absolute",top:"3px",right:"3px"}),d(h.__hue_field),S.extend(h.__input.style,{outline:"none",textAlign:"center",color:"#fff",border:0,fontWeight:"bold",textShadow:h.__input_textShadow+"rgba(0,0,0,0.7)"}),X.bind(h.__saturation_field,"mousedown",o),X.bind(h.__saturation_field,"touchstart",o),X.bind(h.__field_knob,"mousedown",o),X.bind(h.__field_knob,"touchstart",o),X.bind(h.__hue_field,"mousedown",i),X.bind(h.__hue_field,"touchstart",i),h.__saturation_field.appendChild(f),h.__selector.appendChild(h.__field_knob),h.__selector.appendChild(h.__saturation_field),h.__selector.appendChild(h.__hue_field),h.__hue_field.appendChild(h.__hue_knob),h.domElement.appendChild(h.__input),h.domElement.appendChild(h.__selector),h.updateDisplay(),h}return D(t,z),P(t,[{key:"updateDisplay",value:function(){var e=R(this.getValue());if(!1!==e){var t=!1;S.each(I.COMPONENTS,function(n){if(!S.isUndefined(e[n])&&!S.isUndefined(this.__color.__state[n])&&e[n]!==this.__color.__state[n])return t=!0,{}},this),t&&S.extend(this.__color.__state,e)}S.extend(this.__temp.__state,this.__color.__state),this.__temp.a=1;var n=this.__color.v<.5||this.__color.s>.5?255:0,o=255-n;S.extend(this.__field_knob.style,{marginLeft:100*this.__color.s-7+"px",marginTop:100*(1-this.__color.v)-7+"px",backgroundColor:this.__temp.toHexString(),border:this.__field_knob_border+"rgb("+n+","+n+","+n+")"}),this.__hue_knob.style.marginTop=100*(1-this.__color.h/360)+"px",this.__temp.s=1,this.__temp.v=1,l(this.__saturation_field,"left","#fff",this.__temp.toHexString()),this.__input.value=this.__color.toString(),S.extend(this.__input.style,{backgroundColor:this.__color.toHexString(),color:"rgb("+n+","+n+","+n+")",textShadow:this.__input_textShadow+"rgba("+o+","+o+","+o+",.7)"})}}]),t}(),ee=["-moz-","-o-","-webkit-","-ms-",""],te={load:function(e,t){var n=t||document,o=n.createElement("link");o.type="text/css",o.rel="stylesheet",o.href=e,n.getElementsByTagName("head")[0].appendChild(o)},inject:function(e,t){var n=t||document,o=document.createElement("style");o.type="text/css",o.innerHTML=e;var i=n.getElementsByTagName("head")[0];try{i.appendChild(o)}catch(e){}}},ne=function(e,t){var n=e[t];return S.isArray(arguments[2])||S.isObject(arguments[2])?new Y(e,t,arguments[2]):S.isNumber(n)?S.isNumber(arguments[2])&&S.isNumber(arguments[3])?S.isNumber(arguments[4])?new q(e,t,arguments[2],arguments[3],arguments[4]):new q(e,t,arguments[2],arguments[3]):S.isNumber(arguments[4])?new Q(e,t,{min:arguments[2],max:arguments[3],step:arguments[4]}):new Q(e,t,{min:arguments[2],max:arguments[3]}):S.isString(n)?new J(e,t):S.isFunction(n)?new Z(e,t,""):S.isBoolean(n)?new K(e,t):null},oe=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){setTimeout(e,1e3/60)},ie=function(){function e(){F(this,e),this.backgroundElement=document.createElement("div"),S.extend(this.backgroundElement.style,{backgroundColor:"rgba(0,0,0,0.8)",top:0,left:0,display:"none",zIndex:"1000",opacity:0,WebkitTransition:"opacity 0.2s linear",transition:"opacity 0.2s linear"}),X.makeFullscreen(this.backgroundElement),this.backgroundElement.style.position="fixed",this.domElement=document.createElement("div"),S.extend(this.domElement.style,{position:"fixed",display:"none",zIndex:"1001",opacity:0,WebkitTransition:"-webkit-transform 0.2s ease-out, opacity 0.2s linear",transition:"transform 0.2s ease-out, opacity 0.2s linear"}),document.body.appendChild(this.backgroundElement),document.body.appendChild(this.domElement);var t=this;X.bind(this.backgroundElement,"click",function(){t.hide()})}return P(e,[{key:"show",value:function(){var e=this;this.backgroundElement.style.display="block",this.domElement.style.display="block",this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)",this.layout(),S.defer(function(){e.backgroundElement.style.opacity=1,e.domElement.style.opacity=1,e.domElement.style.webkitTransform="scale(1)"})}},{key:"hide",value:function(){var e=this,t=function t(){e.domElement.style.display="none",e.backgroundElement.style.display="none",X.unbind(e.domElement,"webkitTransitionEnd",t),X.unbind(e.domElement,"transitionend",t),X.unbind(e.domElement,"oTransitionEnd",t)};X.bind(this.domElement,"webkitTransitionEnd",t),X.bind(this.domElement,"transitionend",t),X.bind(this.domElement,"oTransitionEnd",t),this.backgroundElement.style.opacity=0,this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)"}},{key:"layout",value:function(){this.domElement.style.left=window.innerWidth/2-X.getWidth(this.domElement)/2+"px",this.domElement.style.top=window.innerHeight/2-X.getHeight(this.domElement)/2+"px"}}]),e}(),re=function(e){if(e&&"undefined"!=typeof window){var t=document.createElement("style");return t.setAttribute("type","text/css"),t.innerHTML=e,document.head.appendChild(t),e}}(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n");te.inject(re);var se="Default",ae=function(){try{return!!window.localStorage}catch(e){return!1}}(),le=void 0,de=!0,ce=void 0,ue=!1,_e=[],he=function e(t){var n=this,o=t||{};this.domElement=document.createElement("div"),this.__ul=document.createElement("ul"),this.domElement.appendChild(this.__ul),X.addClass(this.domElement,"dg"),this.__folders={},this.__controllers=[],this.__rememberedObjects=[],this.__rememberedObjectIndecesToControllers=[],this.__listening=[],o=S.defaults(o,{closeOnTop:!1,autoPlace:!0,width:e.DEFAULT_WIDTH}),o=S.defaults(o,{resizable:o.autoPlace,hideable:o.autoPlace}),S.isUndefined(o.load)?o.load={preset:se}:o.preset&&(o.load.preset=o.preset),S.isUndefined(o.parent)&&o.hideable&&_e.push(this),o.resizable=S.isUndefined(o.parent)&&o.resizable,o.autoPlace&&S.isUndefined(o.scrollable)&&(o.scrollable=!0);var i=ae&&"true"===localStorage.getItem(m(this,"isLocal")),r=void 0,s=void 0;if(Object.defineProperties(this,{parent:{get:function(){return o.parent}},scrollable:{get:function(){return o.scrollable}},autoPlace:{get:function(){return o.autoPlace}},closeOnTop:{get:function(){return o.closeOnTop}},preset:{get:function(){return n.parent?n.getRoot().preset:o.load.preset},set:function(e){n.parent?n.getRoot().preset=e:o.load.preset=e,E(this),n.revert()}},width:{get:function(){return o.width},set:function(e){o.width=e,w(n,e)}},name:{get:function(){return o.name},set:function(e){o.name=e,s&&(s.innerHTML=o.name)}},closed:{get:function(){return o.closed},set:function(t){o.closed=t,o.closed?X.addClass(n.__ul,e.CLASS_CLOSED):X.removeClass(n.__ul,e.CLASS_CLOSED),this.onResize(),n.__closeButton&&(n.__closeButton.innerHTML=t?e.TEXT_OPEN:e.TEXT_CLOSED)}},load:{get:function(){return o.load}},useLocalStorage:{get:function(){return i},set:function(e){ae&&(i=e,e?X.bind(window,"unload",r):X.unbind(window,"unload",r),localStorage.setItem(m(n,"isLocal"),e))}}}),S.isUndefined(o.parent)){if(this.closed=o.closed||!1,X.addClass(this.domElement,e.CLASS_MAIN),X.makeSelectable(this.domElement,!1),ae&&i){n.useLocalStorage=!0;var a=localStorage.getItem(m(this,"gui"));a&&(o.load=JSON.parse(a))}this.__closeButton=document.createElement("div"),this.__closeButton.innerHTML=e.TEXT_CLOSED,X.addClass(this.__closeButton,e.CLASS_CLOSE_BUTTON),o.closeOnTop?(X.addClass(this.__closeButton,e.CLASS_CLOSE_TOP),this.domElement.insertBefore(this.__closeButton,this.domElement.childNodes[0])):(X.addClass(this.__closeButton,e.CLASS_CLOSE_BOTTOM),this.domElement.appendChild(this.__closeButton)),X.bind(this.__closeButton,"click",function(){n.closed=!n.closed})}else{void 0===o.closed&&(o.closed=!0);var l=document.createTextNode(o.name);X.addClass(l,"controller-name"),s=c(n,l);X.addClass(this.__ul,e.CLASS_CLOSED),X.addClass(s,"title"),X.bind(s,"click",function(e){return e.preventDefault(),n.closed=!n.closed,!1}),o.closed||(this.closed=!1)}o.autoPlace&&(S.isUndefined(o.parent)&&(de&&(ce=document.createElement("div"),X.addClass(ce,"dg"),X.addClass(ce,e.CLASS_AUTO_PLACE_CONTAINER),document.body.appendChild(ce),de=!1),ce.appendChild(this.domElement),X.addClass(this.domElement,e.CLASS_AUTO_PLACE)),this.parent||w(n,o.width)),this.__resizeHandler=function(){n.onResizeDebounced()},X.bind(window,"resize",this.__resizeHandler),X.bind(this.__ul,"webkitTransitionEnd",this.__resizeHandler),X.bind(this.__ul,"transitionend",this.__resizeHandler),X.bind(this.__ul,"oTransitionEnd",this.__resizeHandler),this.onResize(),o.resizable&&y(this),r=function(){ae&&"true"===localStorage.getItem(m(n,"isLocal"))&&localStorage.setItem(m(n,"gui"),JSON.stringify(n.getSaveObject()))},this.saveToLocalStorageIfPossible=r,o.parent||function(){var e=n.getRoot();e.width+=1,S.defer(function(){e.width-=1})}()};he.toggleHide=function(){ue=!ue,S.each(_e,function(e){e.domElement.style.display=ue?"none":""})},he.CLASS_AUTO_PLACE="a",he.CLASS_AUTO_PLACE_CONTAINER="ac",he.CLASS_MAIN="main",he.CLASS_CONTROLLER_ROW="cr",he.CLASS_TOO_TALL="taller-than-window",he.CLASS_CLOSED="closed",he.CLASS_CLOSE_BUTTON="close-button",he.CLASS_CLOSE_TOP="close-top",he.CLASS_CLOSE_BOTTOM="close-bottom",he.CLASS_DRAG="drag",he.DEFAULT_WIDTH=245,he.TEXT_CLOSED="Close Controls",he.TEXT_OPEN="Open Controls",he._keydownHandler=function(e){"text"===document.activeElement.type||72!==e.which&&72!==e.keyCode||he.toggleHide()},X.bind(window,"keydown",he._keydownHandler,!1),S.extend(he.prototype,{add:function(e,t){return f(this,e,t,{factoryArgs:Array.prototype.slice.call(arguments,2)})},addColor:function(e,t){return f(this,e,t,{color:!0})},remove:function(e){this.__ul.removeChild(e.__li),this.__controllers.splice(this.__controllers.indexOf(e),1);var t=this;S.defer(function(){t.onResize()})},destroy:function(){if(this.parent)throw new Error("Only the root GUI should be removed with .destroy(). For subfolders, use gui.removeFolder(folder) instead.");this.autoPlace&&ce.removeChild(this.domElement);var e=this;S.each(this.__folders,function(t){e.removeFolder(t)}),X.unbind(window,"keydown",he._keydownHandler,!1),u(this)},addFolder:function(e){if(void 0!==this.__folders[e])throw new Error('You already have a folder in this GUI by the name "'+e+'"');var t={name:e,parent:this};t.autoPlace=this.autoPlace,this.load&&this.load.folders&&this.load.folders[e]&&(t.closed=this.load.folders[e].closed,t.load=this.load.folders[e]);var n=new he(t);this.__folders[e]=n;var o=c(this,n.domElement);return X.addClass(o,"folder"),n},removeFolder:function(e){this.__ul.removeChild(e.domElement.parentElement),delete this.__folders[e.name],this.load&&this.load.folders&&this.load.folders[e.name]&&delete this.load.folders[e.name],u(e);var t=this;S.each(e.__folders,function(t){e.removeFolder(t)}),S.defer(function(){t.onResize()})},open:function(){this.closed=!1},close:function(){this.closed=!0},hide:function(){this.domElement.style.display="none"},show:function(){this.domElement.style.display=""},onResize:function(){var e=this.getRoot();if(e.scrollable){var t=X.getOffset(e.__ul).top,n=0;S.each(e.__ul.childNodes,function(t){e.autoPlace&&t===e.__save_row||(n+=X.getHeight(t))}),window.innerHeight-t-20GUI\'s constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI\'s constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n'),this.parent)throw new Error("You can only call remember on a top level GUI.");var e=this;S.each(Array.prototype.slice.call(arguments),function(t){0===e.__rememberedObjects.length&&v(e),-1===e.__rememberedObjects.indexOf(t)&&e.__rememberedObjects.push(t)}),this.autoPlace&&w(this,this.width)},getRoot:function(){for(var e=this;e.parent;)e=e.parent;return e},getSaveObject:function(){var e=this.load;return e.closed=this.closed,this.__rememberedObjects.length>0&&(e.preset=this.preset,e.remembered||(e.remembered={}),e.remembered[this.preset]=x(this)),e.folders={},S.each(this.__folders,function(t,n){e.folders[n]=t.getSaveObject()}),e},save:function(){this.load.remembered||(this.load.remembered={}),this.load.remembered[this.preset]=x(this),_(this,!1),this.saveToLocalStorageIfPossible()},saveAs:function(e){this.load.remembered||(this.load.remembered={},this.load.remembered[se]=x(this,!0)),this.load.remembered[e]=x(this),this.preset=e,g(this,e,!0),this.saveToLocalStorageIfPossible()},revert:function(e){S.each(this.__controllers,function(t){this.getRoot().load.remembered?p(e||this.getRoot(),t):t.setValue(t.initialValue),t.__onFinishChange&&t.__onFinishChange.call(t,t.getValue())},this),S.each(this.__folders,function(e){e.revert(e)}),e||_(this.getRoot(),!1)},listen:function(e){var t=0===this.__listening.length;this.__listening.push(e),t&&C(this.__listening)},updateDisplay:function(){S.each(this.__controllers,function(e){e.updateDisplay()}),S.each(this.__folders,function(e){e.updateDisplay()})}});var pe={Color:I,math:N,interpret:R},fe={Controller:z,BooleanController:K,OptionController:Y,StringController:J,NumberController:W,NumberControllerBox:Q,NumberControllerSlider:q,FunctionController:Z,ColorController:$},me={dom:X},ge={GUI:he},be=he,ve={color:pe,controllers:fe,dom:me,gui:ge,GUI:be};e.color=pe,e.controllers=fe,e.dom=me,e.gui=ge,e.GUI=be,e.default=ve,Object.defineProperty(e,"__esModule",{value:!0})}); diff --git a/build/dat.gui.module.js b/build/dat.gui.module.js deleted file mode 100644 index b067e9b8e..000000000 --- a/build/dat.gui.module.js +++ /dev/null @@ -1,2523 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -function ___$insertStyle(css) { - if (!css) { - return; - } - if (typeof window === 'undefined') { - return; - } - - var style = document.createElement('style'); - - style.setAttribute('type', 'text/css'); - style.innerHTML = css; - document.head.appendChild(style); - - return css; -} - -function colorToString (color, forceCSSHex) { - var colorFormat = color.__state.conversionName.toString(); - var r = Math.round(color.r); - var g = Math.round(color.g); - var b = Math.round(color.b); - var a = color.a; - var h = Math.round(color.h); - var s = color.s.toFixed(1); - var v = color.v.toFixed(1); - if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') { - var str = color.hex.toString(16); - while (str.length < 6) { - str = '0' + str; - } - return '#' + str; - } else if (colorFormat === 'CSS_RGB') { - return 'rgb(' + r + ',' + g + ',' + b + ')'; - } else if (colorFormat === 'CSS_RGBA') { - return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; - } else if (colorFormat === 'HEX') { - return '0x' + color.hex.toString(16); - } else if (colorFormat === 'RGB_ARRAY') { - return '[' + r + ',' + g + ',' + b + ']'; - } else if (colorFormat === 'RGBA_ARRAY') { - return '[' + r + ',' + g + ',' + b + ',' + a + ']'; - } else if (colorFormat === 'RGB_OBJ') { - return '{r:' + r + ',g:' + g + ',b:' + b + '}'; - } else if (colorFormat === 'RGBA_OBJ') { - return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}'; - } else if (colorFormat === 'HSV_OBJ') { - return '{h:' + h + ',s:' + s + ',v:' + v + '}'; - } else if (colorFormat === 'HSVA_OBJ') { - return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}'; - } - return 'unknown format'; -} - -var ARR_EACH = Array.prototype.forEach; -var ARR_SLICE = Array.prototype.slice; -var Common = { - BREAK: {}, - extend: function extend(target) { - this.each(ARR_SLICE.call(arguments, 1), function (obj) { - var keys = this.isObject(obj) ? Object.keys(obj) : []; - keys.forEach(function (key) { - if (!this.isUndefined(obj[key])) { - target[key] = obj[key]; - } - }.bind(this)); - }, this); - return target; - }, - defaults: function defaults(target) { - this.each(ARR_SLICE.call(arguments, 1), function (obj) { - var keys = this.isObject(obj) ? Object.keys(obj) : []; - keys.forEach(function (key) { - if (this.isUndefined(target[key])) { - target[key] = obj[key]; - } - }.bind(this)); - }, this); - return target; - }, - compose: function compose() { - var toCall = ARR_SLICE.call(arguments); - return function () { - var args = ARR_SLICE.call(arguments); - for (var i = toCall.length - 1; i >= 0; i--) { - args = [toCall[i].apply(this, args)]; - } - return args[0]; - }; - }, - each: function each(obj, itr, scope) { - if (!obj) { - return; - } - if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) { - obj.forEach(itr, scope); - } else if (obj.length === obj.length + 0) { - var key = void 0; - var l = void 0; - for (key = 0, l = obj.length; key < l; key++) { - if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) { - return; - } - } - } else { - for (var _key in obj) { - if (itr.call(scope, obj[_key], _key) === this.BREAK) { - return; - } - } - } - }, - defer: function defer(fnc) { - setTimeout(fnc, 0); - }, - debounce: function debounce(func, threshold, callImmediately) { - var timeout = void 0; - return function () { - var obj = this; - var args = arguments; - function delayed() { - timeout = null; - if (!callImmediately) func.apply(obj, args); - } - var callNow = callImmediately || !timeout; - clearTimeout(timeout); - timeout = setTimeout(delayed, threshold); - if (callNow) { - func.apply(obj, args); - } - }; - }, - toArray: function toArray(obj) { - if (obj.toArray) return obj.toArray(); - return ARR_SLICE.call(obj); - }, - isUndefined: function isUndefined(obj) { - return obj === undefined; - }, - isNull: function isNull(obj) { - return obj === null; - }, - isNaN: function (_isNaN) { - function isNaN(_x) { - return _isNaN.apply(this, arguments); - } - isNaN.toString = function () { - return _isNaN.toString(); - }; - return isNaN; - }(function (obj) { - return isNaN(obj); - }), - isArray: Array.isArray || function (obj) { - return obj.constructor === Array; - }, - isObject: function isObject(obj) { - return obj === Object(obj); - }, - isNumber: function isNumber(obj) { - return obj === obj + 0; - }, - isString: function isString(obj) { - return obj === obj + ''; - }, - isBoolean: function isBoolean(obj) { - return obj === false || obj === true; - }, - isFunction: function isFunction(obj) { - return Object.prototype.toString.call(obj) === '[object Function]'; - } -}; - -var INTERPRETATIONS = [ -{ - litmus: Common.isString, - conversions: { - THREE_CHAR_HEX: { - read: function read(original) { - var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); - if (test === null) { - return false; - } - return { - space: 'HEX', - hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0) - }; - }, - write: colorToString - }, - SIX_CHAR_HEX: { - read: function read(original) { - var test = original.match(/^#([A-F0-9]{6})$/i); - if (test === null) { - return false; - } - return { - space: 'HEX', - hex: parseInt('0x' + test[1].toString(), 0) - }; - }, - write: colorToString - }, - CSS_RGB: { - read: function read(original) { - var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); - if (test === null) { - return false; - } - return { - space: 'RGB', - r: parseFloat(test[1]), - g: parseFloat(test[2]), - b: parseFloat(test[3]) - }; - }, - write: colorToString - }, - CSS_RGBA: { - read: function read(original) { - var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); - if (test === null) { - return false; - } - return { - space: 'RGB', - r: parseFloat(test[1]), - g: parseFloat(test[2]), - b: parseFloat(test[3]), - a: parseFloat(test[4]) - }; - }, - write: colorToString - } - } -}, -{ - litmus: Common.isNumber, - conversions: { - HEX: { - read: function read(original) { - return { - space: 'HEX', - hex: original, - conversionName: 'HEX' - }; - }, - write: function write(color) { - return color.hex; - } - } - } -}, -{ - litmus: Common.isArray, - conversions: { - RGB_ARRAY: { - read: function read(original) { - if (original.length !== 3) { - return false; - } - return { - space: 'RGB', - r: original[0], - g: original[1], - b: original[2] - }; - }, - write: function write(color) { - return [color.r, color.g, color.b]; - } - }, - RGBA_ARRAY: { - read: function read(original) { - if (original.length !== 4) return false; - return { - space: 'RGB', - r: original[0], - g: original[1], - b: original[2], - a: original[3] - }; - }, - write: function write(color) { - return [color.r, color.g, color.b, color.a]; - } - } - } -}, -{ - litmus: Common.isObject, - conversions: { - RGBA_OBJ: { - read: function read(original) { - if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) { - return { - space: 'RGB', - r: original.r, - g: original.g, - b: original.b, - a: original.a - }; - } - return false; - }, - write: function write(color) { - return { - r: color.r, - g: color.g, - b: color.b, - a: color.a - }; - } - }, - RGB_OBJ: { - read: function read(original) { - if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) { - return { - space: 'RGB', - r: original.r, - g: original.g, - b: original.b - }; - } - return false; - }, - write: function write(color) { - return { - r: color.r, - g: color.g, - b: color.b - }; - } - }, - HSVA_OBJ: { - read: function read(original) { - if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) { - return { - space: 'HSV', - h: original.h, - s: original.s, - v: original.v, - a: original.a - }; - } - return false; - }, - write: function write(color) { - return { - h: color.h, - s: color.s, - v: color.v, - a: color.a - }; - } - }, - HSV_OBJ: { - read: function read(original) { - if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) { - return { - space: 'HSV', - h: original.h, - s: original.s, - v: original.v - }; - } - return false; - }, - write: function write(color) { - return { - h: color.h, - s: color.s, - v: color.v - }; - } - } - } -}]; -var result = void 0; -var toReturn = void 0; -var interpret = function interpret() { - toReturn = false; - var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0]; - Common.each(INTERPRETATIONS, function (family) { - if (family.litmus(original)) { - Common.each(family.conversions, function (conversion, conversionName) { - result = conversion.read(original); - if (toReturn === false && result !== false) { - toReturn = result; - result.conversionName = conversionName; - result.conversion = conversion; - return Common.BREAK; - } - }); - return Common.BREAK; - } - }); - return toReturn; -}; - -var tmpComponent = void 0; -var ColorMath = { - hsv_to_rgb: function hsv_to_rgb(h, s, v) { - var hi = Math.floor(h / 60) % 6; - var f = h / 60 - Math.floor(h / 60); - var p = v * (1.0 - s); - var q = v * (1.0 - f * s); - var t = v * (1.0 - (1.0 - f) * s); - var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi]; - return { - r: c[0] * 255, - g: c[1] * 255, - b: c[2] * 255 - }; - }, - rgb_to_hsv: function rgb_to_hsv(r, g, b) { - var min = Math.min(r, g, b); - var max = Math.max(r, g, b); - var delta = max - min; - var h = void 0; - var s = void 0; - if (max !== 0) { - s = delta / max; - } else { - return { - h: NaN, - s: 0, - v: 0 - }; - } - if (r === max) { - h = (g - b) / delta; - } else if (g === max) { - h = 2 + (b - r) / delta; - } else { - h = 4 + (r - g) / delta; - } - h /= 6; - if (h < 0) { - h += 1; - } - return { - h: h * 360, - s: s, - v: max / 255 - }; - }, - rgb_to_hex: function rgb_to_hex(r, g, b) { - var hex = this.hex_with_component(0, 2, r); - hex = this.hex_with_component(hex, 1, g); - hex = this.hex_with_component(hex, 0, b); - return hex; - }, - component_from_hex: function component_from_hex(hex, componentIndex) { - return hex >> componentIndex * 8 & 0xFF; - }, - hex_with_component: function hex_with_component(hex, componentIndex, value) { - return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent); - } -}; - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { - return typeof obj; -} : function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; -}; - - - - - - - - - - - -var classCallCheck = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}; - -var createClass = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; -}(); - - - - - - - -var get = function get(object, property, receiver) { - if (object === null) object = Function.prototype; - var desc = Object.getOwnPropertyDescriptor(object, property); - - if (desc === undefined) { - var parent = Object.getPrototypeOf(object); - - if (parent === null) { - return undefined; - } else { - return get(parent, property, receiver); - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get; - - if (getter === undefined) { - return undefined; - } - - return getter.call(receiver); - } -}; - -var inherits = function (subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: false, - writable: true, - configurable: true - } - }); - if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -}; - - - - - - - - - - - -var possibleConstructorReturn = function (self, call) { - if (!self) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return call && (typeof call === "object" || typeof call === "function") ? call : self; -}; - -var Color = function () { - function Color() { - classCallCheck(this, Color); - this.__state = interpret.apply(this, arguments); - if (this.__state === false) { - throw new Error('Failed to interpret color arguments'); - } - this.__state.a = this.__state.a || 1; - } - createClass(Color, [{ - key: 'toString', - value: function toString() { - return colorToString(this); - } - }, { - key: 'toHexString', - value: function toHexString() { - return colorToString(this, true); - } - }, { - key: 'toOriginal', - value: function toOriginal() { - return this.__state.conversion.write(this); - } - }]); - return Color; -}(); -function defineRGBComponent(target, component, componentHexIndex) { - Object.defineProperty(target, component, { - get: function get$$1() { - if (this.__state.space === 'RGB') { - return this.__state[component]; - } - Color.recalculateRGB(this, component, componentHexIndex); - return this.__state[component]; - }, - set: function set$$1(v) { - if (this.__state.space !== 'RGB') { - Color.recalculateRGB(this, component, componentHexIndex); - this.__state.space = 'RGB'; - } - this.__state[component] = v; - } - }); -} -function defineHSVComponent(target, component) { - Object.defineProperty(target, component, { - get: function get$$1() { - if (this.__state.space === 'HSV') { - return this.__state[component]; - } - Color.recalculateHSV(this); - return this.__state[component]; - }, - set: function set$$1(v) { - if (this.__state.space !== 'HSV') { - Color.recalculateHSV(this); - this.__state.space = 'HSV'; - } - this.__state[component] = v; - } - }); -} -Color.recalculateRGB = function (color, component, componentHexIndex) { - if (color.__state.space === 'HEX') { - color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex); - } else if (color.__state.space === 'HSV') { - Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); - } else { - throw new Error('Corrupted color state'); - } -}; -Color.recalculateHSV = function (color) { - var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b); - Common.extend(color.__state, { - s: result.s, - v: result.v - }); - if (!Common.isNaN(result.h)) { - color.__state.h = result.h; - } else if (Common.isUndefined(color.__state.h)) { - color.__state.h = 0; - } -}; -Color.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a']; -defineRGBComponent(Color.prototype, 'r', 2); -defineRGBComponent(Color.prototype, 'g', 1); -defineRGBComponent(Color.prototype, 'b', 0); -defineHSVComponent(Color.prototype, 'h'); -defineHSVComponent(Color.prototype, 's'); -defineHSVComponent(Color.prototype, 'v'); -Object.defineProperty(Color.prototype, 'a', { - get: function get$$1() { - return this.__state.a; - }, - set: function set$$1(v) { - this.__state.a = v; - } -}); -Object.defineProperty(Color.prototype, 'hex', { - get: function get$$1() { - if (!this.__state.space !== 'HEX') { - this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b); - } - return this.__state.hex; - }, - set: function set$$1(v) { - this.__state.space = 'HEX'; - this.__state.hex = v; - } -}); - -var Controller = function () { - function Controller(object, property) { - classCallCheck(this, Controller); - this.initialValue = object[property]; - this.domElement = document.createElement('div'); - this.object = object; - this.property = property; - this.__onChange = undefined; - this.__onFinishChange = undefined; - } - createClass(Controller, [{ - key: 'onChange', - value: function onChange(fnc) { - this.__onChange = fnc; - return this; - } - }, { - key: 'onFinishChange', - value: function onFinishChange(fnc) { - this.__onFinishChange = fnc; - return this; - } - }, { - key: 'setValue', - value: function setValue(newValue) { - this.object[this.property] = newValue; - if (this.__onChange) { - this.__onChange.call(this, newValue); - } - this.updateDisplay(); - return this; - } - }, { - key: 'getValue', - value: function getValue() { - return this.object[this.property]; - } - }, { - key: 'updateDisplay', - value: function updateDisplay() { - return this; - } - }, { - key: 'isModified', - value: function isModified() { - return this.initialValue !== this.getValue(); - } - }]); - return Controller; -}(); - -var EVENT_MAP = { - HTMLEvents: ['change'], - MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'], - KeyboardEvents: ['keydown'] -}; -var EVENT_MAP_INV = {}; -Common.each(EVENT_MAP, function (v, k) { - Common.each(v, function (e) { - EVENT_MAP_INV[e] = k; - }); -}); -var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; -function cssValueToPixels(val) { - if (val === '0' || Common.isUndefined(val)) { - return 0; - } - var match = val.match(CSS_VALUE_PIXELS); - if (!Common.isNull(match)) { - return parseFloat(match[1]); - } - return 0; -} -var dom = { - makeSelectable: function makeSelectable(elem, selectable) { - if (elem === undefined || elem.style === undefined) return; - elem.onselectstart = selectable ? function () { - return false; - } : function () {}; - elem.style.MozUserSelect = selectable ? 'auto' : 'none'; - elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; - elem.unselectable = selectable ? 'on' : 'off'; - }, - makeFullscreen: function makeFullscreen(elem, hor, vert) { - var vertical = vert; - var horizontal = hor; - if (Common.isUndefined(horizontal)) { - horizontal = true; - } - if (Common.isUndefined(vertical)) { - vertical = true; - } - elem.style.position = 'absolute'; - if (horizontal) { - elem.style.left = 0; - elem.style.right = 0; - } - if (vertical) { - elem.style.top = 0; - elem.style.bottom = 0; - } - }, - fakeEvent: function fakeEvent(elem, eventType, pars, aux) { - var params = pars || {}; - var className = EVENT_MAP_INV[eventType]; - if (!className) { - throw new Error('Event type ' + eventType + ' not supported.'); - } - var evt = document.createEvent(className); - switch (className) { - case 'MouseEvents': - { - var clientX = params.x || params.clientX || 0; - var clientY = params.y || params.clientY || 0; - evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0, - 0, - clientX, - clientY, - false, false, false, false, 0, null); - break; - } - case 'KeyboardEvents': - { - var init = evt.initKeyboardEvent || evt.initKeyEvent; - Common.defaults(params, { - cancelable: true, - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false, - keyCode: undefined, - charCode: undefined - }); - init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode); - break; - } - default: - { - evt.initEvent(eventType, params.bubbles || false, params.cancelable || true); - break; - } - } - Common.defaults(evt, aux); - elem.dispatchEvent(evt); - }, - bind: function bind(elem, event, func, newBool) { - var bool = newBool || false; - if (elem.addEventListener) { - elem.addEventListener(event, func, bool); - } else if (elem.attachEvent) { - elem.attachEvent('on' + event, func); - } - return dom; - }, - unbind: function unbind(elem, event, func, newBool) { - var bool = newBool || false; - if (elem.removeEventListener) { - elem.removeEventListener(event, func, bool); - } else if (elem.detachEvent) { - elem.detachEvent('on' + event, func); - } - return dom; - }, - addClass: function addClass(elem, className) { - if (elem.className === undefined) { - elem.className = className; - } else if (elem.className !== className) { - var classes = elem.className.split(/ +/); - if (classes.indexOf(className) === -1) { - classes.push(className); - elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); - } - } - return dom; - }, - removeClass: function removeClass(elem, className) { - if (className) { - if (elem.className === className) { - elem.removeAttribute('class'); - } else { - var classes = elem.className.split(/ +/); - var index = classes.indexOf(className); - if (index !== -1) { - classes.splice(index, 1); - elem.className = classes.join(' '); - } - } - } else { - elem.className = undefined; - } - return dom; - }, - hasClass: function hasClass(elem, className) { - return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; - }, - getWidth: function getWidth(elem) { - var style = getComputedStyle(elem); - return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width); - }, - getHeight: function getHeight(elem) { - var style = getComputedStyle(elem); - return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height); - }, - getOffset: function getOffset(el) { - var elem = el; - var offset = { left: 0, top: 0 }; - if (elem.offsetParent) { - do { - offset.left += elem.offsetLeft; - offset.top += elem.offsetTop; - elem = elem.offsetParent; - } while (elem); - } - return offset; - }, - isActive: function isActive(elem) { - return elem === document.activeElement && (elem.type || elem.href); - } -}; - -var BooleanController = function (_Controller) { - inherits(BooleanController, _Controller); - function BooleanController(object, property) { - classCallCheck(this, BooleanController); - var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property)); - var _this = _this2; - _this2.__prev = _this2.getValue(); - _this2.__checkbox = document.createElement('input'); - _this2.__checkbox.setAttribute('type', 'checkbox'); - function onChange() { - _this.setValue(!_this.__prev); - } - dom.bind(_this2.__checkbox, 'change', onChange, false); - _this2.domElement.appendChild(_this2.__checkbox); - _this2.updateDisplay(); - return _this2; - } - createClass(BooleanController, [{ - key: 'setValue', - value: function setValue(v) { - var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - this.__prev = this.getValue(); - return toReturn; - } - }, { - key: 'updateDisplay', - value: function updateDisplay() { - if (this.getValue() === true) { - this.__checkbox.setAttribute('checked', 'checked'); - this.__checkbox.checked = true; - this.__prev = true; - } else { - this.__checkbox.checked = false; - this.__prev = false; - } - return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this); - } - }]); - return BooleanController; -}(Controller); - -var OptionController = function (_Controller) { - inherits(OptionController, _Controller); - function OptionController(object, property, opts) { - classCallCheck(this, OptionController); - var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property)); - var options = opts; - var _this = _this2; - _this2.__select = document.createElement('select'); - if (Common.isArray(options)) { - var map = {}; - Common.each(options, function (element) { - map[element] = element; - }); - options = map; - } - Common.each(options, function (value, key) { - var opt = document.createElement('option'); - opt.innerHTML = key; - opt.setAttribute('value', value); - _this.__select.appendChild(opt); - }); - _this2.updateDisplay(); - dom.bind(_this2.__select, 'change', function () { - var desiredValue = this.options[this.selectedIndex].value; - _this.setValue(desiredValue); - }); - _this2.domElement.appendChild(_this2.__select); - return _this2; - } - createClass(OptionController, [{ - key: 'setValue', - value: function setValue(v) { - var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - return toReturn; - } - }, { - key: 'updateDisplay', - value: function updateDisplay() { - if (dom.isActive(this.__select)) return this; - this.__select.value = this.getValue(); - return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this); - } - }]); - return OptionController; -}(Controller); - -var StringController = function (_Controller) { - inherits(StringController, _Controller); - function StringController(object, property) { - classCallCheck(this, StringController); - var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property)); - var _this = _this2; - function onChange() { - _this.setValue(_this.__input.value); - } - function onBlur() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - _this2.__input = document.createElement('input'); - _this2.__input.setAttribute('type', 'text'); - dom.bind(_this2.__input, 'keyup', onChange); - dom.bind(_this2.__input, 'change', onChange); - dom.bind(_this2.__input, 'blur', onBlur); - dom.bind(_this2.__input, 'keydown', function (e) { - if (e.keyCode === 13) { - this.blur(); - } - }); - _this2.updateDisplay(); - _this2.domElement.appendChild(_this2.__input); - return _this2; - } - createClass(StringController, [{ - key: 'updateDisplay', - value: function updateDisplay() { - if (!dom.isActive(this.__input)) { - this.__input.value = this.getValue(); - } - return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this); - } - }]); - return StringController; -}(Controller); - -function numDecimals(x) { - var _x = x.toString(); - if (_x.indexOf('.') > -1) { - return _x.length - _x.indexOf('.') - 1; - } - return 0; -} -var NumberController = function (_Controller) { - inherits(NumberController, _Controller); - function NumberController(object, property, params) { - classCallCheck(this, NumberController); - var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property)); - var _params = params || {}; - _this.__min = _params.min; - _this.__max = _params.max; - _this.__step = _params.step; - if (Common.isUndefined(_this.__step)) { - if (_this.initialValue === 0) { - _this.__impliedStep = 1; - } else { - _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10; - } - } else { - _this.__impliedStep = _this.__step; - } - _this.__precision = numDecimals(_this.__impliedStep); - return _this; - } - createClass(NumberController, [{ - key: 'setValue', - value: function setValue(v) { - var _v = v; - if (this.__min !== undefined && _v < this.__min) { - _v = this.__min; - } else if (this.__max !== undefined && _v > this.__max) { - _v = this.__max; - } - if (this.__step !== undefined && _v % this.__step !== 0) { - _v = Math.round(_v / this.__step) * this.__step; - } - return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v); - } - }, { - key: 'min', - value: function min(minValue) { - this.__min = minValue; - return this; - } - }, { - key: 'max', - value: function max(maxValue) { - this.__max = maxValue; - return this; - } - }, { - key: 'step', - value: function step(stepValue) { - this.__step = stepValue; - this.__impliedStep = stepValue; - this.__precision = numDecimals(stepValue); - return this; - } - }]); - return NumberController; -}(Controller); - -function roundToDecimal(value, decimals) { - var tenTo = Math.pow(10, decimals); - return Math.round(value * tenTo) / tenTo; -} -var NumberControllerBox = function (_NumberController) { - inherits(NumberControllerBox, _NumberController); - function NumberControllerBox(object, property, params) { - classCallCheck(this, NumberControllerBox); - var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params)); - _this2.__truncationSuspended = false; - var _this = _this2; - var prevY = void 0; - function onChange() { - var attempted = parseFloat(_this.__input.value); - if (!Common.isNaN(attempted)) { - _this.setValue(attempted); - } - } - function onFinish() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - function onBlur() { - onFinish(); - } - function onMouseDrag(e) { - var diff = prevY - e.clientY; - _this.setValue(_this.getValue() + diff * _this.__impliedStep); - prevY = e.clientY; - } - function onMouseUp() { - dom.unbind(window, 'mousemove', onMouseDrag); - dom.unbind(window, 'mouseup', onMouseUp); - onFinish(); - } - function onMouseDown(e) { - dom.bind(window, 'mousemove', onMouseDrag); - dom.bind(window, 'mouseup', onMouseUp); - prevY = e.clientY; - } - _this2.__input = document.createElement('input'); - _this2.__input.setAttribute('type', 'text'); - dom.bind(_this2.__input, 'change', onChange); - dom.bind(_this2.__input, 'blur', onBlur); - dom.bind(_this2.__input, 'mousedown', onMouseDown); - dom.bind(_this2.__input, 'keydown', function (e) { - if (e.keyCode === 13) { - _this.__truncationSuspended = true; - this.blur(); - _this.__truncationSuspended = false; - onFinish(); - } - }); - _this2.updateDisplay(); - _this2.domElement.appendChild(_this2.__input); - return _this2; - } - createClass(NumberControllerBox, [{ - key: 'updateDisplay', - value: function updateDisplay() { - this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); - return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this); - } - }]); - return NumberControllerBox; -}(NumberController); - -function map(v, i1, i2, o1, o2) { - return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); -} -var NumberControllerSlider = function (_NumberController) { - inherits(NumberControllerSlider, _NumberController); - function NumberControllerSlider(object, property, min, max, step) { - classCallCheck(this, NumberControllerSlider); - var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step })); - var _this = _this2; - _this2.__background = document.createElement('div'); - _this2.__foreground = document.createElement('div'); - dom.bind(_this2.__background, 'mousedown', onMouseDown); - dom.bind(_this2.__background, 'touchstart', onTouchStart); - dom.addClass(_this2.__background, 'slider'); - dom.addClass(_this2.__foreground, 'slider-fg'); - function onMouseDown(e) { - document.activeElement.blur(); - dom.bind(window, 'mousemove', onMouseDrag); - dom.bind(window, 'mouseup', onMouseUp); - onMouseDrag(e); - } - function onMouseDrag(e) { - e.preventDefault(); - var bgRect = _this.__background.getBoundingClientRect(); - _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); - return false; - } - function onMouseUp() { - dom.unbind(window, 'mousemove', onMouseDrag); - dom.unbind(window, 'mouseup', onMouseUp); - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - function onTouchStart(e) { - if (e.touches.length !== 1) { - return; - } - dom.bind(window, 'touchmove', onTouchMove); - dom.bind(window, 'touchend', onTouchEnd); - onTouchMove(e); - } - function onTouchMove(e) { - var clientX = e.touches[0].clientX; - var bgRect = _this.__background.getBoundingClientRect(); - _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); - } - function onTouchEnd() { - dom.unbind(window, 'touchmove', onTouchMove); - dom.unbind(window, 'touchend', onTouchEnd); - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - _this2.updateDisplay(); - _this2.__background.appendChild(_this2.__foreground); - _this2.domElement.appendChild(_this2.__background); - return _this2; - } - createClass(NumberControllerSlider, [{ - key: 'updateDisplay', - value: function updateDisplay() { - var pct = (this.getValue() - this.__min) / (this.__max - this.__min); - this.__foreground.style.width = pct * 100 + '%'; - return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this); - } - }]); - return NumberControllerSlider; -}(NumberController); - -var FunctionController = function (_Controller) { - inherits(FunctionController, _Controller); - function FunctionController(object, property, text) { - classCallCheck(this, FunctionController); - var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property)); - var _this = _this2; - _this2.__button = document.createElement('div'); - _this2.__button.innerHTML = text === undefined ? 'Fire' : text; - dom.bind(_this2.__button, 'click', function (e) { - e.preventDefault(); - _this.fire(); - return false; - }); - dom.addClass(_this2.__button, 'button'); - _this2.domElement.appendChild(_this2.__button); - return _this2; - } - createClass(FunctionController, [{ - key: 'fire', - value: function fire() { - if (this.__onChange) { - this.__onChange.call(this); - } - this.getValue().call(this.object); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - } - }]); - return FunctionController; -}(Controller); - -var ColorController = function (_Controller) { - inherits(ColorController, _Controller); - function ColorController(object, property) { - classCallCheck(this, ColorController); - var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property)); - _this2.__color = new Color(_this2.getValue()); - _this2.__temp = new Color(0); - var _this = _this2; - _this2.domElement = document.createElement('div'); - dom.makeSelectable(_this2.domElement, false); - _this2.__selector = document.createElement('div'); - _this2.__selector.className = 'selector'; - _this2.__saturation_field = document.createElement('div'); - _this2.__saturation_field.className = 'saturation-field'; - _this2.__field_knob = document.createElement('div'); - _this2.__field_knob.className = 'field-knob'; - _this2.__field_knob_border = '2px solid '; - _this2.__hue_knob = document.createElement('div'); - _this2.__hue_knob.className = 'hue-knob'; - _this2.__hue_field = document.createElement('div'); - _this2.__hue_field.className = 'hue-field'; - _this2.__input = document.createElement('input'); - _this2.__input.type = 'text'; - _this2.__input_textShadow = '0 1px 1px '; - dom.bind(_this2.__input, 'keydown', function (e) { - if (e.keyCode === 13) { - onBlur.call(this); - } - }); - dom.bind(_this2.__input, 'blur', onBlur); - dom.bind(_this2.__selector, 'mousedown', function () { - dom.addClass(this, 'drag').bind(window, 'mouseup', function () { - dom.removeClass(_this.__selector, 'drag'); - }); - }); - dom.bind(_this2.__selector, 'touchstart', function () { - dom.addClass(this, 'drag').bind(window, 'touchend', function () { - dom.removeClass(_this.__selector, 'drag'); - }); - }); - var valueField = document.createElement('div'); - Common.extend(_this2.__selector.style, { - width: '122px', - height: '102px', - padding: '3px', - backgroundColor: '#222', - boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' - }); - Common.extend(_this2.__field_knob.style, { - position: 'absolute', - width: '12px', - height: '12px', - border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'), - boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', - borderRadius: '12px', - zIndex: 1 - }); - Common.extend(_this2.__hue_knob.style, { - position: 'absolute', - width: '15px', - height: '2px', - borderRight: '4px solid #fff', - zIndex: 1 - }); - Common.extend(_this2.__saturation_field.style, { - width: '100px', - height: '100px', - border: '1px solid #555', - marginRight: '3px', - display: 'inline-block', - cursor: 'pointer' - }); - Common.extend(valueField.style, { - width: '100%', - height: '100%', - background: 'none' - }); - linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000'); - Common.extend(_this2.__hue_field.style, { - width: '15px', - height: '100px', - border: '1px solid #555', - cursor: 'ns-resize', - position: 'absolute', - top: '3px', - right: '3px' - }); - hueGradient(_this2.__hue_field); - Common.extend(_this2.__input.style, { - outline: 'none', - textAlign: 'center', - color: '#fff', - border: 0, - fontWeight: 'bold', - textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)' - }); - dom.bind(_this2.__saturation_field, 'mousedown', fieldDown); - dom.bind(_this2.__saturation_field, 'touchstart', fieldDown); - dom.bind(_this2.__field_knob, 'mousedown', fieldDown); - dom.bind(_this2.__field_knob, 'touchstart', fieldDown); - dom.bind(_this2.__hue_field, 'mousedown', fieldDownH); - dom.bind(_this2.__hue_field, 'touchstart', fieldDownH); - function fieldDown(e) { - setSV(e); - dom.bind(window, 'mousemove', setSV); - dom.bind(window, 'touchmove', setSV); - dom.bind(window, 'mouseup', fieldUpSV); - dom.bind(window, 'touchend', fieldUpSV); - } - function fieldDownH(e) { - setH(e); - dom.bind(window, 'mousemove', setH); - dom.bind(window, 'touchmove', setH); - dom.bind(window, 'mouseup', fieldUpH); - dom.bind(window, 'touchend', fieldUpH); - } - function fieldUpSV() { - dom.unbind(window, 'mousemove', setSV); - dom.unbind(window, 'touchmove', setSV); - dom.unbind(window, 'mouseup', fieldUpSV); - dom.unbind(window, 'touchend', fieldUpSV); - onFinish(); - } - function fieldUpH() { - dom.unbind(window, 'mousemove', setH); - dom.unbind(window, 'touchmove', setH); - dom.unbind(window, 'mouseup', fieldUpH); - dom.unbind(window, 'touchend', fieldUpH); - onFinish(); - } - function onBlur() { - var i = interpret(this.value); - if (i !== false) { - _this.__color.__state = i; - _this.setValue(_this.__color.toOriginal()); - } else { - this.value = _this.__color.toString(); - } - } - function onFinish() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.__color.toOriginal()); - } - } - _this2.__saturation_field.appendChild(valueField); - _this2.__selector.appendChild(_this2.__field_knob); - _this2.__selector.appendChild(_this2.__saturation_field); - _this2.__selector.appendChild(_this2.__hue_field); - _this2.__hue_field.appendChild(_this2.__hue_knob); - _this2.domElement.appendChild(_this2.__input); - _this2.domElement.appendChild(_this2.__selector); - _this2.updateDisplay(); - function setSV(e) { - if (e.type.indexOf('touch') === -1) { - e.preventDefault(); - } - var fieldRect = _this.__saturation_field.getBoundingClientRect(); - var _ref = e.touches && e.touches[0] || e, - clientX = _ref.clientX, - clientY = _ref.clientY; - var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left); - var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); - if (v > 1) { - v = 1; - } else if (v < 0) { - v = 0; - } - if (s > 1) { - s = 1; - } else if (s < 0) { - s = 0; - } - _this.__color.v = v; - _this.__color.s = s; - _this.setValue(_this.__color.toOriginal()); - return false; - } - function setH(e) { - if (e.type.indexOf('touch') === -1) { - e.preventDefault(); - } - var fieldRect = _this.__hue_field.getBoundingClientRect(); - var _ref2 = e.touches && e.touches[0] || e, - clientY = _ref2.clientY; - var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); - if (h > 1) { - h = 1; - } else if (h < 0) { - h = 0; - } - _this.__color.h = h * 360; - _this.setValue(_this.__color.toOriginal()); - return false; - } - return _this2; - } - createClass(ColorController, [{ - key: 'updateDisplay', - value: function updateDisplay() { - var i = interpret(this.getValue()); - if (i !== false) { - var mismatch = false; - Common.each(Color.COMPONENTS, function (component) { - if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) { - mismatch = true; - return {}; - } - }, this); - if (mismatch) { - Common.extend(this.__color.__state, i); - } - } - Common.extend(this.__temp.__state, this.__color.__state); - this.__temp.a = 1; - var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0; - var _flip = 255 - flip; - Common.extend(this.__field_knob.style, { - marginLeft: 100 * this.__color.s - 7 + 'px', - marginTop: 100 * (1 - this.__color.v) - 7 + 'px', - backgroundColor: this.__temp.toHexString(), - border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')' - }); - this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'; - this.__temp.s = 1; - this.__temp.v = 1; - linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString()); - this.__input.value = this.__color.toString(); - Common.extend(this.__input.style, { - backgroundColor: this.__color.toHexString(), - color: 'rgb(' + flip + ',' + flip + ',' + flip + ')', - textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)' - }); - } - }]); - return ColorController; -}(Controller); -var vendors = ['-moz-', '-o-', '-webkit-', '-ms-', '']; -function linearGradient(elem, x, a, b) { - elem.style.background = ''; - Common.each(vendors, function (vendor) { - elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); '; - }); -} -function hueGradient(elem) { - elem.style.background = ''; - elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'; - elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; -} - -var css = { - load: function load(url, indoc) { - var doc = indoc || document; - var link = doc.createElement('link'); - link.type = 'text/css'; - link.rel = 'stylesheet'; - link.href = url; - doc.getElementsByTagName('head')[0].appendChild(link); - }, - inject: function inject(cssContent, indoc) { - var doc = indoc || document; - var injected = document.createElement('style'); - injected.type = 'text/css'; - injected.innerHTML = cssContent; - var head = doc.getElementsByTagName('head')[0]; - try { - head.appendChild(injected); - } catch (e) { - } - } -}; - -var saveDialogContents = "
\n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n
"; - -var ControllerFactory = function ControllerFactory(object, property) { - var initialValue = object[property]; - if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) { - return new OptionController(object, property, arguments[2]); - } - if (Common.isNumber(initialValue)) { - if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) { - if (Common.isNumber(arguments[4])) { - return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]); - } - return new NumberControllerSlider(object, property, arguments[2], arguments[3]); - } - if (Common.isNumber(arguments[4])) { - return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] }); - } - return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); - } - if (Common.isString(initialValue)) { - return new StringController(object, property); - } - if (Common.isFunction(initialValue)) { - return new FunctionController(object, property, ''); - } - if (Common.isBoolean(initialValue)) { - return new BooleanController(object, property); - } - return null; -}; - -function requestAnimationFrame(callback) { - setTimeout(callback, 1000 / 60); -} -var requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame; - -var CenteredDiv = function () { - function CenteredDiv() { - classCallCheck(this, CenteredDiv); - this.backgroundElement = document.createElement('div'); - Common.extend(this.backgroundElement.style, { - backgroundColor: 'rgba(0,0,0,0.8)', - top: 0, - left: 0, - display: 'none', - zIndex: '1000', - opacity: 0, - WebkitTransition: 'opacity 0.2s linear', - transition: 'opacity 0.2s linear' - }); - dom.makeFullscreen(this.backgroundElement); - this.backgroundElement.style.position = 'fixed'; - this.domElement = document.createElement('div'); - Common.extend(this.domElement.style, { - position: 'fixed', - display: 'none', - zIndex: '1001', - opacity: 0, - WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear', - transition: 'transform 0.2s ease-out, opacity 0.2s linear' - }); - document.body.appendChild(this.backgroundElement); - document.body.appendChild(this.domElement); - var _this = this; - dom.bind(this.backgroundElement, 'click', function () { - _this.hide(); - }); - } - createClass(CenteredDiv, [{ - key: 'show', - value: function show() { - var _this = this; - this.backgroundElement.style.display = 'block'; - this.domElement.style.display = 'block'; - this.domElement.style.opacity = 0; - this.domElement.style.webkitTransform = 'scale(1.1)'; - this.layout(); - Common.defer(function () { - _this.backgroundElement.style.opacity = 1; - _this.domElement.style.opacity = 1; - _this.domElement.style.webkitTransform = 'scale(1)'; - }); - } - }, { - key: 'hide', - value: function hide() { - var _this = this; - var hide = function hide() { - _this.domElement.style.display = 'none'; - _this.backgroundElement.style.display = 'none'; - dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); - dom.unbind(_this.domElement, 'transitionend', hide); - dom.unbind(_this.domElement, 'oTransitionEnd', hide); - }; - dom.bind(this.domElement, 'webkitTransitionEnd', hide); - dom.bind(this.domElement, 'transitionend', hide); - dom.bind(this.domElement, 'oTransitionEnd', hide); - this.backgroundElement.style.opacity = 0; - this.domElement.style.opacity = 0; - this.domElement.style.webkitTransform = 'scale(1.1)'; - } - }, { - key: 'layout', - value: function layout() { - this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px'; - this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px'; - } - }]); - return CenteredDiv; -}(); - -var styleSheet = ___$insertStyle(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"); - -css.inject(styleSheet); -var CSS_NAMESPACE = 'dg'; -var HIDE_KEY_CODE = 72; -var CLOSE_BUTTON_HEIGHT = 20; -var DEFAULT_DEFAULT_PRESET_NAME = 'Default'; -var SUPPORTS_LOCAL_STORAGE = function () { - try { - return !!window.localStorage; - } catch (e) { - return false; - } -}(); -var SAVE_DIALOGUE = void 0; -var autoPlaceVirgin = true; -var autoPlaceContainer = void 0; -var hide = false; -var hideableGuis = []; -var GUI = function GUI(pars) { - var _this = this; - var params = pars || {}; - this.domElement = document.createElement('div'); - this.__ul = document.createElement('ul'); - this.domElement.appendChild(this.__ul); - dom.addClass(this.domElement, CSS_NAMESPACE); - this.__folders = {}; - this.__controllers = []; - this.__rememberedObjects = []; - this.__rememberedObjectIndecesToControllers = []; - this.__listening = []; - params = Common.defaults(params, { - closeOnTop: false, - autoPlace: true, - width: GUI.DEFAULT_WIDTH - }); - params = Common.defaults(params, { - resizable: params.autoPlace, - hideable: params.autoPlace - }); - if (!Common.isUndefined(params.load)) { - if (params.preset) { - params.load.preset = params.preset; - } - } else { - params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; - } - if (Common.isUndefined(params.parent) && params.hideable) { - hideableGuis.push(this); - } - params.resizable = Common.isUndefined(params.parent) && params.resizable; - if (params.autoPlace && Common.isUndefined(params.scrollable)) { - params.scrollable = true; - } - var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; - var saveToLocalStorage = void 0; - var titleRow = void 0; - Object.defineProperties(this, - { - parent: { - get: function get$$1() { - return params.parent; - } - }, - scrollable: { - get: function get$$1() { - return params.scrollable; - } - }, - autoPlace: { - get: function get$$1() { - return params.autoPlace; - } - }, - closeOnTop: { - get: function get$$1() { - return params.closeOnTop; - } - }, - preset: { - get: function get$$1() { - if (_this.parent) { - return _this.getRoot().preset; - } - return params.load.preset; - }, - set: function set$$1(v) { - if (_this.parent) { - _this.getRoot().preset = v; - } else { - params.load.preset = v; - } - setPresetSelectIndex(this); - _this.revert(); - } - }, - width: { - get: function get$$1() { - return params.width; - }, - set: function set$$1(v) { - params.width = v; - setWidth(_this, v); - } - }, - name: { - get: function get$$1() { - return params.name; - }, - set: function set$$1(v) { - params.name = v; - if (titleRow) { - titleRow.innerHTML = params.name; - } - } - }, - closed: { - get: function get$$1() { - return params.closed; - }, - set: function set$$1(v) { - params.closed = v; - if (params.closed) { - dom.addClass(_this.__ul, GUI.CLASS_CLOSED); - } else { - dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); - } - this.onResize(); - if (_this.__closeButton) { - _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; - } - } - }, - load: { - get: function get$$1() { - return params.load; - } - }, - useLocalStorage: { - get: function get$$1() { - return useLocalStorage; - }, - set: function set$$1(bool) { - if (SUPPORTS_LOCAL_STORAGE) { - useLocalStorage = bool; - if (bool) { - dom.bind(window, 'unload', saveToLocalStorage); - } else { - dom.unbind(window, 'unload', saveToLocalStorage); - } - localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); - } - } - } - }); - if (Common.isUndefined(params.parent)) { - this.closed = params.closed || false; - dom.addClass(this.domElement, GUI.CLASS_MAIN); - dom.makeSelectable(this.domElement, false); - if (SUPPORTS_LOCAL_STORAGE) { - if (useLocalStorage) { - _this.useLocalStorage = true; - var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui')); - if (savedGui) { - params.load = JSON.parse(savedGui); - } - } - } - this.__closeButton = document.createElement('div'); - this.__closeButton.innerHTML = GUI.TEXT_CLOSED; - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); - if (params.closeOnTop) { - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP); - this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]); - } else { - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM); - this.domElement.appendChild(this.__closeButton); - } - dom.bind(this.__closeButton, 'click', function () { - _this.closed = !_this.closed; - }); - } else { - if (params.closed === undefined) { - params.closed = true; - } - var titleRowName = document.createTextNode(params.name); - dom.addClass(titleRowName, 'controller-name'); - titleRow = addRow(_this, titleRowName); - var onClickTitle = function onClickTitle(e) { - e.preventDefault(); - _this.closed = !_this.closed; - return false; - }; - dom.addClass(this.__ul, GUI.CLASS_CLOSED); - dom.addClass(titleRow, 'title'); - dom.bind(titleRow, 'click', onClickTitle); - if (!params.closed) { - this.closed = false; - } - } - if (params.autoPlace) { - if (Common.isUndefined(params.parent)) { - if (autoPlaceVirgin) { - autoPlaceContainer = document.createElement('div'); - dom.addClass(autoPlaceContainer, CSS_NAMESPACE); - dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER); - document.body.appendChild(autoPlaceContainer); - autoPlaceVirgin = false; - } - autoPlaceContainer.appendChild(this.domElement); - dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); - } - if (!this.parent) { - setWidth(_this, params.width); - } - } - this.__resizeHandler = function () { - _this.onResizeDebounced(); - }; - dom.bind(window, 'resize', this.__resizeHandler); - dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler); - dom.bind(this.__ul, 'transitionend', this.__resizeHandler); - dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler); - this.onResize(); - if (params.resizable) { - addResizeHandle(this); - } - saveToLocalStorage = function saveToLocalStorage() { - if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') { - localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); - } - }; - this.saveToLocalStorageIfPossible = saveToLocalStorage; - function resetWidth() { - var root = _this.getRoot(); - root.width += 1; - Common.defer(function () { - root.width -= 1; - }); - } - if (!params.parent) { - resetWidth(); - } -}; -GUI.toggleHide = function () { - hide = !hide; - Common.each(hideableGuis, function (gui) { - gui.domElement.style.display = hide ? 'none' : ''; - }); -}; -GUI.CLASS_AUTO_PLACE = 'a'; -GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; -GUI.CLASS_MAIN = 'main'; -GUI.CLASS_CONTROLLER_ROW = 'cr'; -GUI.CLASS_TOO_TALL = 'taller-than-window'; -GUI.CLASS_CLOSED = 'closed'; -GUI.CLASS_CLOSE_BUTTON = 'close-button'; -GUI.CLASS_CLOSE_TOP = 'close-top'; -GUI.CLASS_CLOSE_BOTTOM = 'close-bottom'; -GUI.CLASS_DRAG = 'drag'; -GUI.DEFAULT_WIDTH = 245; -GUI.TEXT_CLOSED = 'Close Controls'; -GUI.TEXT_OPEN = 'Open Controls'; -GUI._keydownHandler = function (e) { - if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) { - GUI.toggleHide(); - } -}; -dom.bind(window, 'keydown', GUI._keydownHandler, false); -Common.extend(GUI.prototype, -{ - add: function add(object, property) { - return _add(this, object, property, { - factoryArgs: Array.prototype.slice.call(arguments, 2) - }); - }, - addColor: function addColor(object, property) { - return _add(this, object, property, { - color: true - }); - }, - remove: function remove(controller) { - this.__ul.removeChild(controller.__li); - this.__controllers.splice(this.__controllers.indexOf(controller), 1); - var _this = this; - Common.defer(function () { - _this.onResize(); - }); - }, - destroy: function destroy() { - if (this.parent) { - throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.'); - } - if (this.autoPlace) { - autoPlaceContainer.removeChild(this.domElement); - } - var _this = this; - Common.each(this.__folders, function (subfolder) { - _this.removeFolder(subfolder); - }); - dom.unbind(window, 'keydown', GUI._keydownHandler, false); - removeListeners(this); - }, - addFolder: function addFolder(name) { - if (this.__folders[name] !== undefined) { - throw new Error('You already have a folder in this GUI by the' + ' name "' + name + '"'); - } - var newGuiParams = { name: name, parent: this }; - newGuiParams.autoPlace = this.autoPlace; - if (this.load && - this.load.folders && - this.load.folders[name]) { - newGuiParams.closed = this.load.folders[name].closed; - newGuiParams.load = this.load.folders[name]; - } - var gui = new GUI(newGuiParams); - this.__folders[name] = gui; - var li = addRow(this, gui.domElement); - dom.addClass(li, 'folder'); - return gui; - }, - removeFolder: function removeFolder(folder) { - this.__ul.removeChild(folder.domElement.parentElement); - delete this.__folders[folder.name]; - if (this.load && - this.load.folders && - this.load.folders[folder.name]) { - delete this.load.folders[folder.name]; - } - removeListeners(folder); - var _this = this; - Common.each(folder.__folders, function (subfolder) { - folder.removeFolder(subfolder); - }); - Common.defer(function () { - _this.onResize(); - }); - }, - open: function open() { - this.closed = false; - }, - close: function close() { - this.closed = true; - }, - hide: function hide() { - this.domElement.style.display = 'none'; - }, - show: function show() { - this.domElement.style.display = ''; - }, - onResize: function onResize() { - var root = this.getRoot(); - if (root.scrollable) { - var top = dom.getOffset(root.__ul).top; - var h = 0; - Common.each(root.__ul.childNodes, function (node) { - if (!(root.autoPlace && node === root.__save_row)) { - h += dom.getHeight(node); - } - }); - if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { - dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); - root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; - } else { - dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); - root.__ul.style.height = 'auto'; - } - } - if (root.__resize_handle) { - Common.defer(function () { - root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; - }); - } - if (root.__closeButton) { - root.__closeButton.style.width = root.width + 'px'; - } - }, - onResizeDebounced: Common.debounce(function () { - this.onResize(); - }, 50), - remember: function remember() { - if (Common.isUndefined(SAVE_DIALOGUE)) { - SAVE_DIALOGUE = new CenteredDiv(); - SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents; - } - if (this.parent) { - throw new Error('You can only call remember on a top level GUI.'); - } - var _this = this; - Common.each(Array.prototype.slice.call(arguments), function (object) { - if (_this.__rememberedObjects.length === 0) { - addSaveMenu(_this); - } - if (_this.__rememberedObjects.indexOf(object) === -1) { - _this.__rememberedObjects.push(object); - } - }); - if (this.autoPlace) { - setWidth(this, this.width); - } - }, - getRoot: function getRoot() { - var gui = this; - while (gui.parent) { - gui = gui.parent; - } - return gui; - }, - getSaveObject: function getSaveObject() { - var toReturn = this.load; - toReturn.closed = this.closed; - if (this.__rememberedObjects.length > 0) { - toReturn.preset = this.preset; - if (!toReturn.remembered) { - toReturn.remembered = {}; - } - toReturn.remembered[this.preset] = getCurrentPreset(this); - } - toReturn.folders = {}; - Common.each(this.__folders, function (element, key) { - toReturn.folders[key] = element.getSaveObject(); - }); - return toReturn; - }, - save: function save() { - if (!this.load.remembered) { - this.load.remembered = {}; - } - this.load.remembered[this.preset] = getCurrentPreset(this); - markPresetModified(this, false); - this.saveToLocalStorageIfPossible(); - }, - saveAs: function saveAs(presetName) { - if (!this.load.remembered) { - this.load.remembered = {}; - this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); - } - this.load.remembered[presetName] = getCurrentPreset(this); - this.preset = presetName; - addPresetOption(this, presetName, true); - this.saveToLocalStorageIfPossible(); - }, - revert: function revert(gui) { - Common.each(this.__controllers, function (controller) { - if (!this.getRoot().load.remembered) { - controller.setValue(controller.initialValue); - } else { - recallSavedValue(gui || this.getRoot(), controller); - } - if (controller.__onFinishChange) { - controller.__onFinishChange.call(controller, controller.getValue()); - } - }, this); - Common.each(this.__folders, function (folder) { - folder.revert(folder); - }); - if (!gui) { - markPresetModified(this.getRoot(), false); - } - }, - listen: function listen(controller) { - var init = this.__listening.length === 0; - this.__listening.push(controller); - if (init) { - updateDisplays(this.__listening); - } - }, - updateDisplay: function updateDisplay() { - Common.each(this.__controllers, function (controller) { - controller.updateDisplay(); - }); - Common.each(this.__folders, function (folder) { - folder.updateDisplay(); - }); - } -}); -function addRow(gui, newDom, liBefore) { - var li = document.createElement('li'); - if (newDom) { - li.appendChild(newDom); - } - if (liBefore) { - gui.__ul.insertBefore(li, liBefore); - } else { - gui.__ul.appendChild(li); - } - gui.onResize(); - return li; -} -function removeListeners(gui) { - dom.unbind(window, 'resize', gui.__resizeHandler); - if (gui.saveToLocalStorageIfPossible) { - dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible); - } -} -function markPresetModified(gui, modified) { - var opt = gui.__preset_select[gui.__preset_select.selectedIndex]; - if (modified) { - opt.innerHTML = opt.value + '*'; - } else { - opt.innerHTML = opt.value; - } -} -function augmentController(gui, li, controller) { - controller.__li = li; - controller.__gui = gui; - Common.extend(controller, { - options: function options(_options) { - if (arguments.length > 1) { - var nextSibling = controller.__li.nextElementSibling; - controller.remove(); - return _add(gui, controller.object, controller.property, { - before: nextSibling, - factoryArgs: [Common.toArray(arguments)] - }); - } - if (Common.isArray(_options) || Common.isObject(_options)) { - var _nextSibling = controller.__li.nextElementSibling; - controller.remove(); - return _add(gui, controller.object, controller.property, { - before: _nextSibling, - factoryArgs: [_options] - }); - } - }, - name: function name(_name) { - controller.__li.firstElementChild.firstElementChild.innerHTML = _name; - return controller; - }, - listen: function listen() { - controller.__gui.listen(controller); - return controller; - }, - remove: function remove() { - controller.__gui.remove(controller); - return controller; - } - }); - if (controller instanceof NumberControllerSlider) { - var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step }); - Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) { - var pc = controller[method]; - var pb = box[method]; - controller[method] = box[method] = function () { - var args = Array.prototype.slice.call(arguments); - pb.apply(box, args); - return pc.apply(controller, args); - }; - }); - dom.addClass(li, 'has-slider'); - controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); - } else if (controller instanceof NumberControllerBox) { - var r = function r(returned) { - if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) { - var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML; - var wasListening = controller.__gui.__listening.indexOf(controller) > -1; - controller.remove(); - var newController = _add(gui, controller.object, controller.property, { - before: controller.__li.nextElementSibling, - factoryArgs: [controller.__min, controller.__max, controller.__step] - }); - newController.name(oldName); - if (wasListening) newController.listen(); - return newController; - } - return returned; - }; - controller.min = Common.compose(r, controller.min); - controller.max = Common.compose(r, controller.max); - } else if (controller instanceof BooleanController) { - dom.bind(li, 'click', function () { - dom.fakeEvent(controller.__checkbox, 'click'); - }); - dom.bind(controller.__checkbox, 'click', function (e) { - e.stopPropagation(); - }); - } else if (controller instanceof FunctionController) { - dom.bind(li, 'click', function () { - dom.fakeEvent(controller.__button, 'click'); - }); - dom.bind(li, 'mouseover', function () { - dom.addClass(controller.__button, 'hover'); - }); - dom.bind(li, 'mouseout', function () { - dom.removeClass(controller.__button, 'hover'); - }); - } else if (controller instanceof ColorController) { - dom.addClass(li, 'color'); - controller.updateDisplay = Common.compose(function (val) { - li.style.borderLeftColor = controller.__color.toString(); - return val; - }, controller.updateDisplay); - controller.updateDisplay(); - } - controller.setValue = Common.compose(function (val) { - if (gui.getRoot().__preset_select && controller.isModified()) { - markPresetModified(gui.getRoot(), true); - } - return val; - }, controller.setValue); -} -function recallSavedValue(gui, controller) { - var root = gui.getRoot(); - var matchedIndex = root.__rememberedObjects.indexOf(controller.object); - if (matchedIndex !== -1) { - var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex]; - if (controllerMap === undefined) { - controllerMap = {}; - root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap; - } - controllerMap[controller.property] = controller; - if (root.load && root.load.remembered) { - var presetMap = root.load.remembered; - var preset = void 0; - if (presetMap[gui.preset]) { - preset = presetMap[gui.preset]; - } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) { - preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME]; - } else { - return; - } - if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) { - var value = preset[matchedIndex][controller.property]; - controller.initialValue = value; - controller.setValue(value); - } - } - } -} -function _add(gui, object, property, params) { - if (object[property] === undefined) { - throw new Error('Object "' + object + '" has no property "' + property + '"'); - } - var controller = void 0; - if (params.color) { - controller = new ColorController(object, property); - } else { - var factoryArgs = [object, property].concat(params.factoryArgs); - controller = ControllerFactory.apply(gui, factoryArgs); - } - if (params.before instanceof Controller) { - params.before = params.before.__li; - } - recallSavedValue(gui, controller); - dom.addClass(controller.domElement, 'c'); - var name = document.createElement('span'); - dom.addClass(name, 'property-name'); - name.innerHTML = controller.property; - var container = document.createElement('div'); - container.appendChild(name); - container.appendChild(controller.domElement); - var li = addRow(gui, container, params.before); - dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); - if (controller instanceof ColorController) { - dom.addClass(li, 'color'); - } else { - dom.addClass(li, _typeof(controller.getValue())); - } - augmentController(gui, li, controller); - gui.__controllers.push(controller); - return controller; -} -function getLocalStorageHash(gui, key) { - return document.location.href + '.' + key; -} -function addPresetOption(gui, name, setSelected) { - var opt = document.createElement('option'); - opt.innerHTML = name; - opt.value = name; - gui.__preset_select.appendChild(opt); - if (setSelected) { - gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; - } -} -function showHideExplain(gui, explain) { - explain.style.display = gui.useLocalStorage ? 'block' : 'none'; -} -function addSaveMenu(gui) { - var div = gui.__save_row = document.createElement('li'); - dom.addClass(gui.domElement, 'has-save'); - gui.__ul.insertBefore(div, gui.__ul.firstChild); - dom.addClass(div, 'save-row'); - var gears = document.createElement('span'); - gears.innerHTML = ' '; - dom.addClass(gears, 'button gears'); - var button = document.createElement('span'); - button.innerHTML = 'Save'; - dom.addClass(button, 'button'); - dom.addClass(button, 'save'); - var button2 = document.createElement('span'); - button2.innerHTML = 'New'; - dom.addClass(button2, 'button'); - dom.addClass(button2, 'save-as'); - var button3 = document.createElement('span'); - button3.innerHTML = 'Revert'; - dom.addClass(button3, 'button'); - dom.addClass(button3, 'revert'); - var select = gui.__preset_select = document.createElement('select'); - if (gui.load && gui.load.remembered) { - Common.each(gui.load.remembered, function (value, key) { - addPresetOption(gui, key, key === gui.preset); - }); - } else { - addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); - } - dom.bind(select, 'change', function () { - for (var index = 0; index < gui.__preset_select.length; index++) { - gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; - } - gui.preset = this.value; - }); - div.appendChild(select); - div.appendChild(gears); - div.appendChild(button); - div.appendChild(button2); - div.appendChild(button3); - if (SUPPORTS_LOCAL_STORAGE) { - var explain = document.getElementById('dg-local-explain'); - var localStorageCheckBox = document.getElementById('dg-local-storage'); - var saveLocally = document.getElementById('dg-save-locally'); - saveLocally.style.display = 'block'; - if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { - localStorageCheckBox.setAttribute('checked', 'checked'); - } - showHideExplain(gui, explain); - dom.bind(localStorageCheckBox, 'change', function () { - gui.useLocalStorage = !gui.useLocalStorage; - showHideExplain(gui, explain); - }); - } - var newConstructorTextArea = document.getElementById('dg-new-constructor'); - dom.bind(newConstructorTextArea, 'keydown', function (e) { - if (e.metaKey && (e.which === 67 || e.keyCode === 67)) { - SAVE_DIALOGUE.hide(); - } - }); - dom.bind(gears, 'click', function () { - newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); - SAVE_DIALOGUE.show(); - newConstructorTextArea.focus(); - newConstructorTextArea.select(); - }); - dom.bind(button, 'click', function () { - gui.save(); - }); - dom.bind(button2, 'click', function () { - var presetName = prompt('Enter a new preset name.'); - if (presetName) { - gui.saveAs(presetName); - } - }); - dom.bind(button3, 'click', function () { - gui.revert(); - }); -} -function addResizeHandle(gui) { - var pmouseX = void 0; - gui.__resize_handle = document.createElement('div'); - Common.extend(gui.__resize_handle.style, { - width: '6px', - marginLeft: '-3px', - height: '200px', - cursor: 'ew-resize', - position: 'absolute' - }); - function drag(e) { - e.preventDefault(); - gui.width += pmouseX - e.clientX; - gui.onResize(); - pmouseX = e.clientX; - return false; - } - function dragStop() { - dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); - dom.unbind(window, 'mousemove', drag); - dom.unbind(window, 'mouseup', dragStop); - } - function dragStart(e) { - e.preventDefault(); - pmouseX = e.clientX; - dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); - dom.bind(window, 'mousemove', drag); - dom.bind(window, 'mouseup', dragStop); - return false; - } - dom.bind(gui.__resize_handle, 'mousedown', dragStart); - dom.bind(gui.__closeButton, 'mousedown', dragStart); - gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); -} -function setWidth(gui, w) { - gui.domElement.style.width = w + 'px'; - if (gui.__save_row && gui.autoPlace) { - gui.__save_row.style.width = w + 'px'; - } - if (gui.__closeButton) { - gui.__closeButton.style.width = w + 'px'; - } -} -function getCurrentPreset(gui, useInitialValues) { - var toReturn = {}; - Common.each(gui.__rememberedObjects, function (val, index) { - var savedValues = {}; - var controllerMap = gui.__rememberedObjectIndecesToControllers[index]; - Common.each(controllerMap, function (controller, property) { - savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue(); - }); - toReturn[index] = savedValues; - }); - return toReturn; -} -function setPresetSelectIndex(gui) { - for (var index = 0; index < gui.__preset_select.length; index++) { - if (gui.__preset_select[index].value === gui.preset) { - gui.__preset_select.selectedIndex = index; - } - } -} -function updateDisplays(controllerArray) { - if (controllerArray.length !== 0) { - requestAnimationFrame$1.call(window, function () { - updateDisplays(controllerArray); - }); - } - Common.each(controllerArray, function (c) { - c.updateDisplay(); - }); -} - -var color = { - Color: Color, - math: ColorMath, - interpret: interpret -}; -var controllers = { - Controller: Controller, - BooleanController: BooleanController, - OptionController: OptionController, - StringController: StringController, - NumberController: NumberController, - NumberControllerBox: NumberControllerBox, - NumberControllerSlider: NumberControllerSlider, - FunctionController: FunctionController, - ColorController: ColorController -}; -var dom$1 = { dom: dom }; -var gui = { GUI: GUI }; -var GUI$1 = GUI; -var index = { - color: color, - controllers: controllers, - dom: dom$1, - gui: gui, - GUI: GUI$1 -}; - -export { color, controllers, dom$1 as dom, gui, GUI$1 as GUI }; -export default index; -//# sourceMappingURL=dat.gui.module.js.map diff --git a/build/dat.gui.module.js.map b/build/dat.gui.module.js.map deleted file mode 100644 index 15c522a3f..000000000 --- a/build/dat.gui.module.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dat.gui.module.js","sources":["../src/dat/color/toString.js","../src/dat/utils/common.js","../src/dat/color/interpret.js","../src/dat/color/math.js","../src/dat/color/Color.js","../src/dat/controllers/Controller.js","../src/dat/dom/dom.js","../src/dat/controllers/BooleanController.js","../src/dat/controllers/OptionController.js","../src/dat/controllers/StringController.js","../src/dat/controllers/NumberController.js","../src/dat/controllers/NumberControllerBox.js","../src/dat/controllers/NumberControllerSlider.js","../src/dat/controllers/FunctionController.js","../src/dat/controllers/ColorController.js","../src/dat/utils/css.js","../src/dat/gui/saveDialogue.html.js","../src/dat/controllers/ControllerFactory.js","../src/dat/utils/requestAnimationFrame.js","../src/dat/dom/CenteredDiv.js","../src/dat/gui/GUI.js","../src/dat/index.js"],"sourcesContent":["/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nexport default function(color, forceCSSHex) {\n const colorFormat = color.__state.conversionName.toString();\n\n const r = Math.round(color.r);\n const g = Math.round(color.g);\n const b = Math.round(color.b);\n const a = color.a;\n const h = Math.round(color.h);\n const s = color.s.toFixed(1);\n const v = color.v.toFixed(1);\n\n if (forceCSSHex || (colorFormat === 'THREE_CHAR_HEX') || (colorFormat === 'SIX_CHAR_HEX')) {\n let str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n\n return 'unknown format';\n}\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nconst ARR_EACH = Array.prototype.forEach;\nconst ARR_SLICE = Array.prototype.slice;\n\n/**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\nconst Common = {\n BREAK: {},\n\n extend: function(target) {\n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n const keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function(key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n\n return target;\n },\n\n defaults: function(target) {\n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n const keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function(key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n\n return target;\n },\n\n compose: function() {\n const toCall = ARR_SLICE.call(arguments);\n return function() {\n let args = ARR_SLICE.call(arguments);\n for (let i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n\n each: function(obj, itr, scope) {\n if (!obj) {\n return;\n }\n\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n let key;\n let l;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (const key in obj) {\n if (itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n }\n },\n\n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n\n // if the function is called repeatedly, wait until threshold passes until we execute the function\n debounce: function(func, threshold, callImmediately) {\n let timeout;\n\n return function() {\n const obj = this;\n const args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n\n const callNow = callImmediately || !timeout;\n\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n\n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n\n isNull: function(obj) {\n return obj === null;\n },\n\n isNaN: function(obj) {\n return isNaN(obj);\n },\n\n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n\n isObject: function(obj) {\n return obj === Object(obj);\n },\n\n isNumber: function(obj) {\n return obj === obj + 0;\n },\n\n isString: function(obj) {\n return obj === obj + '';\n },\n\n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n\n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n\n};\n\nexport default Common;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport toString from './toString';\nimport common from '../utils/common';\n\nconst INTERPRETATIONS = [\n // Strings\n {\n litmus: common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function(original) {\n const test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString(), 0)\n };\n },\n\n write: toString\n },\n\n SIX_CHAR_HEX: {\n read: function(original) {\n const test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n\n write: toString\n },\n\n CSS_RGB: {\n read: function(original) {\n const test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n\n write: toString\n },\n\n CSS_RGBA: {\n read: function(original) {\n const test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n\n write: toString\n }\n }\n },\n\n // Numbers\n {\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n litmus: common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function(original) {\n if (original.length !== 3) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n },\n\n // Objects\n {\n litmus: common.isObject,\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n }\n];\n\nlet result;\nlet toReturn;\n\nconst interpret = function() {\n toReturn = false;\n\n const original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n common.each(INTERPRETATIONS, function(family) {\n if (family.litmus(original)) {\n common.each(family.conversions, function(conversion, conversionName) {\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n }\n });\n\n return common.BREAK;\n }\n });\n\n return toReturn;\n};\n\nexport default interpret;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nlet tmpComponent;\n\nconst ColorMath = {\n hsv_to_rgb: function(h, s, v) {\n const hi = Math.floor(h / 60) % 6;\n\n const f = h / 60 - Math.floor(h / 60);\n const p = v * (1.0 - s);\n const q = v * (1.0 - (f * s));\n const t = v * (1.0 - ((1.0 - f) * s));\n\n const c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n\n rgb_to_hsv: function(r, g, b) {\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n const delta = max - min;\n let h;\n let s;\n\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n let hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~(0xFF << tmpComponent));\n }\n};\n\nexport default ColorMath;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport interpret from './interpret';\nimport math from './math';\nimport colorToString from './toString';\nimport common from '../utils/common';\n\nclass Color {\n constructor() {\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n\n this.__state.a = this.__state.a || 1;\n }\n\n toString() {\n return colorToString(this);\n }\n\n toHexString() {\n return colorToString(this, true);\n }\n\n toOriginal() {\n return this.__state.conversion.write(this);\n }\n}\n\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n Color.recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n },\n\n set: function(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n }\n });\n}\n\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n\n Color.recalculateHSV(this);\n\n return this.__state[component];\n },\n\n set: function(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n }\n });\n}\n\n\nColor.recalculateRGB = function(color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\n\nColor.recalculateHSV = function(color) {\n const result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\n\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\n\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\n\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\n\nObject.defineProperty(Color.prototype, 'a', {\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n});\n\nObject.defineProperty(Color.prototype, 'hex', {\n get: function() {\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n },\n\n set: function(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nexport default Color;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass Controller {\n constructor(object, property) {\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n }\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {Controller} this\n */\n onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {Controller} this\n */\n onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n\n this.updateDisplay();\n return this;\n }\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue() {\n return this.object[this.property];\n }\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {Controller} this\n */\n updateDisplay() {\n return this;\n }\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified() {\n return this.initialValue !== this.getValue();\n }\n}\n\nexport default Controller;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport common from '../utils/common';\n\nconst EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\n\nconst EVENT_MAP_INV = {};\ncommon.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n});\n\nconst CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\nfunction cssValueToPixels(val) {\n if (val === '0' || common.isUndefined(val)) {\n return 0;\n }\n\n const match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n}\n\n/**\n * @namespace\n * @member dat.dom\n */\nconst dom = {\n\n /**\n *\n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vert\n */\n makeFullscreen: function(elem, hor, vert) {\n let vertical = vert;\n let horizontal = hor;\n\n if (common.isUndefined(horizontal)) {\n horizontal = true;\n }\n\n if (common.isUndefined(vertical)) {\n vertical = true;\n }\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, pars, aux) {\n const params = pars || {};\n const className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n const evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n const clientX = params.x || params.clientX || 0;\n const clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, // screen X\n 0, // screen Y\n clientX, // client X\n clientY, // client Y\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n const init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, newBool) {\n const bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, newBool) {\n const bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n const classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n const classes = elem.className.split(/ +/);\n const index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n const style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style.width);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n const style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style.height);\n },\n\n /**\n *\n * @param el\n */\n getOffset: function(el) {\n let elem = el;\n const offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n *\n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n\n};\n\nexport default dom;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a checkbox input to alter the boolean property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass BooleanController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n const _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n }\n\n setValue(v) {\n const toReturn = super.setValue(v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n\n updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n\n return super.updateDisplay();\n }\n}\n\nexport default BooleanController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\n/**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n */\nclass OptionController extends Controller {\n constructor(object, property, opts) {\n super(object, property);\n\n let options = opts;\n\n const _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n const map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n const opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n const desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n }\n\n setValue(v) {\n const toReturn = super.setValue(v);\n\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n\n updateDisplay() {\n if (dom.isActive(this.__select)) return this; // prevent number from updating if user is trying to manually update\n this.__select.value = this.getValue();\n return super.updateDisplay();\n }\n}\n\nexport default OptionController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass StringController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n const _this = this;\n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n }\n\n updateDisplay() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return super.updateDisplay();\n }\n}\n\nexport default StringController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport common from '../utils/common';\n\nfunction numDecimals(x) {\n const _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n\n return 0;\n}\n\n/**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n */\nclass NumberController extends Controller {\n constructor(object, property, params) {\n super(object, property);\n\n const _params = params || {};\n\n this.__min = _params.min;\n this.__max = _params.max;\n this.__step = _params.step;\n\n if (common.isUndefined(this.__step)) {\n if (this.initialValue === 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n this.__impliedStep = this.__step;\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n }\n\n setValue(v) {\n let _v = v;\n\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n\n return super.setValue(_v);\n }\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min(minValue) {\n this.__min = minValue;\n return this;\n }\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n}\n\nexport default NumberController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport NumberController from './NumberController';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nfunction roundToDecimal(value, decimals) {\n const tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\n\n/**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n */\nclass NumberControllerBox extends NumberController {\n constructor(object, property, params) {\n super(object, property, params);\n\n this.__truncationSuspended = false;\n\n const _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n let prevY;\n\n function onChange() {\n const attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onBlur() {\n onFinish();\n }\n\n function onMouseDrag(e) {\n const diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prevY = e.clientY;\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n // When pressing enter, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n }\n\n updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return super.updateDisplay();\n }\n}\n\nexport default NumberControllerBox;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport NumberController from './NumberController';\nimport dom from '../dom/dom';\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\n\n/**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n */\nclass NumberControllerSlider extends NumberController {\n constructor(object, property, min, max, step) {\n super(object, property, { min: min, max: max, step: step });\n\n const _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n dom.bind(this.__background, 'touchstart', onTouchStart);\n\n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n document.activeElement.blur();\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n e.preventDefault();\n\n const bgRect = _this.__background.getBoundingClientRect();\n\n _this.setValue(\n map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)\n );\n\n return false;\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onTouchStart(e) {\n if (e.touches.length !== 1) { return; }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n\n function onTouchMove(e) {\n const clientX = e.touches[0].clientX;\n const bgRect = _this.__background.getBoundingClientRect();\n\n _this.setValue(\n map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)\n );\n }\n\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n }\n\n updateDisplay() {\n const pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return super.updateDisplay();\n }\n}\n\nexport default NumberControllerSlider;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass FunctionController extends Controller {\n constructor(object, property, text) {\n super(object, property);\n\n const _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n }\n\n fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n}\n\nexport default FunctionController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\nimport Color from '../color/Color';\nimport interpret from '../color/interpret';\nimport common from '../utils/common';\n\n/**\n * @class Represents a given property of an object that is a color.\n * @param {Object} object\n * @param {string} property\n */\nclass ColorController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n const _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(/* e */) {\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(/* e */) {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n\n dom.bind(this.__selector, 'touchstart', function(/* e */) {\n dom\n .addClass(this, 'drag')\n .bind(window, 'touchend', function(/* e */) {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n\n const valueField = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n\n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__saturation_field, 'touchstart', fieldDown);\n\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'touchstart', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', fieldDownH);\n dom.bind(this.__hue_field, 'touchstart', fieldDownH);\n\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n\n function onBlur() {\n const i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n\n this.__saturation_field.appendChild(valueField);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) { e.preventDefault(); }\n\n const fieldRect = _this.__saturation_field.getBoundingClientRect();\n const { clientX, clientY } = (e.touches && e.touches[0]) || e;\n let s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n let v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n }\n\n function setH(e) {\n if (e.type.indexOf('touch') === -1) { e.preventDefault(); }\n\n const fieldRect = _this.__hue_field.getBoundingClientRect();\n const { clientY } = (e.touches && e.touches[0]) || e;\n let h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n }\n }\n\n updateDisplay() {\n const i = interpret(this.getValue());\n\n if (i !== false) {\n let mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) && !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n const flip = (this.__color.v < 0.5 || this.__color.s > 0.5) ? 255 : 0;\n const _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n\n this.__input.value = this.__color.toString();\n\n common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n}\n\nconst vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\n\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\n\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nexport default ColorController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nconst css = {\n load: function(url, indoc) {\n const doc = indoc || document;\n const link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n\n inject: function(cssContent, indoc) {\n const doc = indoc || document;\n const injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n const head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) { // Unable to inject CSS, probably because of a Content Security Policy\n }\n }\n};\n\nexport default css;\n","const saveDialogContents = `
\n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n
`;\n\nexport default saveDialogContents;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport OptionController from './OptionController';\nimport NumberControllerBox from './NumberControllerBox';\nimport NumberControllerSlider from './NumberControllerSlider';\nimport StringController from './StringController';\nimport FunctionController from './FunctionController';\nimport BooleanController from './BooleanController';\nimport common from '../utils/common';\n\nconst ControllerFactory = function(object, property) {\n const initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n if (common.isNumber(initialValue)) {\n // Has min and max? (slider)\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n // has step?\n if (common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property,\n arguments[2], arguments[3], arguments[4]);\n }\n\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n\n // number box\n if (common.isNumber(arguments[4])) { // has step\n return new NumberControllerBox(object, property,\n { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n return null;\n};\n\nexport default ControllerFactory;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\n\nexport default window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n requestAnimationFrame;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nclass CenteredDiv {\n constructor() {\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n const _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n }\n\n show() {\n const _this = this;\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n\n /**\n * Hide centered div\n */\n hide() {\n const _this = this;\n\n const hide = function() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n\n layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n}\n\nexport default CenteredDiv;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport css from '../utils/css';\nimport saveDialogueContents from './saveDialogue.html';\nimport ControllerFactory from '../controllers/ControllerFactory';\nimport Controller from '../controllers/Controller';\nimport BooleanController from '../controllers/BooleanController';\nimport FunctionController from '../controllers/FunctionController';\nimport NumberControllerBox from '../controllers/NumberControllerBox';\nimport NumberControllerSlider from '../controllers/NumberControllerSlider';\nimport ColorController from '../controllers/ColorController';\nimport requestAnimationFrame from '../utils/requestAnimationFrame';\nimport CenteredDiv from '../dom/CenteredDiv';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nimport styleSheet from './style.scss'; // CSS to embed in build\n\ncss.inject(styleSheet);\n\n/** @ignore Outer-most className for GUI's */\nconst CSS_NAMESPACE = 'dg';\n\nconst HIDE_KEY_CODE = 72;\n\n/** @ignore The only value shared between the JS and SCSS. Use caution. */\nconst CLOSE_BUTTON_HEIGHT = 20;\n\nconst DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\nconst SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}());\n\nlet SAVE_DIALOGUE;\n\n/** @ignore Have we yet to create an autoPlace GUI? */\nlet autoPlaceVirgin = true;\n\n/** @ignore Fixed position div that auto place GUI's go inside */\nlet autoPlaceContainer;\n\n/** @ignore Are we hiding the GUI's ? */\nlet hide = false;\n\n/** @private GUI's which should be hidden */\nconst hideableGuis = [];\n\n/**\n * @class A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n *\n * @typicalname gui\n *\n * @example\n * // Creating a GUI with options.\n * var gui = new dat.GUI({name: 'My GUI'});\n *\n * @example\n * // Creating a GUI and a subfolder.\n * var gui = new dat.GUI();\n * var folder1 = gui.addFolder('Flow Field');\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.autoPlace=true]\n * @param {Boolean} [params.hideable=true] If true, GUI is shown/hidden by h keypress.\n * @param {Boolean} [params.closed=false] If true, starts closed\n * @param {Boolean} [params.closeOnTop=false] If true, close/open button shows on top of the GUI\n */\nconst GUI = function(pars) {\n const _this = this;\n\n let params = pars || {};\n\n /**\n * Outermost DOM Element\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n // Default parameters\n params = common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n if (!common.isUndefined(params.load)) {\n // Explicit preset\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n let useLocalStorage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n let saveToLocalStorage;\n let titleRow;\n\n Object.defineProperties(this,\n /** @lends GUI.prototype */\n {\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * Handles GUI's position of open/close button\n * @type Boolean\n */\n closeOnTop: {\n get: function() {\n return params.closeOnTop;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n\n return params.load.preset;\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return useLocalStorage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n\n const savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n\n dom.bind(this.__closeButton, 'click', function() {\n _this.closed = !_this.closed;\n });\n // Oh, you're a nested GUI!\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n const titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n\n titleRow = addRow(_this, titleRowName);\n\n const onClickTitle = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n\n if (!params.closed) {\n this.closed = false;\n }\n }\n\n if (params.autoPlace) {\n if (common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n\n // Put it in the dom for you.\n autoPlaceContainer.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n\n\n // Make it not elastic.\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n\n this.__resizeHandler = function() {\n _this.onResizeDebounced();\n };\n\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n saveToLocalStorage = function() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n\n // expose this method publicly\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n\n function resetWidth() {\n const root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n};\n\nGUI.toggleHide = function() {\n hide = !hide;\n common.each(hideableGuis, function(gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\n\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\n\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\n\nGUI._keydownHandler = function(e) {\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\n\ncommon.extend(\n GUI.prototype,\n\n /** @lends GUI.prototype */\n {\n\n /**\n * Adds a new {@link Controller} to the GUI. The type of controller created\n * is inferred from the initial value of object[property]. For\n * color properties, see {@link addColor}.\n *\n * @param {Object} object The object to be manipulated\n * @param {String} property The name of the property to be manipulated\n * @param {Number} [min] Minimum allowed value\n * @param {Number} [max] Maximum allowed value\n * @param {Number} [step] Increment by which to change value\n * @returns {Controller} The controller that was added to the GUI.\n * @instance\n *\n * @example\n * // Add a string controller.\n * var person = {name: 'Sam'};\n * gui.add(person, 'name');\n *\n * @example\n * // Add a number controller slider.\n * var person = {age: 45};\n * gui.add(person, 'age', 0, 100);\n */\n add: function(object, property) {\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n },\n\n /**\n * Adds a new color controller to the GUI.\n *\n * @param object\n * @param property\n * @returns {Controller} The controller that was added to the GUI.\n * @instance\n *\n * @example\n * var palette = {\n * color1: '#FF0000', // CSS string\n * color2: [ 0, 128, 255 ], // RGB array\n * color3: [ 0, 128, 255, 0.3 ], // RGB with alpha\n * color4: { h: 350, s: 0.9, v: 0.3 } // Hue, saturation, value\n * };\n * gui.addColor(palette, 'color1');\n * gui.addColor(palette, 'color2');\n * gui.addColor(palette, 'color3');\n * gui.addColor(palette, 'color4');\n */\n addColor: function(object, property) {\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n },\n\n /**\n * Removes the given controller from the GUI.\n * @param {Controller} controller\n * @instance\n */\n remove: function(controller) {\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n const _this = this;\n common.defer(function() {\n _this.onResize();\n });\n },\n\n /**\n * Removes the root GUI from the document and unbinds all event listeners.\n * For subfolders, use `gui.removeFolder(folder)` instead.\n * @instance\n */\n destroy: function() {\n if (this.parent) {\n throw new Error(\n 'Only the root GUI should be removed with .destroy(). ' +\n 'For subfolders, use gui.removeFolder(folder) instead.'\n );\n }\n\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n\n const _this = this;\n common.each(this.__folders, function(subfolder) {\n _this.removeFolder(subfolder);\n });\n\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n\n removeListeners(this);\n },\n\n /**\n * Creates a new subfolder GUI instance.\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n const newGuiParams = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n newGuiParams.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n // Start me closed if I was closed\n newGuiParams.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n newGuiParams.load = this.load.folders[name];\n }\n\n const gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n\n const li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n\n /**\n * Removes a subfolder GUI instance.\n * @param {dat.gui.GUI} folder The folder to remove.\n * @instance\n */\n removeFolder: function(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n\n delete this.__folders[folder.name];\n\n // Do we have saved appearance data for this folder?\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n\n removeListeners(folder);\n\n const _this = this;\n\n common.each(folder.__folders, function(subfolder) {\n folder.removeFolder(subfolder);\n });\n\n common.defer(function() {\n _this.onResize();\n });\n },\n\n /**\n * Opens the GUI.\n */\n open: function() {\n this.closed = false;\n },\n\n /**\n * Closes the GUI.\n */\n close: function() {\n this.closed = true;\n },\n\n /**\n * Hides the GUI.\n */\n hide: function() {\n this.domElement.style.display = 'none';\n },\n\n /**\n * Shows the GUI.\n */\n show: function() {\n this.domElement.style.display = '';\n },\n\n\n onResize: function() {\n // we debounce this function to prevent performance issues when rotating on tablet/mobile\n const root = this.getRoot();\n if (root.scrollable) {\n const top = dom.getOffset(root.__ul).top;\n let h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n\n onResizeDebounced: common.debounce(function() { this.onResize(); }, 50),\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {...Object} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n * @ignore\n */\n remember: function() {\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n\n const _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n let gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n const toReturn = this.load;\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n },\n\n save: function() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n\n saveAs: function(presetName) {\n if (!this.load.remembered) {\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n\n revert: function(gui) {\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n\n // fire onFinishChange callback\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n\n listen: function(controller) {\n const init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n\n updateDisplay: function() {\n common.each(this.__controllers, function(controller) {\n controller.updateDisplay();\n });\n common.each(this.__folders, function(folder) {\n folder.updateDisplay();\n });\n }\n }\n);\n\n/**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [newDom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n *\n * @ignore\n */\nfunction addRow(gui, newDom, liBefore) {\n const li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\n\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\n\nfunction markPresetModified(gui, modified) {\n const opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\n\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, /** @lends Controller.prototype */ {\n /**\n * @param {Array|Object} options\n * @return {Controller}\n */\n options: function(options) {\n if (arguments.length > 1) {\n const nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: nextSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n const nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: nextSibling,\n factoryArgs: [options]\n }\n );\n }\n },\n\n /**\n * Sets the name of the controller.\n * @param {string} name\n * @return {Controller}\n */\n name: function(name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = name;\n return controller;\n },\n\n /**\n * Sets controller to listen for changes on its underlying object.\n * @return {Controller}\n */\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n /**\n * Removes the controller from its parent GUI.\n * @return {Controller}\n */\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n const box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function(method) {\n const pc = controller[method];\n const pb = box[method];\n controller[method] = box[method] = function() {\n const args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n const r = function(returned) {\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n // Well, then lets just replace this with a slider.\n\n // lets remember if the old controller had a specific name or was listening\n const oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n const wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n\n controller.remove();\n const newController = add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n newController.name(oldName);\n if (wasListening) newController.listen();\n\n return newController;\n }\n\n return returned;\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n }\n\n controller.setValue = common.compose(function(val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n\n return val;\n }, controller.setValue);\n}\n\nfunction recallSavedValue(gui, controller) {\n // Find the topmost GUI, that's where remembered objects live.\n const root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n const matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matchedIndex !== -1) {\n // Let me fetch a map of controllers for thcommon.isObject.\n let controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] =\n controllerMap;\n }\n\n // Keep track of this controller\n controllerMap[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n const presetMap = root.load.remembered;\n\n // Which preset are we trying to load?\n let preset;\n\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n // Uhh, you can have the default instead?\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n // Nada.\n return;\n }\n\n // Did the loaded object remember thcommon.isObject? && Did we remember this particular property?\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n // We did remember something for this guy ...\n const value = preset[matchedIndex][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\n\nfunction add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error(`Object \"${object}\" has no property \"${property}\"`);\n }\n\n let controller;\n\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n const factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n const name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n const container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n const li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, typeof controller.getValue());\n }\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n}\n\nfunction getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n}\n\nfunction addPresetOption(gui, name, setSelected) {\n const opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\n\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\n\nfunction addSaveMenu(gui) {\n const div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n const gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n const button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n const button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n const button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n const select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n for (let index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n const explain = document.getElementById('dg-local-explain');\n const localStorageCheckBox = document.getElementById('dg-local-storage');\n const saveLocally = document.getElementById('dg-save-locally');\n\n saveLocally.style.display = 'block';\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n showHideExplain(gui, explain);\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n\n const newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n const presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n // div.appendChild(button2);\n}\n\nfunction addResizeHandle(gui) {\n let pmouseX;\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n // border: '1px solid blue'\n\n });\n\n function drag(e) {\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n }\n\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n\n function dragStart(e) {\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n }\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\n\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\n\nfunction getCurrentPreset(gui, useInitialValues) {\n const toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n const savedValues = {};\n\n // The controllers I've made for thcommon.isObject by property\n const controllerMap =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controllerMap, function(controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = savedValues;\n });\n\n return toReturn;\n}\n\nfunction setPresetSelectIndex(gui) {\n for (let index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\n\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame.call(window, function() {\n updateDisplays(controllerArray);\n });\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n}\n\nexport default GUI;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Color from './color/Color';\nimport math from './color/math';\nimport interpret from './color/interpret';\n\nimport Controller from './controllers/Controller';\nimport BooleanController from './controllers/BooleanController';\nimport OptionController from './controllers/OptionController';\nimport StringController from './controllers/StringController';\nimport NumberController from './controllers/NumberController';\nimport NumberControllerBox from './controllers/NumberControllerBox';\nimport NumberControllerSlider from './controllers/NumberControllerSlider';\nimport FunctionController from './controllers/FunctionController';\nimport ColorController from './controllers/ColorController';\n\nimport domImport from './dom/dom';\nimport GUIImport from './gui/GUI';\n\nexport const color = {\n Color: Color,\n math: math,\n interpret: interpret\n};\n\nexport const controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\n\nexport const dom = { dom: domImport };\n\nexport const gui = { GUI: GUIImport };\n\nexport const GUI = GUIImport;\n\nexport default {\n color,\n controllers,\n dom,\n gui,\n GUI\n};\n"],"names":["color","forceCSSHex","colorFormat","__state","conversionName","toString","r","Math","round","g","b","a","h","s","toFixed","v","str","hex","length","ARR_EACH","Array","prototype","forEach","ARR_SLICE","slice","Common","target","each","call","arguments","obj","keys","isObject","Object","key","isUndefined","bind","toCall","args","i","apply","itr","scope","l","BREAK","fnc","func","threshold","callImmediately","timeout","delayed","callNow","setTimeout","toArray","undefined","isNaN","isArray","constructor","INTERPRETATIONS","common","isString","original","test","match","parseInt","parseFloat","isNumber","result","toReturn","interpret","family","litmus","conversions","conversion","read","tmpComponent","ColorMath","hi","floor","f","p","q","t","c","min","max","delta","NaN","hex_with_component","componentIndex","value","Color","Error","colorToString","write","defineRGBComponent","component","componentHexIndex","defineProperty","space","recalculateRGB","defineHSVComponent","recalculateHSV","math","component_from_hex","extend","hsv_to_rgb","rgb_to_hsv","COMPONENTS","rgb_to_hex","Controller","object","property","initialValue","domElement","document","createElement","__onChange","__onFinishChange","newValue","updateDisplay","getValue","EVENT_MAP","EVENT_MAP_INV","k","e","CSS_VALUE_PIXELS","cssValueToPixels","val","isNull","dom","elem","selectable","style","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","hor","vert","vertical","horizontal","position","left","right","top","bottom","eventType","pars","aux","params","className","evt","createEvent","clientX","x","clientY","y","initMouseEvent","bubbles","cancelable","window","clickCount","init","initKeyboardEvent","initKeyEvent","defaults","ctrlKey","altKey","shiftKey","metaKey","keyCode","charCode","initEvent","dispatchEvent","event","newBool","bool","addEventListener","attachEvent","removeEventListener","detachEvent","classes","split","indexOf","push","join","replace","removeAttribute","index","splice","RegExp","getComputedStyle","width","height","el","offset","offsetParent","offsetLeft","offsetTop","activeElement","type","href","BooleanController","_this","__prev","__checkbox","setAttribute","onChange","setValue","appendChild","checked","OptionController","opts","options","__select","map","element","opt","innerHTML","desiredValue","selectedIndex","isActive","StringController","__input","onBlur","blur","numDecimals","_x","NumberController","_params","__min","__max","__step","step","__impliedStep","pow","log","abs","LN10","__precision","_v","minValue","maxValue","stepValue","roundToDecimal","decimals","tenTo","NumberControllerBox","__truncationSuspended","prevY","attempted","onFinish","onMouseDrag","diff","onMouseUp","unbind","onMouseDown","i1","i2","o1","o2","NumberControllerSlider","__background","__foreground","onTouchStart","addClass","preventDefault","bgRect","getBoundingClientRect","touches","onTouchMove","onTouchEnd","pct","FunctionController","text","__button","fire","ColorController","__color","__temp","makeSelectable","__selector","__saturation_field","__field_knob","__field_knob_border","__hue_knob","__hue_field","__input_textShadow","removeClass","valueField","fieldDown","fieldDownH","setSV","fieldUpSV","setH","fieldUpH","toOriginal","fieldRect","mismatch","flip","_flip","toHexString","marginTop","vendors","linearGradient","background","vendor","cssText","hueGradient","css","url","indoc","doc","link","rel","getElementsByTagName","cssContent","injected","head","saveDialogContents","ControllerFactory","isFunction","isBoolean","requestAnimationFrame","callback","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","CenteredDiv","backgroundElement","makeFullscreen","body","hide","display","opacity","webkitTransform","layout","defer","innerWidth","getWidth","innerHeight","getHeight","inject","styleSheet","CSS_NAMESPACE","HIDE_KEY_CODE","CLOSE_BUTTON_HEIGHT","DEFAULT_DEFAULT_PRESET_NAME","SUPPORTS_LOCAL_STORAGE","localStorage","SAVE_DIALOGUE","autoPlaceVirgin","autoPlaceContainer","hideableGuis","GUI","__ul","__folders","__controllers","__rememberedObjects","__rememberedObjectIndecesToControllers","__listening","DEFAULT_WIDTH","autoPlace","load","preset","parent","hideable","resizable","scrollable","useLocalStorage","getItem","getLocalStorageHash","saveToLocalStorage","titleRow","defineProperties","closeOnTop","getRoot","revert","name","closed","CLASS_CLOSED","onResize","__closeButton","TEXT_OPEN","TEXT_CLOSED","setItem","CLASS_MAIN","savedGui","JSON","parse","CLASS_CLOSE_BUTTON","CLASS_CLOSE_TOP","insertBefore","childNodes","CLASS_CLOSE_BOTTOM","titleRowName","createTextNode","addRow","onClickTitle","CLASS_AUTO_PLACE_CONTAINER","CLASS_AUTO_PLACE","__resizeHandler","onResizeDebounced","stringify","getSaveObject","saveToLocalStorageIfPossible","resetWidth","root","toggleHide","gui","CLASS_CONTROLLER_ROW","CLASS_TOO_TALL","CLASS_DRAG","_keydownHandler","which","add","controller","removeChild","__li","subfolder","removeFolder","newGuiParams","folders","li","folder","parentElement","getOffset","node","__save_row","__resize_handle","offsetHeight","debounce","saveDialogueContents","remembered","getCurrentPreset","presetName","newDom","liBefore","removeListeners","markPresetModified","modified","__preset_select","augmentController","__gui","nextSibling","nextElementSibling","remove","firstElementChild","listen","box","method","pc","pb","returned","oldName","wasListening","newController","compose","fakeEvent","stopPropagation","borderLeftColor","isModified","recallSavedValue","matchedIndex","controllerMap","presetMap","factoryArgs","concat","before","container","location","addPresetOption","setSelected","showHideExplain","explain","addSaveMenu","div","firstChild","gears","button","button2","button3","select","getElementById","localStorageCheckBox","saveLocally","newConstructorTextArea","show","focus","save","prompt","saveAs","addResizeHandle","pmouseX","drag","dragStop","dragStart","setWidth","w","useInitialValues","savedValues","setPresetSelectIndex","updateDisplays","controllerArray","controllers","domImport","GUIImport"],"mappings":"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"} \ No newline at end of file diff --git a/public/index.html b/public/index.html index d6c0ae2ad..a5cc49bed 100644 --- a/public/index.html +++ b/public/index.html @@ -14,7 +14,7 @@ - + From 1af23113ea410e7fa7d7f5357031ec6f16250076 Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 13:32:52 -0400 Subject: [PATCH 20/54] retrying adding files --- build/dat.gui.css | 1 + build/dat.gui.js | 2537 +++++++++++++++++++++++++++++++++++ build/dat.gui.js.map | 1 + build/dat.gui.min.js | 13 + build/dat.gui.module.js | 2523 ++++++++++++++++++++++++++++++++++ build/dat.gui.module.js.map | 1 + public/index.html | 2 +- public/js/myGui.js | 2 +- 8 files changed, 5078 insertions(+), 2 deletions(-) create mode 100644 build/dat.gui.css create mode 100644 build/dat.gui.js create mode 100644 build/dat.gui.js.map create mode 100644 build/dat.gui.min.js create mode 100644 build/dat.gui.module.js create mode 100644 build/dat.gui.module.js.map diff --git a/build/dat.gui.css b/build/dat.gui.css new file mode 100644 index 000000000..c039f4538 --- /dev/null +++ b/build/dat.gui.css @@ -0,0 +1 @@ +.dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda} diff --git a/build/dat.gui.js b/build/dat.gui.js new file mode 100644 index 000000000..85fadecc2 --- /dev/null +++ b/build/dat.gui.js @@ -0,0 +1,2537 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.dat = {}))); +}(this, (function (exports) { 'use strict'; + +function ___$insertStyle(css) { + if (!css) { + return; + } + if (typeof window === 'undefined') { + return; + } + + var style = document.createElement('style'); + + style.setAttribute('type', 'text/css'); + style.innerHTML = css; + document.head.appendChild(style); + + return css; +} + +function colorToString (color, forceCSSHex) { + var colorFormat = color.__state.conversionName.toString(); + var r = Math.round(color.r); + var g = Math.round(color.g); + var b = Math.round(color.b); + var a = color.a; + var h = Math.round(color.h); + var s = color.s.toFixed(1); + var v = color.v.toFixed(1); + if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') { + var str = color.hex.toString(16); + while (str.length < 6) { + str = '0' + str; + } + return '#' + str; + } else if (colorFormat === 'CSS_RGB') { + return 'rgb(' + r + ',' + g + ',' + b + ')'; + } else if (colorFormat === 'CSS_RGBA') { + return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; + } else if (colorFormat === 'HEX') { + return '0x' + color.hex.toString(16); + } else if (colorFormat === 'RGB_ARRAY') { + return '[' + r + ',' + g + ',' + b + ']'; + } else if (colorFormat === 'RGBA_ARRAY') { + return '[' + r + ',' + g + ',' + b + ',' + a + ']'; + } else if (colorFormat === 'RGB_OBJ') { + return '{r:' + r + ',g:' + g + ',b:' + b + '}'; + } else if (colorFormat === 'RGBA_OBJ') { + return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}'; + } else if (colorFormat === 'HSV_OBJ') { + return '{h:' + h + ',s:' + s + ',v:' + v + '}'; + } else if (colorFormat === 'HSVA_OBJ') { + return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}'; + } + return 'unknown format'; +} + +var ARR_EACH = Array.prototype.forEach; +var ARR_SLICE = Array.prototype.slice; +var Common = { + BREAK: {}, + extend: function extend(target) { + this.each(ARR_SLICE.call(arguments, 1), function (obj) { + var keys = this.isObject(obj) ? Object.keys(obj) : []; + keys.forEach(function (key) { + if (!this.isUndefined(obj[key])) { + target[key] = obj[key]; + } + }.bind(this)); + }, this); + return target; + }, + defaults: function defaults(target) { + this.each(ARR_SLICE.call(arguments, 1), function (obj) { + var keys = this.isObject(obj) ? Object.keys(obj) : []; + keys.forEach(function (key) { + if (this.isUndefined(target[key])) { + target[key] = obj[key]; + } + }.bind(this)); + }, this); + return target; + }, + compose: function compose() { + var toCall = ARR_SLICE.call(arguments); + return function () { + var args = ARR_SLICE.call(arguments); + for (var i = toCall.length - 1; i >= 0; i--) { + args = [toCall[i].apply(this, args)]; + } + return args[0]; + }; + }, + each: function each(obj, itr, scope) { + if (!obj) { + return; + } + if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) { + obj.forEach(itr, scope); + } else if (obj.length === obj.length + 0) { + var key = void 0; + var l = void 0; + for (key = 0, l = obj.length; key < l; key++) { + if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) { + return; + } + } + } else { + for (var _key in obj) { + if (itr.call(scope, obj[_key], _key) === this.BREAK) { + return; + } + } + } + }, + defer: function defer(fnc) { + setTimeout(fnc, 0); + }, + debounce: function debounce(func, threshold, callImmediately) { + var timeout = void 0; + return function () { + var obj = this; + var args = arguments; + function delayed() { + timeout = null; + if (!callImmediately) func.apply(obj, args); + } + var callNow = callImmediately || !timeout; + clearTimeout(timeout); + timeout = setTimeout(delayed, threshold); + if (callNow) { + func.apply(obj, args); + } + }; + }, + toArray: function toArray(obj) { + if (obj.toArray) return obj.toArray(); + return ARR_SLICE.call(obj); + }, + isUndefined: function isUndefined(obj) { + return obj === undefined; + }, + isNull: function isNull(obj) { + return obj === null; + }, + isNaN: function (_isNaN) { + function isNaN(_x) { + return _isNaN.apply(this, arguments); + } + isNaN.toString = function () { + return _isNaN.toString(); + }; + return isNaN; + }(function (obj) { + return isNaN(obj); + }), + isArray: Array.isArray || function (obj) { + return obj.constructor === Array; + }, + isObject: function isObject(obj) { + return obj === Object(obj); + }, + isNumber: function isNumber(obj) { + return obj === obj + 0; + }, + isString: function isString(obj) { + return obj === obj + ''; + }, + isBoolean: function isBoolean(obj) { + return obj === false || obj === true; + }, + isFunction: function isFunction(obj) { + return Object.prototype.toString.call(obj) === '[object Function]'; + } +}; + +var INTERPRETATIONS = [ +{ + litmus: Common.isString, + conversions: { + THREE_CHAR_HEX: { + read: function read(original) { + var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); + if (test === null) { + return false; + } + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0) + }; + }, + write: colorToString + }, + SIX_CHAR_HEX: { + read: function read(original) { + var test = original.match(/^#([A-F0-9]{6})$/i); + if (test === null) { + return false; + } + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString(), 0) + }; + }, + write: colorToString + }, + CSS_RGB: { + read: function read(original) { + var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) { + return false; + } + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]) + }; + }, + write: colorToString + }, + CSS_RGBA: { + read: function read(original) { + var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) { + return false; + } + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]), + a: parseFloat(test[4]) + }; + }, + write: colorToString + } + } +}, +{ + litmus: Common.isNumber, + conversions: { + HEX: { + read: function read(original) { + return { + space: 'HEX', + hex: original, + conversionName: 'HEX' + }; + }, + write: function write(color) { + return color.hex; + } + } + } +}, +{ + litmus: Common.isArray, + conversions: { + RGB_ARRAY: { + read: function read(original) { + if (original.length !== 3) { + return false; + } + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2] + }; + }, + write: function write(color) { + return [color.r, color.g, color.b]; + } + }, + RGBA_ARRAY: { + read: function read(original) { + if (original.length !== 4) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2], + a: original[3] + }; + }, + write: function write(color) { + return [color.r, color.g, color.b, color.a]; + } + } + } +}, +{ + litmus: Common.isObject, + conversions: { + RGBA_OBJ: { + read: function read(original) { + if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b, + a: original.a + }; + } + return false; + }, + write: function write(color) { + return { + r: color.r, + g: color.g, + b: color.b, + a: color.a + }; + } + }, + RGB_OBJ: { + read: function read(original) { + if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b + }; + } + return false; + }, + write: function write(color) { + return { + r: color.r, + g: color.g, + b: color.b + }; + } + }, + HSVA_OBJ: { + read: function read(original) { + if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v, + a: original.a + }; + } + return false; + }, + write: function write(color) { + return { + h: color.h, + s: color.s, + v: color.v, + a: color.a + }; + } + }, + HSV_OBJ: { + read: function read(original) { + if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v + }; + } + return false; + }, + write: function write(color) { + return { + h: color.h, + s: color.s, + v: color.v + }; + } + } + } +}]; +var result = void 0; +var toReturn = void 0; +var interpret = function interpret() { + toReturn = false; + var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0]; + Common.each(INTERPRETATIONS, function (family) { + if (family.litmus(original)) { + Common.each(family.conversions, function (conversion, conversionName) { + result = conversion.read(original); + if (toReturn === false && result !== false) { + toReturn = result; + result.conversionName = conversionName; + result.conversion = conversion; + return Common.BREAK; + } + }); + return Common.BREAK; + } + }); + return toReturn; +}; + +var tmpComponent = void 0; +var ColorMath = { + hsv_to_rgb: function hsv_to_rgb(h, s, v) { + var hi = Math.floor(h / 60) % 6; + var f = h / 60 - Math.floor(h / 60); + var p = v * (1.0 - s); + var q = v * (1.0 - f * s); + var t = v * (1.0 - (1.0 - f) * s); + var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi]; + return { + r: c[0] * 255, + g: c[1] * 255, + b: c[2] * 255 + }; + }, + rgb_to_hsv: function rgb_to_hsv(r, g, b) { + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h = void 0; + var s = void 0; + if (max !== 0) { + s = delta / max; + } else { + return { + h: NaN, + s: 0, + v: 0 + }; + } + if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else { + h = 4 + (r - g) / delta; + } + h /= 6; + if (h < 0) { + h += 1; + } + return { + h: h * 360, + s: s, + v: max / 255 + }; + }, + rgb_to_hex: function rgb_to_hex(r, g, b) { + var hex = this.hex_with_component(0, 2, r); + hex = this.hex_with_component(hex, 1, g); + hex = this.hex_with_component(hex, 0, b); + return hex; + }, + component_from_hex: function component_from_hex(hex, componentIndex) { + return hex >> componentIndex * 8 & 0xFF; + }, + hex_with_component: function hex_with_component(hex, componentIndex, value) { + return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent); + } +}; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; +}; + + + + + + + + + + + +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + + + + + + + +var get = function get(object, property, receiver) { + if (object === null) object = Function.prototype; + var desc = Object.getOwnPropertyDescriptor(object, property); + + if (desc === undefined) { + var parent = Object.getPrototypeOf(object); + + if (parent === null) { + return undefined; + } else { + return get(parent, property, receiver); + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get; + + if (getter === undefined) { + return undefined; + } + + return getter.call(receiver); + } +}; + +var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +}; + + + + + + + + + + + +var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; +}; + +var Color = function () { + function Color() { + classCallCheck(this, Color); + this.__state = interpret.apply(this, arguments); + if (this.__state === false) { + throw new Error('Failed to interpret color arguments'); + } + this.__state.a = this.__state.a || 1; + } + createClass(Color, [{ + key: 'toString', + value: function toString() { + return colorToString(this); + } + }, { + key: 'toHexString', + value: function toHexString() { + return colorToString(this, true); + } + }, { + key: 'toOriginal', + value: function toOriginal() { + return this.__state.conversion.write(this); + } + }]); + return Color; +}(); +function defineRGBComponent(target, component, componentHexIndex) { + Object.defineProperty(target, component, { + get: function get$$1() { + if (this.__state.space === 'RGB') { + return this.__state[component]; + } + Color.recalculateRGB(this, component, componentHexIndex); + return this.__state[component]; + }, + set: function set$$1(v) { + if (this.__state.space !== 'RGB') { + Color.recalculateRGB(this, component, componentHexIndex); + this.__state.space = 'RGB'; + } + this.__state[component] = v; + } + }); +} +function defineHSVComponent(target, component) { + Object.defineProperty(target, component, { + get: function get$$1() { + if (this.__state.space === 'HSV') { + return this.__state[component]; + } + Color.recalculateHSV(this); + return this.__state[component]; + }, + set: function set$$1(v) { + if (this.__state.space !== 'HSV') { + Color.recalculateHSV(this); + this.__state.space = 'HSV'; + } + this.__state[component] = v; + } + }); +} +Color.recalculateRGB = function (color, component, componentHexIndex) { + if (color.__state.space === 'HEX') { + color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex); + } else if (color.__state.space === 'HSV') { + Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); + } else { + throw new Error('Corrupted color state'); + } +}; +Color.recalculateHSV = function (color) { + var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b); + Common.extend(color.__state, { + s: result.s, + v: result.v + }); + if (!Common.isNaN(result.h)) { + color.__state.h = result.h; + } else if (Common.isUndefined(color.__state.h)) { + color.__state.h = 0; + } +}; +Color.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a']; +defineRGBComponent(Color.prototype, 'r', 2); +defineRGBComponent(Color.prototype, 'g', 1); +defineRGBComponent(Color.prototype, 'b', 0); +defineHSVComponent(Color.prototype, 'h'); +defineHSVComponent(Color.prototype, 's'); +defineHSVComponent(Color.prototype, 'v'); +Object.defineProperty(Color.prototype, 'a', { + get: function get$$1() { + return this.__state.a; + }, + set: function set$$1(v) { + this.__state.a = v; + } +}); +Object.defineProperty(Color.prototype, 'hex', { + get: function get$$1() { + if (!this.__state.space !== 'HEX') { + this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b); + } + return this.__state.hex; + }, + set: function set$$1(v) { + this.__state.space = 'HEX'; + this.__state.hex = v; + } +}); + +var Controller = function () { + function Controller(object, property) { + classCallCheck(this, Controller); + this.initialValue = object[property]; + this.domElement = document.createElement('div'); + this.object = object; + this.property = property; + this.__onChange = undefined; + this.__onFinishChange = undefined; + } + createClass(Controller, [{ + key: 'onChange', + value: function onChange(fnc) { + this.__onChange = fnc; + return this; + } + }, { + key: 'onFinishChange', + value: function onFinishChange(fnc) { + this.__onFinishChange = fnc; + return this; + } + }, { + key: 'setValue', + value: function setValue(newValue) { + this.object[this.property] = newValue; + if (this.__onChange) { + this.__onChange.call(this, newValue); + } + this.updateDisplay(); + return this; + } + }, { + key: 'getValue', + value: function getValue() { + return this.object[this.property]; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + return this; + } + }, { + key: 'isModified', + value: function isModified() { + return this.initialValue !== this.getValue(); + } + }]); + return Controller; +}(); + +var EVENT_MAP = { + HTMLEvents: ['change'], + MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'], + KeyboardEvents: ['keydown'] +}; +var EVENT_MAP_INV = {}; +Common.each(EVENT_MAP, function (v, k) { + Common.each(v, function (e) { + EVENT_MAP_INV[e] = k; + }); +}); +var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; +function cssValueToPixels(val) { + if (val === '0' || Common.isUndefined(val)) { + return 0; + } + var match = val.match(CSS_VALUE_PIXELS); + if (!Common.isNull(match)) { + return parseFloat(match[1]); + } + return 0; +} +var dom = { + makeSelectable: function makeSelectable(elem, selectable) { + if (elem === undefined || elem.style === undefined) return; + elem.onselectstart = selectable ? function () { + return false; + } : function () {}; + elem.style.MozUserSelect = selectable ? 'auto' : 'none'; + elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; + elem.unselectable = selectable ? 'on' : 'off'; + }, + makeFullscreen: function makeFullscreen(elem, hor, vert) { + var vertical = vert; + var horizontal = hor; + if (Common.isUndefined(horizontal)) { + horizontal = true; + } + if (Common.isUndefined(vertical)) { + vertical = true; + } + elem.style.position = 'absolute'; + if (horizontal) { + elem.style.left = 0; + elem.style.right = 0; + } + if (vertical) { + elem.style.top = 0; + elem.style.bottom = 0; + } + }, + fakeEvent: function fakeEvent(elem, eventType, pars, aux) { + var params = pars || {}; + var className = EVENT_MAP_INV[eventType]; + if (!className) { + throw new Error('Event type ' + eventType + ' not supported.'); + } + var evt = document.createEvent(className); + switch (className) { + case 'MouseEvents': + { + var clientX = params.x || params.clientX || 0; + var clientY = params.y || params.clientY || 0; + evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0, + 0, + clientX, + clientY, + false, false, false, false, 0, null); + break; + } + case 'KeyboardEvents': + { + var init = evt.initKeyboardEvent || evt.initKeyEvent; + Common.defaults(params, { + cancelable: true, + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false, + keyCode: undefined, + charCode: undefined + }); + init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode); + break; + } + default: + { + evt.initEvent(eventType, params.bubbles || false, params.cancelable || true); + break; + } + } + Common.defaults(evt, aux); + elem.dispatchEvent(evt); + }, + bind: function bind(elem, event, func, newBool) { + var bool = newBool || false; + if (elem.addEventListener) { + elem.addEventListener(event, func, bool); + } else if (elem.attachEvent) { + elem.attachEvent('on' + event, func); + } + return dom; + }, + unbind: function unbind(elem, event, func, newBool) { + var bool = newBool || false; + if (elem.removeEventListener) { + elem.removeEventListener(event, func, bool); + } else if (elem.detachEvent) { + elem.detachEvent('on' + event, func); + } + return dom; + }, + addClass: function addClass(elem, className) { + if (elem.className === undefined) { + elem.className = className; + } else if (elem.className !== className) { + var classes = elem.className.split(/ +/); + if (classes.indexOf(className) === -1) { + classes.push(className); + elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); + } + } + return dom; + }, + removeClass: function removeClass(elem, className) { + if (className) { + if (elem.className === className) { + elem.removeAttribute('class'); + } else { + var classes = elem.className.split(/ +/); + var index = classes.indexOf(className); + if (index !== -1) { + classes.splice(index, 1); + elem.className = classes.join(' '); + } + } + } else { + elem.className = undefined; + } + return dom; + }, + hasClass: function hasClass(elem, className) { + return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; + }, + getWidth: function getWidth(elem) { + var style = getComputedStyle(elem); + return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width); + }, + getHeight: function getHeight(elem) { + var style = getComputedStyle(elem); + return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height); + }, + getOffset: function getOffset(el) { + var elem = el; + var offset = { left: 0, top: 0 }; + if (elem.offsetParent) { + do { + offset.left += elem.offsetLeft; + offset.top += elem.offsetTop; + elem = elem.offsetParent; + } while (elem); + } + return offset; + }, + isActive: function isActive(elem) { + return elem === document.activeElement && (elem.type || elem.href); + } +}; + +var BooleanController = function (_Controller) { + inherits(BooleanController, _Controller); + function BooleanController(object, property) { + classCallCheck(this, BooleanController); + var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property)); + var _this = _this2; + _this2.__prev = _this2.getValue(); + _this2.__checkbox = document.createElement('input'); + _this2.__checkbox.setAttribute('type', 'checkbox'); + function onChange() { + _this.setValue(!_this.__prev); + } + dom.bind(_this2.__checkbox, 'change', onChange, false); + _this2.domElement.appendChild(_this2.__checkbox); + _this2.updateDisplay(); + return _this2; + } + createClass(BooleanController, [{ + key: 'setValue', + value: function setValue(v) { + var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + this.__prev = this.getValue(); + return toReturn; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + if (this.getValue() === true) { + this.__checkbox.setAttribute('checked', 'checked'); + this.__checkbox.checked = true; + this.__prev = true; + } else { + this.__checkbox.checked = false; + this.__prev = false; + } + return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this); + } + }]); + return BooleanController; +}(Controller); + +var OptionController = function (_Controller) { + inherits(OptionController, _Controller); + function OptionController(object, property, opts) { + classCallCheck(this, OptionController); + var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property)); + var options = opts; + var _this = _this2; + _this2.__select = document.createElement('select'); + if (Common.isArray(options)) { + var map = {}; + Common.each(options, function (element) { + map[element] = element; + }); + options = map; + } + Common.each(options, function (value, key) { + var opt = document.createElement('option'); + opt.innerHTML = key; + opt.setAttribute('value', value); + _this.__select.appendChild(opt); + }); + _this2.updateDisplay(); + dom.bind(_this2.__select, 'change', function () { + var desiredValue = this.options[this.selectedIndex].value; + _this.setValue(desiredValue); + }); + _this2.domElement.appendChild(_this2.__select); + return _this2; + } + createClass(OptionController, [{ + key: 'setValue', + value: function setValue(v) { + var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + return toReturn; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + if (dom.isActive(this.__select)) return this; + this.__select.value = this.getValue(); + return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this); + } + }]); + return OptionController; +}(Controller); + +var StringController = function (_Controller) { + inherits(StringController, _Controller); + function StringController(object, property) { + classCallCheck(this, StringController); + var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property)); + var _this = _this2; + function onChange() { + _this.setValue(_this.__input.value); + } + function onBlur() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + _this2.__input = document.createElement('input'); + _this2.__input.setAttribute('type', 'text'); + dom.bind(_this2.__input, 'keyup', onChange); + dom.bind(_this2.__input, 'change', onChange); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + this.blur(); + } + }); + _this2.updateDisplay(); + _this2.domElement.appendChild(_this2.__input); + return _this2; + } + createClass(StringController, [{ + key: 'updateDisplay', + value: function updateDisplay() { + if (!dom.isActive(this.__input)) { + this.__input.value = this.getValue(); + } + return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this); + } + }]); + return StringController; +}(Controller); + +function numDecimals(x) { + var _x = x.toString(); + if (_x.indexOf('.') > -1) { + return _x.length - _x.indexOf('.') - 1; + } + return 0; +} +var NumberController = function (_Controller) { + inherits(NumberController, _Controller); + function NumberController(object, property, params) { + classCallCheck(this, NumberController); + var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property)); + var _params = params || {}; + _this.__min = _params.min; + _this.__max = _params.max; + _this.__step = _params.step; + if (Common.isUndefined(_this.__step)) { + if (_this.initialValue === 0) { + _this.__impliedStep = 1; + } else { + _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10; + } + } else { + _this.__impliedStep = _this.__step; + } + _this.__precision = numDecimals(_this.__impliedStep); + return _this; + } + createClass(NumberController, [{ + key: 'setValue', + value: function setValue(v) { + var _v = v; + if (this.__min !== undefined && _v < this.__min) { + _v = this.__min; + } else if (this.__max !== undefined && _v > this.__max) { + _v = this.__max; + } + if (this.__step !== undefined && _v % this.__step !== 0) { + _v = Math.round(_v / this.__step) * this.__step; + } + return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v); + } + }, { + key: 'min', + value: function min(minValue) { + this.__min = minValue; + return this; + } + }, { + key: 'max', + value: function max(maxValue) { + this.__max = maxValue; + return this; + } + }, { + key: 'step', + value: function step(stepValue) { + this.__step = stepValue; + this.__impliedStep = stepValue; + this.__precision = numDecimals(stepValue); + return this; + } + }]); + return NumberController; +}(Controller); + +function roundToDecimal(value, decimals) { + var tenTo = Math.pow(10, decimals); + return Math.round(value * tenTo) / tenTo; +} +var NumberControllerBox = function (_NumberController) { + inherits(NumberControllerBox, _NumberController); + function NumberControllerBox(object, property, params) { + classCallCheck(this, NumberControllerBox); + var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params)); + _this2.__truncationSuspended = false; + var _this = _this2; + var prevY = void 0; + function onChange() { + var attempted = parseFloat(_this.__input.value); + if (!Common.isNaN(attempted)) { + _this.setValue(attempted); + } + } + function onFinish() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + function onBlur() { + onFinish(); + } + function onMouseDrag(e) { + var diff = prevY - e.clientY; + _this.setValue(_this.getValue() + diff * _this.__impliedStep); + prevY = e.clientY; + } + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + onFinish(); + } + function onMouseDown(e) { + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + prevY = e.clientY; + } + _this2.__input = document.createElement('input'); + _this2.__input.setAttribute('type', 'text'); + dom.bind(_this2.__input, 'change', onChange); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__input, 'mousedown', onMouseDown); + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + _this.__truncationSuspended = true; + this.blur(); + _this.__truncationSuspended = false; + onFinish(); + } + }); + _this2.updateDisplay(); + _this2.domElement.appendChild(_this2.__input); + return _this2; + } + createClass(NumberControllerBox, [{ + key: 'updateDisplay', + value: function updateDisplay() { + this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); + return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this); + } + }]); + return NumberControllerBox; +}(NumberController); + +function map(v, i1, i2, o1, o2) { + return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); +} +var NumberControllerSlider = function (_NumberController) { + inherits(NumberControllerSlider, _NumberController); + function NumberControllerSlider(object, property, min, max, step) { + classCallCheck(this, NumberControllerSlider); + var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step })); + var _this = _this2; + _this2.__background = document.createElement('div'); + _this2.__foreground = document.createElement('div'); + dom.bind(_this2.__background, 'mousedown', onMouseDown); + dom.bind(_this2.__background, 'touchstart', onTouchStart); + dom.addClass(_this2.__background, 'slider'); + dom.addClass(_this2.__foreground, 'slider-fg'); + function onMouseDown(e) { + document.activeElement.blur(); + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + onMouseDrag(e); + } + function onMouseDrag(e) { + e.preventDefault(); + var bgRect = _this.__background.getBoundingClientRect(); + _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); + return false; + } + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + function onTouchStart(e) { + if (e.touches.length !== 1) { + return; + } + dom.bind(window, 'touchmove', onTouchMove); + dom.bind(window, 'touchend', onTouchEnd); + onTouchMove(e); + } + function onTouchMove(e) { + var clientX = e.touches[0].clientX; + var bgRect = _this.__background.getBoundingClientRect(); + _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); + } + function onTouchEnd() { + dom.unbind(window, 'touchmove', onTouchMove); + dom.unbind(window, 'touchend', onTouchEnd); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + _this2.updateDisplay(); + _this2.__background.appendChild(_this2.__foreground); + _this2.domElement.appendChild(_this2.__background); + return _this2; + } + createClass(NumberControllerSlider, [{ + key: 'updateDisplay', + value: function updateDisplay() { + var pct = (this.getValue() - this.__min) / (this.__max - this.__min); + this.__foreground.style.width = pct * 100 + '%'; + return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this); + } + }]); + return NumberControllerSlider; +}(NumberController); + +var FunctionController = function (_Controller) { + inherits(FunctionController, _Controller); + function FunctionController(object, property, text) { + classCallCheck(this, FunctionController); + var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property)); + var _this = _this2; + _this2.__button = document.createElement('div'); + _this2.__button.innerHTML = text === undefined ? 'Fire' : text; + dom.bind(_this2.__button, 'click', function (e) { + e.preventDefault(); + _this.fire(); + return false; + }); + dom.addClass(_this2.__button, 'button'); + _this2.domElement.appendChild(_this2.__button); + return _this2; + } + createClass(FunctionController, [{ + key: 'fire', + value: function fire() { + if (this.__onChange) { + this.__onChange.call(this); + } + this.getValue().call(this.object); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + } + }]); + return FunctionController; +}(Controller); + +var ColorController = function (_Controller) { + inherits(ColorController, _Controller); + function ColorController(object, property) { + classCallCheck(this, ColorController); + var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property)); + _this2.__color = new Color(_this2.getValue()); + _this2.__temp = new Color(0); + var _this = _this2; + _this2.domElement = document.createElement('div'); + dom.makeSelectable(_this2.domElement, false); + _this2.__selector = document.createElement('div'); + _this2.__selector.className = 'selector'; + _this2.__saturation_field = document.createElement('div'); + _this2.__saturation_field.className = 'saturation-field'; + _this2.__field_knob = document.createElement('div'); + _this2.__field_knob.className = 'field-knob'; + _this2.__field_knob_border = '2px solid '; + _this2.__hue_knob = document.createElement('div'); + _this2.__hue_knob.className = 'hue-knob'; + _this2.__hue_field = document.createElement('div'); + _this2.__hue_field.className = 'hue-field'; + _this2.__input = document.createElement('input'); + _this2.__input.type = 'text'; + _this2.__input_textShadow = '0 1px 1px '; + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + onBlur.call(this); + } + }); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__selector, 'mousedown', function () { + dom.addClass(this, 'drag').bind(window, 'mouseup', function () { + dom.removeClass(_this.__selector, 'drag'); + }); + }); + dom.bind(_this2.__selector, 'touchstart', function () { + dom.addClass(this, 'drag').bind(window, 'touchend', function () { + dom.removeClass(_this.__selector, 'drag'); + }); + }); + var valueField = document.createElement('div'); + Common.extend(_this2.__selector.style, { + width: '122px', + height: '102px', + padding: '3px', + backgroundColor: '#222', + boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' + }); + Common.extend(_this2.__field_knob.style, { + position: 'absolute', + width: '12px', + height: '12px', + border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'), + boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', + borderRadius: '12px', + zIndex: 1 + }); + Common.extend(_this2.__hue_knob.style, { + position: 'absolute', + width: '15px', + height: '2px', + borderRight: '4px solid #fff', + zIndex: 1 + }); + Common.extend(_this2.__saturation_field.style, { + width: '100px', + height: '100px', + border: '1px solid #555', + marginRight: '3px', + display: 'inline-block', + cursor: 'pointer' + }); + Common.extend(valueField.style, { + width: '100%', + height: '100%', + background: 'none' + }); + linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000'); + Common.extend(_this2.__hue_field.style, { + width: '15px', + height: '100px', + border: '1px solid #555', + cursor: 'ns-resize', + position: 'absolute', + top: '3px', + right: '3px' + }); + hueGradient(_this2.__hue_field); + Common.extend(_this2.__input.style, { + outline: 'none', + textAlign: 'center', + color: '#fff', + border: 0, + fontWeight: 'bold', + textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)' + }); + dom.bind(_this2.__saturation_field, 'mousedown', fieldDown); + dom.bind(_this2.__saturation_field, 'touchstart', fieldDown); + dom.bind(_this2.__field_knob, 'mousedown', fieldDown); + dom.bind(_this2.__field_knob, 'touchstart', fieldDown); + dom.bind(_this2.__hue_field, 'mousedown', fieldDownH); + dom.bind(_this2.__hue_field, 'touchstart', fieldDownH); + function fieldDown(e) { + setSV(e); + dom.bind(window, 'mousemove', setSV); + dom.bind(window, 'touchmove', setSV); + dom.bind(window, 'mouseup', fieldUpSV); + dom.bind(window, 'touchend', fieldUpSV); + } + function fieldDownH(e) { + setH(e); + dom.bind(window, 'mousemove', setH); + dom.bind(window, 'touchmove', setH); + dom.bind(window, 'mouseup', fieldUpH); + dom.bind(window, 'touchend', fieldUpH); + } + function fieldUpSV() { + dom.unbind(window, 'mousemove', setSV); + dom.unbind(window, 'touchmove', setSV); + dom.unbind(window, 'mouseup', fieldUpSV); + dom.unbind(window, 'touchend', fieldUpSV); + onFinish(); + } + function fieldUpH() { + dom.unbind(window, 'mousemove', setH); + dom.unbind(window, 'touchmove', setH); + dom.unbind(window, 'mouseup', fieldUpH); + dom.unbind(window, 'touchend', fieldUpH); + onFinish(); + } + function onBlur() { + var i = interpret(this.value); + if (i !== false) { + _this.__color.__state = i; + _this.setValue(_this.__color.toOriginal()); + } else { + this.value = _this.__color.toString(); + } + } + function onFinish() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.__color.toOriginal()); + } + } + _this2.__saturation_field.appendChild(valueField); + _this2.__selector.appendChild(_this2.__field_knob); + _this2.__selector.appendChild(_this2.__saturation_field); + _this2.__selector.appendChild(_this2.__hue_field); + _this2.__hue_field.appendChild(_this2.__hue_knob); + _this2.domElement.appendChild(_this2.__input); + _this2.domElement.appendChild(_this2.__selector); + _this2.updateDisplay(); + function setSV(e) { + if (e.type.indexOf('touch') === -1) { + e.preventDefault(); + } + var fieldRect = _this.__saturation_field.getBoundingClientRect(); + var _ref = e.touches && e.touches[0] || e, + clientX = _ref.clientX, + clientY = _ref.clientY; + var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left); + var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); + if (v > 1) { + v = 1; + } else if (v < 0) { + v = 0; + } + if (s > 1) { + s = 1; + } else if (s < 0) { + s = 0; + } + _this.__color.v = v; + _this.__color.s = s; + _this.setValue(_this.__color.toOriginal()); + return false; + } + function setH(e) { + if (e.type.indexOf('touch') === -1) { + e.preventDefault(); + } + var fieldRect = _this.__hue_field.getBoundingClientRect(); + var _ref2 = e.touches && e.touches[0] || e, + clientY = _ref2.clientY; + var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); + if (h > 1) { + h = 1; + } else if (h < 0) { + h = 0; + } + _this.__color.h = h * 360; + _this.setValue(_this.__color.toOriginal()); + return false; + } + return _this2; + } + createClass(ColorController, [{ + key: 'updateDisplay', + value: function updateDisplay() { + var i = interpret(this.getValue()); + if (i !== false) { + var mismatch = false; + Common.each(Color.COMPONENTS, function (component) { + if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) { + mismatch = true; + return {}; + } + }, this); + if (mismatch) { + Common.extend(this.__color.__state, i); + } + } + Common.extend(this.__temp.__state, this.__color.__state); + this.__temp.a = 1; + var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0; + var _flip = 255 - flip; + Common.extend(this.__field_knob.style, { + marginLeft: 100 * this.__color.s - 7 + 'px', + marginTop: 100 * (1 - this.__color.v) - 7 + 'px', + backgroundColor: this.__temp.toHexString(), + border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')' + }); + this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'; + this.__temp.s = 1; + this.__temp.v = 1; + linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString()); + this.__input.value = this.__color.toString(); + Common.extend(this.__input.style, { + backgroundColor: this.__color.toHexString(), + color: 'rgb(' + flip + ',' + flip + ',' + flip + ')', + textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)' + }); + } + }]); + return ColorController; +}(Controller); +var vendors = ['-moz-', '-o-', '-webkit-', '-ms-', '']; +function linearGradient(elem, x, a, b) { + elem.style.background = ''; + Common.each(vendors, function (vendor) { + elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); '; + }); +} +function hueGradient(elem) { + elem.style.background = ''; + elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'; + elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; +} + +var css = { + load: function load(url, indoc) { + var doc = indoc || document; + var link = doc.createElement('link'); + link.type = 'text/css'; + link.rel = 'stylesheet'; + link.href = url; + doc.getElementsByTagName('head')[0].appendChild(link); + }, + inject: function inject(cssContent, indoc) { + var doc = indoc || document; + var injected = document.createElement('style'); + injected.type = 'text/css'; + injected.innerHTML = cssContent; + var head = doc.getElementsByTagName('head')[0]; + try { + head.appendChild(injected); + } catch (e) { + } + } +}; + +var saveDialogContents = "
\n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n
"; + +var ControllerFactory = function ControllerFactory(object, property) { + var initialValue = object[property]; + if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) { + return new OptionController(object, property, arguments[2]); + } + if (Common.isNumber(initialValue)) { + if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) { + if (Common.isNumber(arguments[4])) { + return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]); + } + return new NumberControllerSlider(object, property, arguments[2], arguments[3]); + } + if (Common.isNumber(arguments[4])) { + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] }); + } + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); + } + if (Common.isString(initialValue)) { + return new StringController(object, property); + } + if (Common.isFunction(initialValue)) { + return new FunctionController(object, property, ''); + } + if (Common.isBoolean(initialValue)) { + return new BooleanController(object, property); + } + return null; +}; + +function requestAnimationFrame(callback) { + setTimeout(callback, 1000 / 60); +} +var requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame; + +var CenteredDiv = function () { + function CenteredDiv() { + classCallCheck(this, CenteredDiv); + this.backgroundElement = document.createElement('div'); + Common.extend(this.backgroundElement.style, { + backgroundColor: 'rgba(0,0,0,0.8)', + top: 0, + left: 0, + display: 'none', + zIndex: '1000', + opacity: 0, + WebkitTransition: 'opacity 0.2s linear', + transition: 'opacity 0.2s linear' + }); + dom.makeFullscreen(this.backgroundElement); + this.backgroundElement.style.position = 'fixed'; + this.domElement = document.createElement('div'); + Common.extend(this.domElement.style, { + position: 'fixed', + display: 'none', + zIndex: '1001', + opacity: 0, + WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear', + transition: 'transform 0.2s ease-out, opacity 0.2s linear' + }); + document.body.appendChild(this.backgroundElement); + document.body.appendChild(this.domElement); + var _this = this; + dom.bind(this.backgroundElement, 'click', function () { + _this.hide(); + }); + } + createClass(CenteredDiv, [{ + key: 'show', + value: function show() { + var _this = this; + this.backgroundElement.style.display = 'block'; + this.domElement.style.display = 'block'; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + this.layout(); + Common.defer(function () { + _this.backgroundElement.style.opacity = 1; + _this.domElement.style.opacity = 1; + _this.domElement.style.webkitTransform = 'scale(1)'; + }); + } + }, { + key: 'hide', + value: function hide() { + var _this = this; + var hide = function hide() { + _this.domElement.style.display = 'none'; + _this.backgroundElement.style.display = 'none'; + dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); + dom.unbind(_this.domElement, 'transitionend', hide); + dom.unbind(_this.domElement, 'oTransitionEnd', hide); + }; + dom.bind(this.domElement, 'webkitTransitionEnd', hide); + dom.bind(this.domElement, 'transitionend', hide); + dom.bind(this.domElement, 'oTransitionEnd', hide); + this.backgroundElement.style.opacity = 0; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + } + }, { + key: 'layout', + value: function layout() { + this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px'; + this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px'; + } + }]); + return CenteredDiv; +}(); + +var styleSheet = ___$insertStyle(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"); + +css.inject(styleSheet); +var CSS_NAMESPACE = 'dg'; +var HIDE_KEY_CODE = 72; +var CLOSE_BUTTON_HEIGHT = 20; +var DEFAULT_DEFAULT_PRESET_NAME = 'Default'; +var SUPPORTS_LOCAL_STORAGE = function () { + try { + return !!window.localStorage; + } catch (e) { + return false; + } +}(); +var SAVE_DIALOGUE = void 0; +var autoPlaceVirgin = true; +var autoPlaceContainer = void 0; +var hide = false; +var hideableGuis = []; +var GUI = function GUI(pars) { + var _this = this; + var params = pars || {}; + this.domElement = document.createElement('div'); + this.__ul = document.createElement('ul'); + this.domElement.appendChild(this.__ul); + dom.addClass(this.domElement, CSS_NAMESPACE); + this.__folders = {}; + this.__controllers = []; + this.__rememberedObjects = []; + this.__rememberedObjectIndecesToControllers = []; + this.__listening = []; + params = Common.defaults(params, { + closeOnTop: false, + autoPlace: true, + width: GUI.DEFAULT_WIDTH + }); + params = Common.defaults(params, { + resizable: params.autoPlace, + hideable: params.autoPlace + }); + if (!Common.isUndefined(params.load)) { + if (params.preset) { + params.load.preset = params.preset; + } + } else { + params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; + } + if (Common.isUndefined(params.parent) && params.hideable) { + hideableGuis.push(this); + } + params.resizable = Common.isUndefined(params.parent) && params.resizable; + if (params.autoPlace && Common.isUndefined(params.scrollable)) { + params.scrollable = true; + } + var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; + var saveToLocalStorage = void 0; + var titleRow = void 0; + Object.defineProperties(this, + { + parent: { + get: function get$$1() { + return params.parent; + } + }, + scrollable: { + get: function get$$1() { + return params.scrollable; + } + }, + autoPlace: { + get: function get$$1() { + return params.autoPlace; + } + }, + closeOnTop: { + get: function get$$1() { + return params.closeOnTop; + } + }, + preset: { + get: function get$$1() { + if (_this.parent) { + return _this.getRoot().preset; + } + return params.load.preset; + }, + set: function set$$1(v) { + if (_this.parent) { + _this.getRoot().preset = v; + } else { + params.load.preset = v; + } + setPresetSelectIndex(this); + _this.revert(); + } + }, + width: { + get: function get$$1() { + return params.width; + }, + set: function set$$1(v) { + params.width = v; + setWidth(_this, v); + } + }, + name: { + get: function get$$1() { + return params.name; + }, + set: function set$$1(v) { + params.name = v; + if (titleRow) { + titleRow.innerHTML = params.name; + } + } + }, + closed: { + get: function get$$1() { + return params.closed; + }, + set: function set$$1(v) { + params.closed = v; + if (params.closed) { + dom.addClass(_this.__ul, GUI.CLASS_CLOSED); + } else { + dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); + } + this.onResize(); + if (_this.__closeButton) { + _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; + } + } + }, + load: { + get: function get$$1() { + return params.load; + } + }, + useLocalStorage: { + get: function get$$1() { + return useLocalStorage; + }, + set: function set$$1(bool) { + if (SUPPORTS_LOCAL_STORAGE) { + useLocalStorage = bool; + if (bool) { + dom.bind(window, 'unload', saveToLocalStorage); + } else { + dom.unbind(window, 'unload', saveToLocalStorage); + } + localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); + } + } + } + }); + if (Common.isUndefined(params.parent)) { + this.closed = params.closed || false; + dom.addClass(this.domElement, GUI.CLASS_MAIN); + dom.makeSelectable(this.domElement, false); + if (SUPPORTS_LOCAL_STORAGE) { + if (useLocalStorage) { + _this.useLocalStorage = true; + var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui')); + if (savedGui) { + params.load = JSON.parse(savedGui); + } + } + } + this.__closeButton = document.createElement('div'); + this.__closeButton.innerHTML = GUI.TEXT_CLOSED; + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); + if (params.closeOnTop) { + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP); + this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]); + } else { + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM); + this.domElement.appendChild(this.__closeButton); + } + dom.bind(this.__closeButton, 'click', function () { + _this.closed = !_this.closed; + }); + } else { + if (params.closed === undefined) { + params.closed = true; + } + var titleRowName = document.createTextNode(params.name); + dom.addClass(titleRowName, 'controller-name'); + titleRow = addRow(_this, titleRowName); + var onClickTitle = function onClickTitle(e) { + e.preventDefault(); + _this.closed = !_this.closed; + return false; + }; + dom.addClass(this.__ul, GUI.CLASS_CLOSED); + dom.addClass(titleRow, 'title'); + dom.bind(titleRow, 'click', onClickTitle); + if (!params.closed) { + this.closed = false; + } + } + if (params.autoPlace) { + if (Common.isUndefined(params.parent)) { + if (autoPlaceVirgin) { + autoPlaceContainer = document.createElement('div'); + dom.addClass(autoPlaceContainer, CSS_NAMESPACE); + dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER); + document.body.appendChild(autoPlaceContainer); + autoPlaceVirgin = false; + } + autoPlaceContainer.appendChild(this.domElement); + dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); + } + if (!this.parent) { + setWidth(_this, params.width); + } + } + this.__resizeHandler = function () { + _this.onResizeDebounced(); + }; + dom.bind(window, 'resize', this.__resizeHandler); + dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler); + dom.bind(this.__ul, 'transitionend', this.__resizeHandler); + dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler); + this.onResize(); + if (params.resizable) { + addResizeHandle(this); + } + saveToLocalStorage = function saveToLocalStorage() { + if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') { + localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); + } + }; + this.saveToLocalStorageIfPossible = saveToLocalStorage; + function resetWidth() { + var root = _this.getRoot(); + root.width += 1; + Common.defer(function () { + root.width -= 1; + }); + } + if (!params.parent) { + resetWidth(); + } +}; +GUI.toggleHide = function () { + hide = !hide; + Common.each(hideableGuis, function (gui) { + gui.domElement.style.display = hide ? 'none' : ''; + }); +}; +GUI.CLASS_AUTO_PLACE = 'a'; +GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; +GUI.CLASS_MAIN = 'main'; +GUI.CLASS_CONTROLLER_ROW = 'cr'; +GUI.CLASS_TOO_TALL = 'taller-than-window'; +GUI.CLASS_CLOSED = 'closed'; +GUI.CLASS_CLOSE_BUTTON = 'close-button'; +GUI.CLASS_CLOSE_TOP = 'close-top'; +GUI.CLASS_CLOSE_BOTTOM = 'close-bottom'; +GUI.CLASS_DRAG = 'drag'; +GUI.DEFAULT_WIDTH = 245; +GUI.TEXT_CLOSED = 'Close Controls'; +GUI.TEXT_OPEN = 'Open Controls'; +GUI._keydownHandler = function (e) { + if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) { + GUI.toggleHide(); + } +}; +dom.bind(window, 'keydown', GUI._keydownHandler, false); +Common.extend(GUI.prototype, +{ + add: function add(object, property) { + return _add(this, object, property, { + factoryArgs: Array.prototype.slice.call(arguments, 2) + }); + }, + addColor: function addColor(object, property) { + return _add(this, object, property, { + color: true + }); + }, + remove: function remove(controller) { + this.__ul.removeChild(controller.__li); + this.__controllers.splice(this.__controllers.indexOf(controller), 1); + var _this = this; + Common.defer(function () { + _this.onResize(); + }); + }, + destroy: function destroy() { + if (this.parent) { + throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.'); + } + if (this.autoPlace) { + autoPlaceContainer.removeChild(this.domElement); + } + var _this = this; + Common.each(this.__folders, function (subfolder) { + _this.removeFolder(subfolder); + }); + dom.unbind(window, 'keydown', GUI._keydownHandler, false); + removeListeners(this); + }, + addFolder: function addFolder(name) { + if (this.__folders[name] !== undefined) { + throw new Error('You already have a folder in this GUI by the' + ' name "' + name + '"'); + } + var newGuiParams = { name: name, parent: this }; + newGuiParams.autoPlace = this.autoPlace; + if (this.load && + this.load.folders && + this.load.folders[name]) { + newGuiParams.closed = this.load.folders[name].closed; + newGuiParams.load = this.load.folders[name]; + } + var gui = new GUI(newGuiParams); + this.__folders[name] = gui; + var li = addRow(this, gui.domElement); + dom.addClass(li, 'folder'); + return gui; + }, + removeFolder: function removeFolder(folder) { + this.__ul.removeChild(folder.domElement.parentElement); + delete this.__folders[folder.name]; + if (this.load && + this.load.folders && + this.load.folders[folder.name]) { + delete this.load.folders[folder.name]; + } + removeListeners(folder); + var _this = this; + Common.each(folder.__folders, function (subfolder) { + folder.removeFolder(subfolder); + }); + Common.defer(function () { + _this.onResize(); + }); + }, + open: function open() { + this.closed = false; + }, + close: function close() { + this.closed = true; + }, + hide: function hide() { + this.domElement.style.display = 'none'; + }, + show: function show() { + this.domElement.style.display = ''; + }, + onResize: function onResize() { + var root = this.getRoot(); + if (root.scrollable) { + var top = dom.getOffset(root.__ul).top; + var h = 0; + Common.each(root.__ul.childNodes, function (node) { + if (!(root.autoPlace && node === root.__save_row)) { + h += dom.getHeight(node); + } + }); + if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { + dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; + } else { + dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = 'auto'; + } + } + if (root.__resize_handle) { + Common.defer(function () { + root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; + }); + } + if (root.__closeButton) { + root.__closeButton.style.width = root.width + 'px'; + } + }, + onResizeDebounced: Common.debounce(function () { + this.onResize(); + }, 50), + remember: function remember() { + if (Common.isUndefined(SAVE_DIALOGUE)) { + SAVE_DIALOGUE = new CenteredDiv(); + SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents; + } + if (this.parent) { + throw new Error('You can only call remember on a top level GUI.'); + } + var _this = this; + Common.each(Array.prototype.slice.call(arguments), function (object) { + if (_this.__rememberedObjects.length === 0) { + addSaveMenu(_this); + } + if (_this.__rememberedObjects.indexOf(object) === -1) { + _this.__rememberedObjects.push(object); + } + }); + if (this.autoPlace) { + setWidth(this, this.width); + } + }, + getRoot: function getRoot() { + var gui = this; + while (gui.parent) { + gui = gui.parent; + } + return gui; + }, + getSaveObject: function getSaveObject() { + var toReturn = this.load; + toReturn.closed = this.closed; + if (this.__rememberedObjects.length > 0) { + toReturn.preset = this.preset; + if (!toReturn.remembered) { + toReturn.remembered = {}; + } + toReturn.remembered[this.preset] = getCurrentPreset(this); + } + toReturn.folders = {}; + Common.each(this.__folders, function (element, key) { + toReturn.folders[key] = element.getSaveObject(); + }); + return toReturn; + }, + save: function save() { + if (!this.load.remembered) { + this.load.remembered = {}; + } + this.load.remembered[this.preset] = getCurrentPreset(this); + markPresetModified(this, false); + this.saveToLocalStorageIfPossible(); + }, + saveAs: function saveAs(presetName) { + if (!this.load.remembered) { + this.load.remembered = {}; + this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); + } + this.load.remembered[presetName] = getCurrentPreset(this); + this.preset = presetName; + addPresetOption(this, presetName, true); + this.saveToLocalStorageIfPossible(); + }, + revert: function revert(gui) { + Common.each(this.__controllers, function (controller) { + if (!this.getRoot().load.remembered) { + controller.setValue(controller.initialValue); + } else { + recallSavedValue(gui || this.getRoot(), controller); + } + if (controller.__onFinishChange) { + controller.__onFinishChange.call(controller, controller.getValue()); + } + }, this); + Common.each(this.__folders, function (folder) { + folder.revert(folder); + }); + if (!gui) { + markPresetModified(this.getRoot(), false); + } + }, + listen: function listen(controller) { + var init = this.__listening.length === 0; + this.__listening.push(controller); + if (init) { + updateDisplays(this.__listening); + } + }, + updateDisplay: function updateDisplay() { + Common.each(this.__controllers, function (controller) { + controller.updateDisplay(); + }); + Common.each(this.__folders, function (folder) { + folder.updateDisplay(); + }); + } +}); +function addRow(gui, newDom, liBefore) { + var li = document.createElement('li'); + if (newDom) { + li.appendChild(newDom); + } + if (liBefore) { + gui.__ul.insertBefore(li, liBefore); + } else { + gui.__ul.appendChild(li); + } + gui.onResize(); + return li; +} +function removeListeners(gui) { + dom.unbind(window, 'resize', gui.__resizeHandler); + if (gui.saveToLocalStorageIfPossible) { + dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible); + } +} +function markPresetModified(gui, modified) { + var opt = gui.__preset_select[gui.__preset_select.selectedIndex]; + if (modified) { + opt.innerHTML = opt.value + '*'; + } else { + opt.innerHTML = opt.value; + } +} +function augmentController(gui, li, controller) { + controller.__li = li; + controller.__gui = gui; + Common.extend(controller, { + options: function options(_options) { + if (arguments.length > 1) { + var nextSibling = controller.__li.nextElementSibling; + controller.remove(); + return _add(gui, controller.object, controller.property, { + before: nextSibling, + factoryArgs: [Common.toArray(arguments)] + }); + } + if (Common.isArray(_options) || Common.isObject(_options)) { + var _nextSibling = controller.__li.nextElementSibling; + controller.remove(); + return _add(gui, controller.object, controller.property, { + before: _nextSibling, + factoryArgs: [_options] + }); + } + }, + name: function name(_name) { + controller.__li.firstElementChild.firstElementChild.innerHTML = _name; + return controller; + }, + listen: function listen() { + controller.__gui.listen(controller); + return controller; + }, + remove: function remove() { + controller.__gui.remove(controller); + return controller; + } + }); + if (controller instanceof NumberControllerSlider) { + var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step }); + Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) { + var pc = controller[method]; + var pb = box[method]; + controller[method] = box[method] = function () { + var args = Array.prototype.slice.call(arguments); + pb.apply(box, args); + return pc.apply(controller, args); + }; + }); + dom.addClass(li, 'has-slider'); + controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); + } else if (controller instanceof NumberControllerBox) { + var r = function r(returned) { + if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) { + var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML; + var wasListening = controller.__gui.__listening.indexOf(controller) > -1; + controller.remove(); + var newController = _add(gui, controller.object, controller.property, { + before: controller.__li.nextElementSibling, + factoryArgs: [controller.__min, controller.__max, controller.__step] + }); + newController.name(oldName); + if (wasListening) newController.listen(); + return newController; + } + return returned; + }; + controller.min = Common.compose(r, controller.min); + controller.max = Common.compose(r, controller.max); + } else if (controller instanceof BooleanController) { + dom.bind(li, 'click', function () { + dom.fakeEvent(controller.__checkbox, 'click'); + }); + dom.bind(controller.__checkbox, 'click', function (e) { + e.stopPropagation(); + }); + } else if (controller instanceof FunctionController) { + dom.bind(li, 'click', function () { + dom.fakeEvent(controller.__button, 'click'); + }); + dom.bind(li, 'mouseover', function () { + dom.addClass(controller.__button, 'hover'); + }); + dom.bind(li, 'mouseout', function () { + dom.removeClass(controller.__button, 'hover'); + }); + } else if (controller instanceof ColorController) { + dom.addClass(li, 'color'); + controller.updateDisplay = Common.compose(function (val) { + li.style.borderLeftColor = controller.__color.toString(); + return val; + }, controller.updateDisplay); + controller.updateDisplay(); + } + controller.setValue = Common.compose(function (val) { + if (gui.getRoot().__preset_select && controller.isModified()) { + markPresetModified(gui.getRoot(), true); + } + return val; + }, controller.setValue); +} +function recallSavedValue(gui, controller) { + var root = gui.getRoot(); + var matchedIndex = root.__rememberedObjects.indexOf(controller.object); + if (matchedIndex !== -1) { + var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex]; + if (controllerMap === undefined) { + controllerMap = {}; + root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap; + } + controllerMap[controller.property] = controller; + if (root.load && root.load.remembered) { + var presetMap = root.load.remembered; + var preset = void 0; + if (presetMap[gui.preset]) { + preset = presetMap[gui.preset]; + } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) { + preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME]; + } else { + return; + } + if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) { + var value = preset[matchedIndex][controller.property]; + controller.initialValue = value; + controller.setValue(value); + } + } + } +} +function _add(gui, object, property, params) { + if (object[property] === undefined) { + throw new Error('Object "' + object + '" has no property "' + property + '"'); + } + var controller = void 0; + if (params.color) { + controller = new ColorController(object, property); + } else { + var factoryArgs = [object, property].concat(params.factoryArgs); + controller = ControllerFactory.apply(gui, factoryArgs); + } + if (params.before instanceof Controller) { + params.before = params.before.__li; + } + recallSavedValue(gui, controller); + dom.addClass(controller.domElement, 'c'); + var name = document.createElement('span'); + dom.addClass(name, 'property-name'); + name.innerHTML = controller.property; + var container = document.createElement('div'); + container.appendChild(name); + container.appendChild(controller.domElement); + var li = addRow(gui, container, params.before); + dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); + if (controller instanceof ColorController) { + dom.addClass(li, 'color'); + } else { + dom.addClass(li, _typeof(controller.getValue())); + } + augmentController(gui, li, controller); + gui.__controllers.push(controller); + return controller; +} +function getLocalStorageHash(gui, key) { + return document.location.href + '.' + key; +} +function addPresetOption(gui, name, setSelected) { + var opt = document.createElement('option'); + opt.innerHTML = name; + opt.value = name; + gui.__preset_select.appendChild(opt); + if (setSelected) { + gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; + } +} +function showHideExplain(gui, explain) { + explain.style.display = gui.useLocalStorage ? 'block' : 'none'; +} +function addSaveMenu(gui) { + var div = gui.__save_row = document.createElement('li'); + dom.addClass(gui.domElement, 'has-save'); + gui.__ul.insertBefore(div, gui.__ul.firstChild); + dom.addClass(div, 'save-row'); + var gears = document.createElement('span'); + gears.innerHTML = ' '; + dom.addClass(gears, 'button gears'); + var button = document.createElement('span'); + button.innerHTML = 'Save'; + dom.addClass(button, 'button'); + dom.addClass(button, 'save'); + var button2 = document.createElement('span'); + button2.innerHTML = 'New'; + dom.addClass(button2, 'button'); + dom.addClass(button2, 'save-as'); + var button3 = document.createElement('span'); + button3.innerHTML = 'Revert'; + dom.addClass(button3, 'button'); + dom.addClass(button3, 'revert'); + var select = gui.__preset_select = document.createElement('select'); + if (gui.load && gui.load.remembered) { + Common.each(gui.load.remembered, function (value, key) { + addPresetOption(gui, key, key === gui.preset); + }); + } else { + addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); + } + dom.bind(select, 'change', function () { + for (var index = 0; index < gui.__preset_select.length; index++) { + gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; + } + gui.preset = this.value; + }); + div.appendChild(select); + div.appendChild(gears); + div.appendChild(button); + div.appendChild(button2); + div.appendChild(button3); + if (SUPPORTS_LOCAL_STORAGE) { + var explain = document.getElementById('dg-local-explain'); + var localStorageCheckBox = document.getElementById('dg-local-storage'); + var saveLocally = document.getElementById('dg-save-locally'); + saveLocally.style.display = 'block'; + if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { + localStorageCheckBox.setAttribute('checked', 'checked'); + } + showHideExplain(gui, explain); + dom.bind(localStorageCheckBox, 'change', function () { + gui.useLocalStorage = !gui.useLocalStorage; + showHideExplain(gui, explain); + }); + } + var newConstructorTextArea = document.getElementById('dg-new-constructor'); + dom.bind(newConstructorTextArea, 'keydown', function (e) { + if (e.metaKey && (e.which === 67 || e.keyCode === 67)) { + SAVE_DIALOGUE.hide(); + } + }); + dom.bind(gears, 'click', function () { + newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); + SAVE_DIALOGUE.show(); + newConstructorTextArea.focus(); + newConstructorTextArea.select(); + }); + dom.bind(button, 'click', function () { + gui.save(); + }); + dom.bind(button2, 'click', function () { + var presetName = prompt('Enter a new preset name.'); + if (presetName) { + gui.saveAs(presetName); + } + }); + dom.bind(button3, 'click', function () { + gui.revert(); + }); +} +function addResizeHandle(gui) { + var pmouseX = void 0; + gui.__resize_handle = document.createElement('div'); + Common.extend(gui.__resize_handle.style, { + width: '6px', + marginLeft: '-3px', + height: '200px', + cursor: 'ew-resize', + position: 'absolute' + }); + function drag(e) { + e.preventDefault(); + gui.width += pmouseX - e.clientX; + gui.onResize(); + pmouseX = e.clientX; + return false; + } + function dragStop() { + dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.unbind(window, 'mousemove', drag); + dom.unbind(window, 'mouseup', dragStop); + } + function dragStart(e) { + e.preventDefault(); + pmouseX = e.clientX; + dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.bind(window, 'mousemove', drag); + dom.bind(window, 'mouseup', dragStop); + return false; + } + dom.bind(gui.__resize_handle, 'mousedown', dragStart); + dom.bind(gui.__closeButton, 'mousedown', dragStart); + gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); +} +function setWidth(gui, w) { + gui.domElement.style.width = w + 'px'; + if (gui.__save_row && gui.autoPlace) { + gui.__save_row.style.width = w + 'px'; + } + if (gui.__closeButton) { + gui.__closeButton.style.width = w + 'px'; + } +} +function getCurrentPreset(gui, useInitialValues) { + var toReturn = {}; + Common.each(gui.__rememberedObjects, function (val, index) { + var savedValues = {}; + var controllerMap = gui.__rememberedObjectIndecesToControllers[index]; + Common.each(controllerMap, function (controller, property) { + savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue(); + }); + toReturn[index] = savedValues; + }); + return toReturn; +} +function setPresetSelectIndex(gui) { + for (var index = 0; index < gui.__preset_select.length; index++) { + if (gui.__preset_select[index].value === gui.preset) { + gui.__preset_select.selectedIndex = index; + } + } +} +function updateDisplays(controllerArray) { + if (controllerArray.length !== 0) { + requestAnimationFrame$1.call(window, function () { + updateDisplays(controllerArray); + }); + } + Common.each(controllerArray, function (c) { + c.updateDisplay(); + }); +} + +var color = { + Color: Color, + math: ColorMath, + interpret: interpret +}; +var controllers = { + Controller: Controller, + BooleanController: BooleanController, + OptionController: OptionController, + StringController: StringController, + NumberController: NumberController, + NumberControllerBox: NumberControllerBox, + NumberControllerSlider: NumberControllerSlider, + FunctionController: FunctionController, + ColorController: ColorController +}; +var dom$1 = { dom: dom }; +var gui = { GUI: GUI }; +var GUI$1 = GUI; +var index = { + color: color, + controllers: controllers, + dom: dom$1, + gui: gui, + GUI: GUI$1 +}; + +exports.color = color; +exports.controllers = controllers; +exports.dom = dom$1; +exports.gui = gui; +exports.GUI = GUI$1; +exports['default'] = index; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=dat.gui.js.map diff --git a/build/dat.gui.js.map b/build/dat.gui.js.map new file mode 100644 index 000000000..eb8553546 --- /dev/null +++ b/build/dat.gui.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dat.gui.js","sources":["../src/dat/color/toString.js","../src/dat/utils/common.js","../src/dat/color/interpret.js","../src/dat/color/math.js","../src/dat/color/Color.js","../src/dat/controllers/Controller.js","../src/dat/dom/dom.js","../src/dat/controllers/BooleanController.js","../src/dat/controllers/OptionController.js","../src/dat/controllers/StringController.js","../src/dat/controllers/NumberController.js","../src/dat/controllers/NumberControllerBox.js","../src/dat/controllers/NumberControllerSlider.js","../src/dat/controllers/FunctionController.js","../src/dat/controllers/ColorController.js","../src/dat/utils/css.js","../src/dat/gui/saveDialogue.html.js","../src/dat/controllers/ControllerFactory.js","../src/dat/utils/requestAnimationFrame.js","../src/dat/dom/CenteredDiv.js","../src/dat/gui/GUI.js","../src/dat/index.js"],"sourcesContent":["/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nexport default function(color, forceCSSHex) {\n const colorFormat = color.__state.conversionName.toString();\n\n const r = Math.round(color.r);\n const g = Math.round(color.g);\n const b = Math.round(color.b);\n const a = color.a;\n const h = Math.round(color.h);\n const s = color.s.toFixed(1);\n const v = color.v.toFixed(1);\n\n if (forceCSSHex || (colorFormat === 'THREE_CHAR_HEX') || (colorFormat === 'SIX_CHAR_HEX')) {\n let str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n\n return 'unknown format';\n}\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nconst ARR_EACH = Array.prototype.forEach;\nconst ARR_SLICE = Array.prototype.slice;\n\n/**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\nconst Common = {\n BREAK: {},\n\n extend: function(target) {\n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n const keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function(key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n\n return target;\n },\n\n defaults: function(target) {\n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n const keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function(key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n\n return target;\n },\n\n compose: function() {\n const toCall = ARR_SLICE.call(arguments);\n return function() {\n let args = ARR_SLICE.call(arguments);\n for (let i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n\n each: function(obj, itr, scope) {\n if (!obj) {\n return;\n }\n\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n let key;\n let l;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (const key in obj) {\n if (itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n }\n },\n\n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n\n // if the function is called repeatedly, wait until threshold passes until we execute the function\n debounce: function(func, threshold, callImmediately) {\n let timeout;\n\n return function() {\n const obj = this;\n const args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n\n const callNow = callImmediately || !timeout;\n\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n\n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n\n isNull: function(obj) {\n return obj === null;\n },\n\n isNaN: function(obj) {\n return isNaN(obj);\n },\n\n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n\n isObject: function(obj) {\n return obj === Object(obj);\n },\n\n isNumber: function(obj) {\n return obj === obj + 0;\n },\n\n isString: function(obj) {\n return obj === obj + '';\n },\n\n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n\n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n\n};\n\nexport default Common;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport toString from './toString';\nimport common from '../utils/common';\n\nconst INTERPRETATIONS = [\n // Strings\n {\n litmus: common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function(original) {\n const test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString(), 0)\n };\n },\n\n write: toString\n },\n\n SIX_CHAR_HEX: {\n read: function(original) {\n const test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n\n write: toString\n },\n\n CSS_RGB: {\n read: function(original) {\n const test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n\n write: toString\n },\n\n CSS_RGBA: {\n read: function(original) {\n const test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n\n write: toString\n }\n }\n },\n\n // Numbers\n {\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n litmus: common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function(original) {\n if (original.length !== 3) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n },\n\n // Objects\n {\n litmus: common.isObject,\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n }\n];\n\nlet result;\nlet toReturn;\n\nconst interpret = function() {\n toReturn = false;\n\n const original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n common.each(INTERPRETATIONS, function(family) {\n if (family.litmus(original)) {\n common.each(family.conversions, function(conversion, conversionName) {\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n }\n });\n\n return common.BREAK;\n }\n });\n\n return toReturn;\n};\n\nexport default interpret;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nlet tmpComponent;\n\nconst ColorMath = {\n hsv_to_rgb: function(h, s, v) {\n const hi = Math.floor(h / 60) % 6;\n\n const f = h / 60 - Math.floor(h / 60);\n const p = v * (1.0 - s);\n const q = v * (1.0 - (f * s));\n const t = v * (1.0 - ((1.0 - f) * s));\n\n const c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n\n rgb_to_hsv: function(r, g, b) {\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n const delta = max - min;\n let h;\n let s;\n\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n let hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~(0xFF << tmpComponent));\n }\n};\n\nexport default ColorMath;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport interpret from './interpret';\nimport math from './math';\nimport colorToString from './toString';\nimport common from '../utils/common';\n\nclass Color {\n constructor() {\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n\n this.__state.a = this.__state.a || 1;\n }\n\n toString() {\n return colorToString(this);\n }\n\n toHexString() {\n return colorToString(this, true);\n }\n\n toOriginal() {\n return this.__state.conversion.write(this);\n }\n}\n\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n Color.recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n },\n\n set: function(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n }\n });\n}\n\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n\n Color.recalculateHSV(this);\n\n return this.__state[component];\n },\n\n set: function(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n }\n });\n}\n\n\nColor.recalculateRGB = function(color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\n\nColor.recalculateHSV = function(color) {\n const result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\n\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\n\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\n\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\n\nObject.defineProperty(Color.prototype, 'a', {\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n});\n\nObject.defineProperty(Color.prototype, 'hex', {\n get: function() {\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n },\n\n set: function(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nexport default Color;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass Controller {\n constructor(object, property) {\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n }\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {Controller} this\n */\n onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {Controller} this\n */\n onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n\n this.updateDisplay();\n return this;\n }\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue() {\n return this.object[this.property];\n }\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {Controller} this\n */\n updateDisplay() {\n return this;\n }\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified() {\n return this.initialValue !== this.getValue();\n }\n}\n\nexport default Controller;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport common from '../utils/common';\n\nconst EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\n\nconst EVENT_MAP_INV = {};\ncommon.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n});\n\nconst CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\nfunction cssValueToPixels(val) {\n if (val === '0' || common.isUndefined(val)) {\n return 0;\n }\n\n const match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n}\n\n/**\n * @namespace\n * @member dat.dom\n */\nconst dom = {\n\n /**\n *\n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vert\n */\n makeFullscreen: function(elem, hor, vert) {\n let vertical = vert;\n let horizontal = hor;\n\n if (common.isUndefined(horizontal)) {\n horizontal = true;\n }\n\n if (common.isUndefined(vertical)) {\n vertical = true;\n }\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, pars, aux) {\n const params = pars || {};\n const className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n const evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n const clientX = params.x || params.clientX || 0;\n const clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, // screen X\n 0, // screen Y\n clientX, // client X\n clientY, // client Y\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n const init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, newBool) {\n const bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, newBool) {\n const bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n const classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n const classes = elem.className.split(/ +/);\n const index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n const style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style.width);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n const style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style.height);\n },\n\n /**\n *\n * @param el\n */\n getOffset: function(el) {\n let elem = el;\n const offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n *\n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n\n};\n\nexport default dom;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a checkbox input to alter the boolean property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass BooleanController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n const _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n }\n\n setValue(v) {\n const toReturn = super.setValue(v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n\n updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n\n return super.updateDisplay();\n }\n}\n\nexport default BooleanController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\n/**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n */\nclass OptionController extends Controller {\n constructor(object, property, opts) {\n super(object, property);\n\n let options = opts;\n\n const _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n const map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n const opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n const desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n }\n\n setValue(v) {\n const toReturn = super.setValue(v);\n\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n\n updateDisplay() {\n if (dom.isActive(this.__select)) return this; // prevent number from updating if user is trying to manually update\n this.__select.value = this.getValue();\n return super.updateDisplay();\n }\n}\n\nexport default OptionController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass StringController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n const _this = this;\n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n }\n\n updateDisplay() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return super.updateDisplay();\n }\n}\n\nexport default StringController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport common from '../utils/common';\n\nfunction numDecimals(x) {\n const _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n\n return 0;\n}\n\n/**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n */\nclass NumberController extends Controller {\n constructor(object, property, params) {\n super(object, property);\n\n const _params = params || {};\n\n this.__min = _params.min;\n this.__max = _params.max;\n this.__step = _params.step;\n\n if (common.isUndefined(this.__step)) {\n if (this.initialValue === 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n this.__impliedStep = this.__step;\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n }\n\n setValue(v) {\n let _v = v;\n\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n\n return super.setValue(_v);\n }\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min(minValue) {\n this.__min = minValue;\n return this;\n }\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n}\n\nexport default NumberController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport NumberController from './NumberController';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nfunction roundToDecimal(value, decimals) {\n const tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\n\n/**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n */\nclass NumberControllerBox extends NumberController {\n constructor(object, property, params) {\n super(object, property, params);\n\n this.__truncationSuspended = false;\n\n const _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n let prevY;\n\n function onChange() {\n const attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onBlur() {\n onFinish();\n }\n\n function onMouseDrag(e) {\n const diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prevY = e.clientY;\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n // When pressing enter, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n }\n\n updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return super.updateDisplay();\n }\n}\n\nexport default NumberControllerBox;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport NumberController from './NumberController';\nimport dom from '../dom/dom';\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\n\n/**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n */\nclass NumberControllerSlider extends NumberController {\n constructor(object, property, min, max, step) {\n super(object, property, { min: min, max: max, step: step });\n\n const _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n dom.bind(this.__background, 'touchstart', onTouchStart);\n\n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n document.activeElement.blur();\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n e.preventDefault();\n\n const bgRect = _this.__background.getBoundingClientRect();\n\n _this.setValue(\n map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)\n );\n\n return false;\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onTouchStart(e) {\n if (e.touches.length !== 1) { return; }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n\n function onTouchMove(e) {\n const clientX = e.touches[0].clientX;\n const bgRect = _this.__background.getBoundingClientRect();\n\n _this.setValue(\n map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)\n );\n }\n\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n }\n\n updateDisplay() {\n const pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return super.updateDisplay();\n }\n}\n\nexport default NumberControllerSlider;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass FunctionController extends Controller {\n constructor(object, property, text) {\n super(object, property);\n\n const _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n }\n\n fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n}\n\nexport default FunctionController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\nimport Color from '../color/Color';\nimport interpret from '../color/interpret';\nimport common from '../utils/common';\n\n/**\n * @class Represents a given property of an object that is a color.\n * @param {Object} object\n * @param {string} property\n */\nclass ColorController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n const _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(/* e */) {\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(/* e */) {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n\n dom.bind(this.__selector, 'touchstart', function(/* e */) {\n dom\n .addClass(this, 'drag')\n .bind(window, 'touchend', function(/* e */) {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n\n const valueField = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n\n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__saturation_field, 'touchstart', fieldDown);\n\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'touchstart', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', fieldDownH);\n dom.bind(this.__hue_field, 'touchstart', fieldDownH);\n\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n\n function onBlur() {\n const i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n\n this.__saturation_field.appendChild(valueField);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) { e.preventDefault(); }\n\n const fieldRect = _this.__saturation_field.getBoundingClientRect();\n const { clientX, clientY } = (e.touches && e.touches[0]) || e;\n let s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n let v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n }\n\n function setH(e) {\n if (e.type.indexOf('touch') === -1) { e.preventDefault(); }\n\n const fieldRect = _this.__hue_field.getBoundingClientRect();\n const { clientY } = (e.touches && e.touches[0]) || e;\n let h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n }\n }\n\n updateDisplay() {\n const i = interpret(this.getValue());\n\n if (i !== false) {\n let mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) && !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n const flip = (this.__color.v < 0.5 || this.__color.s > 0.5) ? 255 : 0;\n const _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n\n this.__input.value = this.__color.toString();\n\n common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n}\n\nconst vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\n\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\n\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nexport default ColorController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nconst css = {\n load: function(url, indoc) {\n const doc = indoc || document;\n const link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n\n inject: function(cssContent, indoc) {\n const doc = indoc || document;\n const injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n const head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) { // Unable to inject CSS, probably because of a Content Security Policy\n }\n }\n};\n\nexport default css;\n","const saveDialogContents = `
\n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n
`;\n\nexport default saveDialogContents;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport OptionController from './OptionController';\nimport NumberControllerBox from './NumberControllerBox';\nimport NumberControllerSlider from './NumberControllerSlider';\nimport StringController from './StringController';\nimport FunctionController from './FunctionController';\nimport BooleanController from './BooleanController';\nimport common from '../utils/common';\n\nconst ControllerFactory = function(object, property) {\n const initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n if (common.isNumber(initialValue)) {\n // Has min and max? (slider)\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n // has step?\n if (common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property,\n arguments[2], arguments[3], arguments[4]);\n }\n\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n\n // number box\n if (common.isNumber(arguments[4])) { // has step\n return new NumberControllerBox(object, property,\n { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n return null;\n};\n\nexport default ControllerFactory;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\n\nexport default window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n requestAnimationFrame;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nclass CenteredDiv {\n constructor() {\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n const _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n }\n\n show() {\n const _this = this;\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n\n /**\n * Hide centered div\n */\n hide() {\n const _this = this;\n\n const hide = function() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n\n layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n}\n\nexport default CenteredDiv;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport css from '../utils/css';\nimport saveDialogueContents from './saveDialogue.html';\nimport ControllerFactory from '../controllers/ControllerFactory';\nimport Controller from '../controllers/Controller';\nimport BooleanController from '../controllers/BooleanController';\nimport FunctionController from '../controllers/FunctionController';\nimport NumberControllerBox from '../controllers/NumberControllerBox';\nimport NumberControllerSlider from '../controllers/NumberControllerSlider';\nimport ColorController from '../controllers/ColorController';\nimport requestAnimationFrame from '../utils/requestAnimationFrame';\nimport CenteredDiv from '../dom/CenteredDiv';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nimport styleSheet from './style.scss'; // CSS to embed in build\n\ncss.inject(styleSheet);\n\n/** @ignore Outer-most className for GUI's */\nconst CSS_NAMESPACE = 'dg';\n\nconst HIDE_KEY_CODE = 72;\n\n/** @ignore The only value shared between the JS and SCSS. Use caution. */\nconst CLOSE_BUTTON_HEIGHT = 20;\n\nconst DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\nconst SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}());\n\nlet SAVE_DIALOGUE;\n\n/** @ignore Have we yet to create an autoPlace GUI? */\nlet autoPlaceVirgin = true;\n\n/** @ignore Fixed position div that auto place GUI's go inside */\nlet autoPlaceContainer;\n\n/** @ignore Are we hiding the GUI's ? */\nlet hide = false;\n\n/** @private GUI's which should be hidden */\nconst hideableGuis = [];\n\n/**\n * @class A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n *\n * @typicalname gui\n *\n * @example\n * // Creating a GUI with options.\n * var gui = new dat.GUI({name: 'My GUI'});\n *\n * @example\n * // Creating a GUI and a subfolder.\n * var gui = new dat.GUI();\n * var folder1 = gui.addFolder('Flow Field');\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.autoPlace=true]\n * @param {Boolean} [params.hideable=true] If true, GUI is shown/hidden by h keypress.\n * @param {Boolean} [params.closed=false] If true, starts closed\n * @param {Boolean} [params.closeOnTop=false] If true, close/open button shows on top of the GUI\n */\nconst GUI = function(pars) {\n const _this = this;\n\n let params = pars || {};\n\n /**\n * Outermost DOM Element\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n // Default parameters\n params = common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n if (!common.isUndefined(params.load)) {\n // Explicit preset\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n let useLocalStorage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n let saveToLocalStorage;\n let titleRow;\n\n Object.defineProperties(this,\n /** @lends GUI.prototype */\n {\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * Handles GUI's position of open/close button\n * @type Boolean\n */\n closeOnTop: {\n get: function() {\n return params.closeOnTop;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n\n return params.load.preset;\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return useLocalStorage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n\n const savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n\n dom.bind(this.__closeButton, 'click', function() {\n _this.closed = !_this.closed;\n });\n // Oh, you're a nested GUI!\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n const titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n\n titleRow = addRow(_this, titleRowName);\n\n const onClickTitle = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n\n if (!params.closed) {\n this.closed = false;\n }\n }\n\n if (params.autoPlace) {\n if (common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n\n // Put it in the dom for you.\n autoPlaceContainer.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n\n\n // Make it not elastic.\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n\n this.__resizeHandler = function() {\n _this.onResizeDebounced();\n };\n\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n saveToLocalStorage = function() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n\n // expose this method publicly\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n\n function resetWidth() {\n const root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n};\n\nGUI.toggleHide = function() {\n hide = !hide;\n common.each(hideableGuis, function(gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\n\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\n\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\n\nGUI._keydownHandler = function(e) {\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\n\ncommon.extend(\n GUI.prototype,\n\n /** @lends GUI.prototype */\n {\n\n /**\n * Adds a new {@link Controller} to the GUI. The type of controller created\n * is inferred from the initial value of object[property]. For\n * color properties, see {@link addColor}.\n *\n * @param {Object} object The object to be manipulated\n * @param {String} property The name of the property to be manipulated\n * @param {Number} [min] Minimum allowed value\n * @param {Number} [max] Maximum allowed value\n * @param {Number} [step] Increment by which to change value\n * @returns {Controller} The controller that was added to the GUI.\n * @instance\n *\n * @example\n * // Add a string controller.\n * var person = {name: 'Sam'};\n * gui.add(person, 'name');\n *\n * @example\n * // Add a number controller slider.\n * var person = {age: 45};\n * gui.add(person, 'age', 0, 100);\n */\n add: function(object, property) {\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n },\n\n /**\n * Adds a new color controller to the GUI.\n *\n * @param object\n * @param property\n * @returns {Controller} The controller that was added to the GUI.\n * @instance\n *\n * @example\n * var palette = {\n * color1: '#FF0000', // CSS string\n * color2: [ 0, 128, 255 ], // RGB array\n * color3: [ 0, 128, 255, 0.3 ], // RGB with alpha\n * color4: { h: 350, s: 0.9, v: 0.3 } // Hue, saturation, value\n * };\n * gui.addColor(palette, 'color1');\n * gui.addColor(palette, 'color2');\n * gui.addColor(palette, 'color3');\n * gui.addColor(palette, 'color4');\n */\n addColor: function(object, property) {\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n },\n\n /**\n * Removes the given controller from the GUI.\n * @param {Controller} controller\n * @instance\n */\n remove: function(controller) {\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n const _this = this;\n common.defer(function() {\n _this.onResize();\n });\n },\n\n /**\n * Removes the root GUI from the document and unbinds all event listeners.\n * For subfolders, use `gui.removeFolder(folder)` instead.\n * @instance\n */\n destroy: function() {\n if (this.parent) {\n throw new Error(\n 'Only the root GUI should be removed with .destroy(). ' +\n 'For subfolders, use gui.removeFolder(folder) instead.'\n );\n }\n\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n\n const _this = this;\n common.each(this.__folders, function(subfolder) {\n _this.removeFolder(subfolder);\n });\n\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n\n removeListeners(this);\n },\n\n /**\n * Creates a new subfolder GUI instance.\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n const newGuiParams = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n newGuiParams.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n // Start me closed if I was closed\n newGuiParams.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n newGuiParams.load = this.load.folders[name];\n }\n\n const gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n\n const li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n\n /**\n * Removes a subfolder GUI instance.\n * @param {dat.gui.GUI} folder The folder to remove.\n * @instance\n */\n removeFolder: function(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n\n delete this.__folders[folder.name];\n\n // Do we have saved appearance data for this folder?\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n\n removeListeners(folder);\n\n const _this = this;\n\n common.each(folder.__folders, function(subfolder) {\n folder.removeFolder(subfolder);\n });\n\n common.defer(function() {\n _this.onResize();\n });\n },\n\n /**\n * Opens the GUI.\n */\n open: function() {\n this.closed = false;\n },\n\n /**\n * Closes the GUI.\n */\n close: function() {\n this.closed = true;\n },\n\n /**\n * Hides the GUI.\n */\n hide: function() {\n this.domElement.style.display = 'none';\n },\n\n /**\n * Shows the GUI.\n */\n show: function() {\n this.domElement.style.display = '';\n },\n\n\n onResize: function() {\n // we debounce this function to prevent performance issues when rotating on tablet/mobile\n const root = this.getRoot();\n if (root.scrollable) {\n const top = dom.getOffset(root.__ul).top;\n let h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n\n onResizeDebounced: common.debounce(function() { this.onResize(); }, 50),\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {...Object} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n * @ignore\n */\n remember: function() {\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n\n const _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n let gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n const toReturn = this.load;\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n },\n\n save: function() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n\n saveAs: function(presetName) {\n if (!this.load.remembered) {\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n\n revert: function(gui) {\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n\n // fire onFinishChange callback\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n\n listen: function(controller) {\n const init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n\n updateDisplay: function() {\n common.each(this.__controllers, function(controller) {\n controller.updateDisplay();\n });\n common.each(this.__folders, function(folder) {\n folder.updateDisplay();\n });\n }\n }\n);\n\n/**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [newDom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n *\n * @ignore\n */\nfunction addRow(gui, newDom, liBefore) {\n const li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\n\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\n\nfunction markPresetModified(gui, modified) {\n const opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\n\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, /** @lends Controller.prototype */ {\n /**\n * @param {Array|Object} options\n * @return {Controller}\n */\n options: function(options) {\n if (arguments.length > 1) {\n const nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: nextSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n const nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: nextSibling,\n factoryArgs: [options]\n }\n );\n }\n },\n\n /**\n * Sets the name of the controller.\n * @param {string} name\n * @return {Controller}\n */\n name: function(name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = name;\n return controller;\n },\n\n /**\n * Sets controller to listen for changes on its underlying object.\n * @return {Controller}\n */\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n /**\n * Removes the controller from its parent GUI.\n * @return {Controller}\n */\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n const box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function(method) {\n const pc = controller[method];\n const pb = box[method];\n controller[method] = box[method] = function() {\n const args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n const r = function(returned) {\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n // Well, then lets just replace this with a slider.\n\n // lets remember if the old controller had a specific name or was listening\n const oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n const wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n\n controller.remove();\n const newController = add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n newController.name(oldName);\n if (wasListening) newController.listen();\n\n return newController;\n }\n\n return returned;\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n }\n\n controller.setValue = common.compose(function(val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n\n return val;\n }, controller.setValue);\n}\n\nfunction recallSavedValue(gui, controller) {\n // Find the topmost GUI, that's where remembered objects live.\n const root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n const matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matchedIndex !== -1) {\n // Let me fetch a map of controllers for thcommon.isObject.\n let controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] =\n controllerMap;\n }\n\n // Keep track of this controller\n controllerMap[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n const presetMap = root.load.remembered;\n\n // Which preset are we trying to load?\n let preset;\n\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n // Uhh, you can have the default instead?\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n // Nada.\n return;\n }\n\n // Did the loaded object remember thcommon.isObject? && Did we remember this particular property?\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n // We did remember something for this guy ...\n const value = preset[matchedIndex][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\n\nfunction add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error(`Object \"${object}\" has no property \"${property}\"`);\n }\n\n let controller;\n\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n const factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n const name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n const container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n const li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, typeof controller.getValue());\n }\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n}\n\nfunction getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n}\n\nfunction addPresetOption(gui, name, setSelected) {\n const opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\n\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\n\nfunction addSaveMenu(gui) {\n const div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n const gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n const button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n const button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n const button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n const select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n for (let index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n const explain = document.getElementById('dg-local-explain');\n const localStorageCheckBox = document.getElementById('dg-local-storage');\n const saveLocally = document.getElementById('dg-save-locally');\n\n saveLocally.style.display = 'block';\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n showHideExplain(gui, explain);\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n\n const newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n const presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n // div.appendChild(button2);\n}\n\nfunction addResizeHandle(gui) {\n let pmouseX;\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n // border: '1px solid blue'\n\n });\n\n function drag(e) {\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n }\n\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n\n function dragStart(e) {\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n }\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\n\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\n\nfunction getCurrentPreset(gui, useInitialValues) {\n const toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n const savedValues = {};\n\n // The controllers I've made for thcommon.isObject by property\n const controllerMap =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controllerMap, function(controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = savedValues;\n });\n\n return toReturn;\n}\n\nfunction setPresetSelectIndex(gui) {\n for (let index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\n\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame.call(window, function() {\n updateDisplays(controllerArray);\n });\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n}\n\nexport default GUI;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Color from './color/Color';\nimport math from './color/math';\nimport interpret from './color/interpret';\n\nimport Controller from './controllers/Controller';\nimport BooleanController from './controllers/BooleanController';\nimport OptionController from './controllers/OptionController';\nimport StringController from './controllers/StringController';\nimport NumberController from './controllers/NumberController';\nimport NumberControllerBox from './controllers/NumberControllerBox';\nimport NumberControllerSlider from './controllers/NumberControllerSlider';\nimport FunctionController from './controllers/FunctionController';\nimport ColorController from './controllers/ColorController';\n\nimport domImport from './dom/dom';\nimport GUIImport from './gui/GUI';\n\nexport const color = {\n Color: Color,\n math: math,\n interpret: interpret\n};\n\nexport const controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\n\nexport const dom = { dom: domImport };\n\nexport const gui = { GUI: GUIImport };\n\nexport const GUI = GUIImport;\n\nexport default {\n color,\n controllers,\n dom,\n gui,\n GUI\n};\n"],"names":["color","forceCSSHex","colorFormat","__state","conversionName","toString","r","Math","round","g","b","a","h","s","toFixed","v","str","hex","length","ARR_EACH","Array","prototype","forEach","ARR_SLICE","slice","Common","target","each","call","arguments","obj","keys","isObject","Object","key","isUndefined","bind","toCall","args","i","apply","itr","scope","l","BREAK","fnc","func","threshold","callImmediately","timeout","delayed","callNow","setTimeout","toArray","undefined","isNaN","isArray","constructor","INTERPRETATIONS","common","isString","original","test","match","parseInt","parseFloat","isNumber","result","toReturn","interpret","family","litmus","conversions","conversion","read","tmpComponent","ColorMath","hi","floor","f","p","q","t","c","min","max","delta","NaN","hex_with_component","componentIndex","value","Color","Error","colorToString","write","defineRGBComponent","component","componentHexIndex","defineProperty","space","recalculateRGB","defineHSVComponent","recalculateHSV","math","component_from_hex","extend","hsv_to_rgb","rgb_to_hsv","COMPONENTS","rgb_to_hex","Controller","object","property","initialValue","domElement","document","createElement","__onChange","__onFinishChange","newValue","updateDisplay","getValue","EVENT_MAP","EVENT_MAP_INV","k","e","CSS_VALUE_PIXELS","cssValueToPixels","val","isNull","dom","elem","selectable","style","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","hor","vert","vertical","horizontal","position","left","right","top","bottom","eventType","pars","aux","params","className","evt","createEvent","clientX","x","clientY","y","initMouseEvent","bubbles","cancelable","window","clickCount","init","initKeyboardEvent","initKeyEvent","defaults","ctrlKey","altKey","shiftKey","metaKey","keyCode","charCode","initEvent","dispatchEvent","event","newBool","bool","addEventListener","attachEvent","removeEventListener","detachEvent","classes","split","indexOf","push","join","replace","removeAttribute","index","splice","RegExp","getComputedStyle","width","height","el","offset","offsetParent","offsetLeft","offsetTop","activeElement","type","href","BooleanController","_this","__prev","__checkbox","setAttribute","onChange","setValue","appendChild","checked","OptionController","opts","options","__select","map","element","opt","innerHTML","desiredValue","selectedIndex","isActive","StringController","__input","onBlur","blur","numDecimals","_x","NumberController","_params","__min","__max","__step","step","__impliedStep","pow","log","abs","LN10","__precision","_v","minValue","maxValue","stepValue","roundToDecimal","decimals","tenTo","NumberControllerBox","__truncationSuspended","prevY","attempted","onFinish","onMouseDrag","diff","onMouseUp","unbind","onMouseDown","i1","i2","o1","o2","NumberControllerSlider","__background","__foreground","onTouchStart","addClass","preventDefault","bgRect","getBoundingClientRect","touches","onTouchMove","onTouchEnd","pct","FunctionController","text","__button","fire","ColorController","__color","__temp","makeSelectable","__selector","__saturation_field","__field_knob","__field_knob_border","__hue_knob","__hue_field","__input_textShadow","removeClass","valueField","fieldDown","fieldDownH","setSV","fieldUpSV","setH","fieldUpH","toOriginal","fieldRect","mismatch","flip","_flip","toHexString","marginTop","vendors","linearGradient","background","vendor","cssText","hueGradient","css","url","indoc","doc","link","rel","getElementsByTagName","cssContent","injected","head","saveDialogContents","ControllerFactory","isFunction","isBoolean","requestAnimationFrame","callback","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","CenteredDiv","backgroundElement","makeFullscreen","body","hide","display","opacity","webkitTransform","layout","defer","innerWidth","getWidth","innerHeight","getHeight","inject","styleSheet","CSS_NAMESPACE","HIDE_KEY_CODE","CLOSE_BUTTON_HEIGHT","DEFAULT_DEFAULT_PRESET_NAME","SUPPORTS_LOCAL_STORAGE","localStorage","SAVE_DIALOGUE","autoPlaceVirgin","autoPlaceContainer","hideableGuis","GUI","__ul","__folders","__controllers","__rememberedObjects","__rememberedObjectIndecesToControllers","__listening","DEFAULT_WIDTH","autoPlace","load","preset","parent","hideable","resizable","scrollable","useLocalStorage","getItem","getLocalStorageHash","saveToLocalStorage","titleRow","defineProperties","closeOnTop","getRoot","revert","name","closed","CLASS_CLOSED","onResize","__closeButton","TEXT_OPEN","TEXT_CLOSED","setItem","CLASS_MAIN","savedGui","JSON","parse","CLASS_CLOSE_BUTTON","CLASS_CLOSE_TOP","insertBefore","childNodes","CLASS_CLOSE_BOTTOM","titleRowName","createTextNode","addRow","onClickTitle","CLASS_AUTO_PLACE_CONTAINER","CLASS_AUTO_PLACE","__resizeHandler","onResizeDebounced","stringify","getSaveObject","saveToLocalStorageIfPossible","resetWidth","root","toggleHide","gui","CLASS_CONTROLLER_ROW","CLASS_TOO_TALL","CLASS_DRAG","_keydownHandler","which","add","controller","removeChild","__li","subfolder","removeFolder","newGuiParams","folders","li","folder","parentElement","getOffset","node","__save_row","__resize_handle","offsetHeight","debounce","saveDialogueContents","remembered","getCurrentPreset","presetName","newDom","liBefore","removeListeners","markPresetModified","modified","__preset_select","augmentController","__gui","nextSibling","nextElementSibling","remove","firstElementChild","listen","box","method","pc","pb","returned","oldName","wasListening","newController","compose","fakeEvent","stopPropagation","borderLeftColor","isModified","recallSavedValue","matchedIndex","controllerMap","presetMap","factoryArgs","concat","before","container","location","addPresetOption","setSelected","showHideExplain","explain","addSaveMenu","div","firstChild","gears","button","button2","button3","select","getElementById","localStorageCheckBox","saveLocally","newConstructorTextArea","show","focus","save","prompt","saveAs","addResizeHandle","pmouseX","drag","dragStop","dragStart","setWidth","w","useInitialValues","savedValues","setPresetSelectIndex","updateDisplays","controllerArray","controllers","domImport","GUIImport"],"mappings":"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"} \ No newline at end of file diff --git a/build/dat.gui.min.js b/build/dat.gui.min.js new file mode 100644 index 000000000..1398e14ab --- /dev/null +++ b/build/dat.gui.min.js @@ -0,0 +1,13 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.dat={})}(this,function(e){"use strict";function t(e,t){var n=e.__state.conversionName.toString(),o=Math.round(e.r),i=Math.round(e.g),r=Math.round(e.b),s=e.a,a=Math.round(e.h),l=e.s.toFixed(1),d=e.v.toFixed(1);if(t||"THREE_CHAR_HEX"===n||"SIX_CHAR_HEX"===n){for(var c=e.hex.toString(16);c.length<6;)c="0"+c;return"#"+c}return"CSS_RGB"===n?"rgb("+o+","+i+","+r+")":"CSS_RGBA"===n?"rgba("+o+","+i+","+r+","+s+")":"HEX"===n?"0x"+e.hex.toString(16):"RGB_ARRAY"===n?"["+o+","+i+","+r+"]":"RGBA_ARRAY"===n?"["+o+","+i+","+r+","+s+"]":"RGB_OBJ"===n?"{r:"+o+",g:"+i+",b:"+r+"}":"RGBA_OBJ"===n?"{r:"+o+",g:"+i+",b:"+r+",a:"+s+"}":"HSV_OBJ"===n?"{h:"+a+",s:"+l+",v:"+d+"}":"HSVA_OBJ"===n?"{h:"+a+",s:"+l+",v:"+d+",a:"+s+"}":"unknown format"}function n(e,t,n){Object.defineProperty(e,t,{get:function(){return"RGB"===this.__state.space?this.__state[t]:(I.recalculateRGB(this,t,n),this.__state[t])},set:function(e){"RGB"!==this.__state.space&&(I.recalculateRGB(this,t,n),this.__state.space="RGB"),this.__state[t]=e}})}function o(e,t){Object.defineProperty(e,t,{get:function(){return"HSV"===this.__state.space?this.__state[t]:(I.recalculateHSV(this),this.__state[t])},set:function(e){"HSV"!==this.__state.space&&(I.recalculateHSV(this),this.__state.space="HSV"),this.__state[t]=e}})}function i(e){if("0"===e||S.isUndefined(e))return 0;var t=e.match(U);return S.isNull(t)?0:parseFloat(t[1])}function r(e){var t=e.toString();return t.indexOf(".")>-1?t.length-t.indexOf(".")-1:0}function s(e,t){var n=Math.pow(10,t);return Math.round(e*n)/n}function a(e,t,n,o,i){return o+(e-t)/(n-t)*(i-o)}function l(e,t,n,o){e.style.background="",S.each(ee,function(i){e.style.cssText+="background: "+i+"linear-gradient("+t+", "+n+" 0%, "+o+" 100%); "})}function d(e){e.style.background="",e.style.cssText+="background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);",e.style.cssText+="background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);"}function c(e,t,n){var o=document.createElement("li");return t&&o.appendChild(t),n?e.__ul.insertBefore(o,n):e.__ul.appendChild(o),e.onResize(),o}function u(e){X.unbind(window,"resize",e.__resizeHandler),e.saveToLocalStorageIfPossible&&X.unbind(window,"unload",e.saveToLocalStorageIfPossible)}function _(e,t){var n=e.__preset_select[e.__preset_select.selectedIndex];n.innerHTML=t?n.value+"*":n.value}function h(e,t,n){if(n.__li=t,n.__gui=e,S.extend(n,{options:function(t){if(arguments.length>1){var o=n.__li.nextElementSibling;return n.remove(),f(e,n.object,n.property,{before:o,factoryArgs:[S.toArray(arguments)]})}if(S.isArray(t)||S.isObject(t)){var i=n.__li.nextElementSibling;return n.remove(),f(e,n.object,n.property,{before:i,factoryArgs:[t]})}},name:function(e){return n.__li.firstElementChild.firstElementChild.innerHTML=e,n},listen:function(){return n.__gui.listen(n),n},remove:function(){return n.__gui.remove(n),n}}),n instanceof q){var o=new Q(n.object,n.property,{min:n.__min,max:n.__max,step:n.__step});S.each(["updateDisplay","onChange","onFinishChange","step","min","max"],function(e){var t=n[e],i=o[e];n[e]=o[e]=function(){var e=Array.prototype.slice.call(arguments);return i.apply(o,e),t.apply(n,e)}}),X.addClass(t,"has-slider"),n.domElement.insertBefore(o.domElement,n.domElement.firstElementChild)}else if(n instanceof Q){var i=function(t){if(S.isNumber(n.__min)&&S.isNumber(n.__max)){var o=n.__li.firstElementChild.firstElementChild.innerHTML,i=n.__gui.__listening.indexOf(n)>-1;n.remove();var r=f(e,n.object,n.property,{before:n.__li.nextElementSibling,factoryArgs:[n.__min,n.__max,n.__step]});return r.name(o),i&&r.listen(),r}return t};n.min=S.compose(i,n.min),n.max=S.compose(i,n.max)}else n instanceof K?(X.bind(t,"click",function(){X.fakeEvent(n.__checkbox,"click")}),X.bind(n.__checkbox,"click",function(e){e.stopPropagation()})):n instanceof Z?(X.bind(t,"click",function(){X.fakeEvent(n.__button,"click")}),X.bind(t,"mouseover",function(){X.addClass(n.__button,"hover")}),X.bind(t,"mouseout",function(){X.removeClass(n.__button,"hover")})):n instanceof $&&(X.addClass(t,"color"),n.updateDisplay=S.compose(function(e){return t.style.borderLeftColor=n.__color.toString(),e},n.updateDisplay),n.updateDisplay());n.setValue=S.compose(function(t){return e.getRoot().__preset_select&&n.isModified()&&_(e.getRoot(),!0),t},n.setValue)}function p(e,t){var n=e.getRoot(),o=n.__rememberedObjects.indexOf(t.object);if(-1!==o){var i=n.__rememberedObjectIndecesToControllers[o];if(void 0===i&&(i={},n.__rememberedObjectIndecesToControllers[o]=i),i[t.property]=t,n.load&&n.load.remembered){var r=n.load.remembered,s=void 0;if(r[e.preset])s=r[e.preset];else{if(!r[se])return;s=r[se]}if(s[o]&&void 0!==s[o][t.property]){var a=s[o][t.property];t.initialValue=a,t.setValue(a)}}}}function f(e,t,n,o){if(void 0===t[n])throw new Error('Object "'+t+'" has no property "'+n+'"');var i=void 0;if(o.color)i=new $(t,n);else{var r=[t,n].concat(o.factoryArgs);i=ne.apply(e,r)}o.before instanceof z&&(o.before=o.before.__li),p(e,i),X.addClass(i.domElement,"c");var s=document.createElement("span");X.addClass(s,"property-name"),s.innerHTML=i.property;var a=document.createElement("div");a.appendChild(s),a.appendChild(i.domElement);var l=c(e,a,o.before);return X.addClass(l,he.CLASS_CONTROLLER_ROW),i instanceof $?X.addClass(l,"color"):X.addClass(l,H(i.getValue())),h(e,l,i),e.__controllers.push(i),i}function m(e,t){return document.location.href+"."+t}function g(e,t,n){var o=document.createElement("option");o.innerHTML=t,o.value=t,e.__preset_select.appendChild(o),n&&(e.__preset_select.selectedIndex=e.__preset_select.length-1)}function b(e,t){t.style.display=e.useLocalStorage?"block":"none"}function v(e){var t=e.__save_row=document.createElement("li");X.addClass(e.domElement,"has-save"),e.__ul.insertBefore(t,e.__ul.firstChild),X.addClass(t,"save-row");var n=document.createElement("span");n.innerHTML=" ",X.addClass(n,"button gears");var o=document.createElement("span");o.innerHTML="Save",X.addClass(o,"button"),X.addClass(o,"save");var i=document.createElement("span");i.innerHTML="New",X.addClass(i,"button"),X.addClass(i,"save-as");var r=document.createElement("span");r.innerHTML="Revert",X.addClass(r,"button"),X.addClass(r,"revert");var s=e.__preset_select=document.createElement("select");if(e.load&&e.load.remembered?S.each(e.load.remembered,function(t,n){g(e,n,n===e.preset)}):g(e,se,!1),X.bind(s,"change",function(){for(var t=0;t=0;n--)t=[e[n].apply(this,t)];return t[0]}},each:function(e,t,n){if(e)if(A&&e.forEach&&e.forEach===A)e.forEach(t,n);else if(e.length===e.length+0){var o=void 0,i=void 0;for(o=0,i=e.length;o1?S.toArray(arguments):arguments[0];return S.each(O,function(t){if(t.litmus(e))return S.each(t.conversions,function(t,n){if(T=t.read(e),!1===L&&!1!==T)return L=T,T.conversionName=n,T.conversion=t,S.BREAK}),S.BREAK}),L},B=void 0,N={hsv_to_rgb:function(e,t,n){var o=Math.floor(e/60)%6,i=e/60-Math.floor(e/60),r=n*(1-t),s=n*(1-i*t),a=n*(1-(1-i)*t),l=[[n,a,r],[s,n,r],[r,n,a],[r,s,n],[a,r,n],[n,r,s]][o];return{r:255*l[0],g:255*l[1],b:255*l[2]}},rgb_to_hsv:function(e,t,n){var o=Math.min(e,t,n),i=Math.max(e,t,n),r=i-o,s=void 0,a=void 0;return 0===i?{h:NaN,s:0,v:0}:(a=r/i,s=e===i?(t-n)/r:t===i?2+(n-e)/r:4+(e-t)/r,(s/=6)<0&&(s+=1),{h:360*s,s:a,v:i/255})},rgb_to_hex:function(e,t,n){var o=this.hex_with_component(0,2,e);return o=this.hex_with_component(o,1,t),o=this.hex_with_component(o,0,n)},component_from_hex:function(e,t){return e>>8*t&255},hex_with_component:function(e,t,n){return n<<(B=8*t)|e&~(255<this.__max&&(n=this.__max),void 0!==this.__step&&n%this.__step!=0&&(n=Math.round(n/this.__step)*this.__step),j(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"setValue",this).call(this,n)}},{key:"min",value:function(e){return this.__min=e,this}},{key:"max",value:function(e){return this.__max=e,this}},{key:"step",value:function(e){return this.__step=e,this.__impliedStep=e,this.__precision=r(e),this}}]),t}(),Q=function(e){function t(e,n,o){function i(){l.__onFinishChange&&l.__onFinishChange.call(l,l.getValue())}function r(e){var t=d-e.clientY;l.setValue(l.getValue()+t*l.__impliedStep),d=e.clientY}function s(){X.unbind(window,"mousemove",r),X.unbind(window,"mouseup",s),i()}F(this,t);var a=V(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n,o));a.__truncationSuspended=!1;var l=a,d=void 0;return a.__input=document.createElement("input"),a.__input.setAttribute("type","text"),X.bind(a.__input,"change",function(){var e=parseFloat(l.__input.value);S.isNaN(e)||l.setValue(e)}),X.bind(a.__input,"blur",function(){i()}),X.bind(a.__input,"mousedown",function(e){X.bind(window,"mousemove",r),X.bind(window,"mouseup",s),d=e.clientY}),X.bind(a.__input,"keydown",function(e){13===e.keyCode&&(l.__truncationSuspended=!0,this.blur(),l.__truncationSuspended=!1,i())}),a.updateDisplay(),a.domElement.appendChild(a.__input),a}return D(t,W),P(t,[{key:"updateDisplay",value:function(){return this.__input.value=this.__truncationSuspended?this.getValue():s(this.getValue(),this.__precision),j(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}(),q=function(e){function t(e,n,o,i,r){function s(e){e.preventDefault();var t=_.__background.getBoundingClientRect();return _.setValue(a(e.clientX,t.left,t.right,_.__min,_.__max)),!1}function l(){X.unbind(window,"mousemove",s),X.unbind(window,"mouseup",l),_.__onFinishChange&&_.__onFinishChange.call(_,_.getValue())}function d(e){var t=e.touches[0].clientX,n=_.__background.getBoundingClientRect();_.setValue(a(t,n.left,n.right,_.__min,_.__max))}function c(){X.unbind(window,"touchmove",d),X.unbind(window,"touchend",c),_.__onFinishChange&&_.__onFinishChange.call(_,_.getValue())}F(this,t);var u=V(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n,{min:o,max:i,step:r})),_=u;return u.__background=document.createElement("div"),u.__foreground=document.createElement("div"),X.bind(u.__background,"mousedown",function(e){document.activeElement.blur(),X.bind(window,"mousemove",s),X.bind(window,"mouseup",l),s(e)}),X.bind(u.__background,"touchstart",function(e){1===e.touches.length&&(X.bind(window,"touchmove",d),X.bind(window,"touchend",c),d(e))}),X.addClass(u.__background,"slider"),X.addClass(u.__foreground,"slider-fg"),u.updateDisplay(),u.__background.appendChild(u.__foreground),u.domElement.appendChild(u.__background),u}return D(t,W),P(t,[{key:"updateDisplay",value:function(){var e=(this.getValue()-this.__min)/(this.__max-this.__min);return this.__foreground.style.width=100*e+"%",j(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}(),Z=function(e){function t(e,n,o){F(this,t);var i=V(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n)),r=i;return i.__button=document.createElement("div"),i.__button.innerHTML=void 0===o?"Fire":o,X.bind(i.__button,"click",function(e){return e.preventDefault(),r.fire(),!1}),X.addClass(i.__button,"button"),i.domElement.appendChild(i.__button),i}return D(t,z),P(t,[{key:"fire",value:function(){this.__onChange&&this.__onChange.call(this),this.getValue().call(this.object),this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue())}}]),t}(),$=function(e){function t(e,n){function o(e){u(e),X.bind(window,"mousemove",u),X.bind(window,"touchmove",u),X.bind(window,"mouseup",r),X.bind(window,"touchend",r)}function i(e){_(e),X.bind(window,"mousemove",_),X.bind(window,"touchmove",_),X.bind(window,"mouseup",s),X.bind(window,"touchend",s)}function r(){X.unbind(window,"mousemove",u),X.unbind(window,"touchmove",u),X.unbind(window,"mouseup",r),X.unbind(window,"touchend",r),c()}function s(){X.unbind(window,"mousemove",_),X.unbind(window,"touchmove",_),X.unbind(window,"mouseup",s),X.unbind(window,"touchend",s),c()}function a(){var e=R(this.value);!1!==e?(p.__color.__state=e,p.setValue(p.__color.toOriginal())):this.value=p.__color.toString()}function c(){p.__onFinishChange&&p.__onFinishChange.call(p,p.__color.toOriginal())}function u(e){-1===e.type.indexOf("touch")&&e.preventDefault();var t=p.__saturation_field.getBoundingClientRect(),n=e.touches&&e.touches[0]||e,o=n.clientX,i=n.clientY,r=(o-t.left)/(t.right-t.left),s=1-(i-t.top)/(t.bottom-t.top);return s>1?s=1:s<0&&(s=0),r>1?r=1:r<0&&(r=0),p.__color.v=s,p.__color.s=r,p.setValue(p.__color.toOriginal()),!1}function _(e){-1===e.type.indexOf("touch")&&e.preventDefault();var t=p.__hue_field.getBoundingClientRect(),n=1-((e.touches&&e.touches[0]||e).clientY-t.top)/(t.bottom-t.top);return n>1?n=1:n<0&&(n=0),p.__color.h=360*n,p.setValue(p.__color.toOriginal()),!1}F(this,t);var h=V(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n));h.__color=new I(h.getValue()),h.__temp=new I(0);var p=h;h.domElement=document.createElement("div"),X.makeSelectable(h.domElement,!1),h.__selector=document.createElement("div"),h.__selector.className="selector",h.__saturation_field=document.createElement("div"),h.__saturation_field.className="saturation-field",h.__field_knob=document.createElement("div"),h.__field_knob.className="field-knob",h.__field_knob_border="2px solid ",h.__hue_knob=document.createElement("div"),h.__hue_knob.className="hue-knob",h.__hue_field=document.createElement("div"),h.__hue_field.className="hue-field",h.__input=document.createElement("input"),h.__input.type="text",h.__input_textShadow="0 1px 1px ",X.bind(h.__input,"keydown",function(e){13===e.keyCode&&a.call(this)}),X.bind(h.__input,"blur",a),X.bind(h.__selector,"mousedown",function(){X.addClass(this,"drag").bind(window,"mouseup",function(){X.removeClass(p.__selector,"drag")})}),X.bind(h.__selector,"touchstart",function(){X.addClass(this,"drag").bind(window,"touchend",function(){X.removeClass(p.__selector,"drag")})});var f=document.createElement("div");return S.extend(h.__selector.style,{width:"122px",height:"102px",padding:"3px",backgroundColor:"#222",boxShadow:"0px 1px 3px rgba(0,0,0,0.3)"}),S.extend(h.__field_knob.style,{position:"absolute",width:"12px",height:"12px",border:h.__field_knob_border+(h.__color.v<.5?"#fff":"#000"),boxShadow:"0px 1px 3px rgba(0,0,0,0.5)",borderRadius:"12px",zIndex:1}),S.extend(h.__hue_knob.style,{position:"absolute",width:"15px",height:"2px",borderRight:"4px solid #fff",zIndex:1}),S.extend(h.__saturation_field.style,{width:"100px",height:"100px",border:"1px solid #555",marginRight:"3px",display:"inline-block",cursor:"pointer"}),S.extend(f.style,{width:"100%",height:"100%",background:"none"}),l(f,"top","rgba(0,0,0,0)","#000"),S.extend(h.__hue_field.style,{width:"15px",height:"100px",border:"1px solid #555",cursor:"ns-resize",position:"absolute",top:"3px",right:"3px"}),d(h.__hue_field),S.extend(h.__input.style,{outline:"none",textAlign:"center",color:"#fff",border:0,fontWeight:"bold",textShadow:h.__input_textShadow+"rgba(0,0,0,0.7)"}),X.bind(h.__saturation_field,"mousedown",o),X.bind(h.__saturation_field,"touchstart",o),X.bind(h.__field_knob,"mousedown",o),X.bind(h.__field_knob,"touchstart",o),X.bind(h.__hue_field,"mousedown",i),X.bind(h.__hue_field,"touchstart",i),h.__saturation_field.appendChild(f),h.__selector.appendChild(h.__field_knob),h.__selector.appendChild(h.__saturation_field),h.__selector.appendChild(h.__hue_field),h.__hue_field.appendChild(h.__hue_knob),h.domElement.appendChild(h.__input),h.domElement.appendChild(h.__selector),h.updateDisplay(),h}return D(t,z),P(t,[{key:"updateDisplay",value:function(){var e=R(this.getValue());if(!1!==e){var t=!1;S.each(I.COMPONENTS,function(n){if(!S.isUndefined(e[n])&&!S.isUndefined(this.__color.__state[n])&&e[n]!==this.__color.__state[n])return t=!0,{}},this),t&&S.extend(this.__color.__state,e)}S.extend(this.__temp.__state,this.__color.__state),this.__temp.a=1;var n=this.__color.v<.5||this.__color.s>.5?255:0,o=255-n;S.extend(this.__field_knob.style,{marginLeft:100*this.__color.s-7+"px",marginTop:100*(1-this.__color.v)-7+"px",backgroundColor:this.__temp.toHexString(),border:this.__field_knob_border+"rgb("+n+","+n+","+n+")"}),this.__hue_knob.style.marginTop=100*(1-this.__color.h/360)+"px",this.__temp.s=1,this.__temp.v=1,l(this.__saturation_field,"left","#fff",this.__temp.toHexString()),this.__input.value=this.__color.toString(),S.extend(this.__input.style,{backgroundColor:this.__color.toHexString(),color:"rgb("+n+","+n+","+n+")",textShadow:this.__input_textShadow+"rgba("+o+","+o+","+o+",.7)"})}}]),t}(),ee=["-moz-","-o-","-webkit-","-ms-",""],te={load:function(e,t){var n=t||document,o=n.createElement("link");o.type="text/css",o.rel="stylesheet",o.href=e,n.getElementsByTagName("head")[0].appendChild(o)},inject:function(e,t){var n=t||document,o=document.createElement("style");o.type="text/css",o.innerHTML=e;var i=n.getElementsByTagName("head")[0];try{i.appendChild(o)}catch(e){}}},ne=function(e,t){var n=e[t];return S.isArray(arguments[2])||S.isObject(arguments[2])?new Y(e,t,arguments[2]):S.isNumber(n)?S.isNumber(arguments[2])&&S.isNumber(arguments[3])?S.isNumber(arguments[4])?new q(e,t,arguments[2],arguments[3],arguments[4]):new q(e,t,arguments[2],arguments[3]):S.isNumber(arguments[4])?new Q(e,t,{min:arguments[2],max:arguments[3],step:arguments[4]}):new Q(e,t,{min:arguments[2],max:arguments[3]}):S.isString(n)?new J(e,t):S.isFunction(n)?new Z(e,t,""):S.isBoolean(n)?new K(e,t):null},oe=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){setTimeout(e,1e3/60)},ie=function(){function e(){F(this,e),this.backgroundElement=document.createElement("div"),S.extend(this.backgroundElement.style,{backgroundColor:"rgba(0,0,0,0.8)",top:0,left:0,display:"none",zIndex:"1000",opacity:0,WebkitTransition:"opacity 0.2s linear",transition:"opacity 0.2s linear"}),X.makeFullscreen(this.backgroundElement),this.backgroundElement.style.position="fixed",this.domElement=document.createElement("div"),S.extend(this.domElement.style,{position:"fixed",display:"none",zIndex:"1001",opacity:0,WebkitTransition:"-webkit-transform 0.2s ease-out, opacity 0.2s linear",transition:"transform 0.2s ease-out, opacity 0.2s linear"}),document.body.appendChild(this.backgroundElement),document.body.appendChild(this.domElement);var t=this;X.bind(this.backgroundElement,"click",function(){t.hide()})}return P(e,[{key:"show",value:function(){var e=this;this.backgroundElement.style.display="block",this.domElement.style.display="block",this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)",this.layout(),S.defer(function(){e.backgroundElement.style.opacity=1,e.domElement.style.opacity=1,e.domElement.style.webkitTransform="scale(1)"})}},{key:"hide",value:function(){var e=this,t=function t(){e.domElement.style.display="none",e.backgroundElement.style.display="none",X.unbind(e.domElement,"webkitTransitionEnd",t),X.unbind(e.domElement,"transitionend",t),X.unbind(e.domElement,"oTransitionEnd",t)};X.bind(this.domElement,"webkitTransitionEnd",t),X.bind(this.domElement,"transitionend",t),X.bind(this.domElement,"oTransitionEnd",t),this.backgroundElement.style.opacity=0,this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)"}},{key:"layout",value:function(){this.domElement.style.left=window.innerWidth/2-X.getWidth(this.domElement)/2+"px",this.domElement.style.top=window.innerHeight/2-X.getHeight(this.domElement)/2+"px"}}]),e}(),re=function(e){if(e&&"undefined"!=typeof window){var t=document.createElement("style");return t.setAttribute("type","text/css"),t.innerHTML=e,document.head.appendChild(t),e}}(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n");te.inject(re);var se="Default",ae=function(){try{return!!window.localStorage}catch(e){return!1}}(),le=void 0,de=!0,ce=void 0,ue=!1,_e=[],he=function e(t){var n=this,o=t||{};this.domElement=document.createElement("div"),this.__ul=document.createElement("ul"),this.domElement.appendChild(this.__ul),X.addClass(this.domElement,"dg"),this.__folders={},this.__controllers=[],this.__rememberedObjects=[],this.__rememberedObjectIndecesToControllers=[],this.__listening=[],o=S.defaults(o,{closeOnTop:!1,autoPlace:!0,width:e.DEFAULT_WIDTH}),o=S.defaults(o,{resizable:o.autoPlace,hideable:o.autoPlace}),S.isUndefined(o.load)?o.load={preset:se}:o.preset&&(o.load.preset=o.preset),S.isUndefined(o.parent)&&o.hideable&&_e.push(this),o.resizable=S.isUndefined(o.parent)&&o.resizable,o.autoPlace&&S.isUndefined(o.scrollable)&&(o.scrollable=!0);var i=ae&&"true"===localStorage.getItem(m(this,"isLocal")),r=void 0,s=void 0;if(Object.defineProperties(this,{parent:{get:function(){return o.parent}},scrollable:{get:function(){return o.scrollable}},autoPlace:{get:function(){return o.autoPlace}},closeOnTop:{get:function(){return o.closeOnTop}},preset:{get:function(){return n.parent?n.getRoot().preset:o.load.preset},set:function(e){n.parent?n.getRoot().preset=e:o.load.preset=e,E(this),n.revert()}},width:{get:function(){return o.width},set:function(e){o.width=e,w(n,e)}},name:{get:function(){return o.name},set:function(e){o.name=e,s&&(s.innerHTML=o.name)}},closed:{get:function(){return o.closed},set:function(t){o.closed=t,o.closed?X.addClass(n.__ul,e.CLASS_CLOSED):X.removeClass(n.__ul,e.CLASS_CLOSED),this.onResize(),n.__closeButton&&(n.__closeButton.innerHTML=t?e.TEXT_OPEN:e.TEXT_CLOSED)}},load:{get:function(){return o.load}},useLocalStorage:{get:function(){return i},set:function(e){ae&&(i=e,e?X.bind(window,"unload",r):X.unbind(window,"unload",r),localStorage.setItem(m(n,"isLocal"),e))}}}),S.isUndefined(o.parent)){if(this.closed=o.closed||!1,X.addClass(this.domElement,e.CLASS_MAIN),X.makeSelectable(this.domElement,!1),ae&&i){n.useLocalStorage=!0;var a=localStorage.getItem(m(this,"gui"));a&&(o.load=JSON.parse(a))}this.__closeButton=document.createElement("div"),this.__closeButton.innerHTML=e.TEXT_CLOSED,X.addClass(this.__closeButton,e.CLASS_CLOSE_BUTTON),o.closeOnTop?(X.addClass(this.__closeButton,e.CLASS_CLOSE_TOP),this.domElement.insertBefore(this.__closeButton,this.domElement.childNodes[0])):(X.addClass(this.__closeButton,e.CLASS_CLOSE_BOTTOM),this.domElement.appendChild(this.__closeButton)),X.bind(this.__closeButton,"click",function(){n.closed=!n.closed})}else{void 0===o.closed&&(o.closed=!0);var l=document.createTextNode(o.name);X.addClass(l,"controller-name"),s=c(n,l);X.addClass(this.__ul,e.CLASS_CLOSED),X.addClass(s,"title"),X.bind(s,"click",function(e){return e.preventDefault(),n.closed=!n.closed,!1}),o.closed||(this.closed=!1)}o.autoPlace&&(S.isUndefined(o.parent)&&(de&&(ce=document.createElement("div"),X.addClass(ce,"dg"),X.addClass(ce,e.CLASS_AUTO_PLACE_CONTAINER),document.body.appendChild(ce),de=!1),ce.appendChild(this.domElement),X.addClass(this.domElement,e.CLASS_AUTO_PLACE)),this.parent||w(n,o.width)),this.__resizeHandler=function(){n.onResizeDebounced()},X.bind(window,"resize",this.__resizeHandler),X.bind(this.__ul,"webkitTransitionEnd",this.__resizeHandler),X.bind(this.__ul,"transitionend",this.__resizeHandler),X.bind(this.__ul,"oTransitionEnd",this.__resizeHandler),this.onResize(),o.resizable&&y(this),r=function(){ae&&"true"===localStorage.getItem(m(n,"isLocal"))&&localStorage.setItem(m(n,"gui"),JSON.stringify(n.getSaveObject()))},this.saveToLocalStorageIfPossible=r,o.parent||function(){var e=n.getRoot();e.width+=1,S.defer(function(){e.width-=1})}()};he.toggleHide=function(){ue=!ue,S.each(_e,function(e){e.domElement.style.display=ue?"none":""})},he.CLASS_AUTO_PLACE="a",he.CLASS_AUTO_PLACE_CONTAINER="ac",he.CLASS_MAIN="main",he.CLASS_CONTROLLER_ROW="cr",he.CLASS_TOO_TALL="taller-than-window",he.CLASS_CLOSED="closed",he.CLASS_CLOSE_BUTTON="close-button",he.CLASS_CLOSE_TOP="close-top",he.CLASS_CLOSE_BOTTOM="close-bottom",he.CLASS_DRAG="drag",he.DEFAULT_WIDTH=245,he.TEXT_CLOSED="Close Controls",he.TEXT_OPEN="Open Controls",he._keydownHandler=function(e){"text"===document.activeElement.type||72!==e.which&&72!==e.keyCode||he.toggleHide()},X.bind(window,"keydown",he._keydownHandler,!1),S.extend(he.prototype,{add:function(e,t){return f(this,e,t,{factoryArgs:Array.prototype.slice.call(arguments,2)})},addColor:function(e,t){return f(this,e,t,{color:!0})},remove:function(e){this.__ul.removeChild(e.__li),this.__controllers.splice(this.__controllers.indexOf(e),1);var t=this;S.defer(function(){t.onResize()})},destroy:function(){if(this.parent)throw new Error("Only the root GUI should be removed with .destroy(). For subfolders, use gui.removeFolder(folder) instead.");this.autoPlace&&ce.removeChild(this.domElement);var e=this;S.each(this.__folders,function(t){e.removeFolder(t)}),X.unbind(window,"keydown",he._keydownHandler,!1),u(this)},addFolder:function(e){if(void 0!==this.__folders[e])throw new Error('You already have a folder in this GUI by the name "'+e+'"');var t={name:e,parent:this};t.autoPlace=this.autoPlace,this.load&&this.load.folders&&this.load.folders[e]&&(t.closed=this.load.folders[e].closed,t.load=this.load.folders[e]);var n=new he(t);this.__folders[e]=n;var o=c(this,n.domElement);return X.addClass(o,"folder"),n},removeFolder:function(e){this.__ul.removeChild(e.domElement.parentElement),delete this.__folders[e.name],this.load&&this.load.folders&&this.load.folders[e.name]&&delete this.load.folders[e.name],u(e);var t=this;S.each(e.__folders,function(t){e.removeFolder(t)}),S.defer(function(){t.onResize()})},open:function(){this.closed=!1},close:function(){this.closed=!0},hide:function(){this.domElement.style.display="none"},show:function(){this.domElement.style.display=""},onResize:function(){var e=this.getRoot();if(e.scrollable){var t=X.getOffset(e.__ul).top,n=0;S.each(e.__ul.childNodes,function(t){e.autoPlace&&t===e.__save_row||(n+=X.getHeight(t))}),window.innerHeight-t-20GUI\'s constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI\'s constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n'),this.parent)throw new Error("You can only call remember on a top level GUI.");var e=this;S.each(Array.prototype.slice.call(arguments),function(t){0===e.__rememberedObjects.length&&v(e),-1===e.__rememberedObjects.indexOf(t)&&e.__rememberedObjects.push(t)}),this.autoPlace&&w(this,this.width)},getRoot:function(){for(var e=this;e.parent;)e=e.parent;return e},getSaveObject:function(){var e=this.load;return e.closed=this.closed,this.__rememberedObjects.length>0&&(e.preset=this.preset,e.remembered||(e.remembered={}),e.remembered[this.preset]=x(this)),e.folders={},S.each(this.__folders,function(t,n){e.folders[n]=t.getSaveObject()}),e},save:function(){this.load.remembered||(this.load.remembered={}),this.load.remembered[this.preset]=x(this),_(this,!1),this.saveToLocalStorageIfPossible()},saveAs:function(e){this.load.remembered||(this.load.remembered={},this.load.remembered[se]=x(this,!0)),this.load.remembered[e]=x(this),this.preset=e,g(this,e,!0),this.saveToLocalStorageIfPossible()},revert:function(e){S.each(this.__controllers,function(t){this.getRoot().load.remembered?p(e||this.getRoot(),t):t.setValue(t.initialValue),t.__onFinishChange&&t.__onFinishChange.call(t,t.getValue())},this),S.each(this.__folders,function(e){e.revert(e)}),e||_(this.getRoot(),!1)},listen:function(e){var t=0===this.__listening.length;this.__listening.push(e),t&&C(this.__listening)},updateDisplay:function(){S.each(this.__controllers,function(e){e.updateDisplay()}),S.each(this.__folders,function(e){e.updateDisplay()})}});var pe={Color:I,math:N,interpret:R},fe={Controller:z,BooleanController:K,OptionController:Y,StringController:J,NumberController:W,NumberControllerBox:Q,NumberControllerSlider:q,FunctionController:Z,ColorController:$},me={dom:X},ge={GUI:he},be=he,ve={color:pe,controllers:fe,dom:me,gui:ge,GUI:be};e.color=pe,e.controllers=fe,e.dom=me,e.gui=ge,e.GUI=be,e.default=ve,Object.defineProperty(e,"__esModule",{value:!0})}); diff --git a/build/dat.gui.module.js b/build/dat.gui.module.js new file mode 100644 index 000000000..b067e9b8e --- /dev/null +++ b/build/dat.gui.module.js @@ -0,0 +1,2523 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +function ___$insertStyle(css) { + if (!css) { + return; + } + if (typeof window === 'undefined') { + return; + } + + var style = document.createElement('style'); + + style.setAttribute('type', 'text/css'); + style.innerHTML = css; + document.head.appendChild(style); + + return css; +} + +function colorToString (color, forceCSSHex) { + var colorFormat = color.__state.conversionName.toString(); + var r = Math.round(color.r); + var g = Math.round(color.g); + var b = Math.round(color.b); + var a = color.a; + var h = Math.round(color.h); + var s = color.s.toFixed(1); + var v = color.v.toFixed(1); + if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') { + var str = color.hex.toString(16); + while (str.length < 6) { + str = '0' + str; + } + return '#' + str; + } else if (colorFormat === 'CSS_RGB') { + return 'rgb(' + r + ',' + g + ',' + b + ')'; + } else if (colorFormat === 'CSS_RGBA') { + return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; + } else if (colorFormat === 'HEX') { + return '0x' + color.hex.toString(16); + } else if (colorFormat === 'RGB_ARRAY') { + return '[' + r + ',' + g + ',' + b + ']'; + } else if (colorFormat === 'RGBA_ARRAY') { + return '[' + r + ',' + g + ',' + b + ',' + a + ']'; + } else if (colorFormat === 'RGB_OBJ') { + return '{r:' + r + ',g:' + g + ',b:' + b + '}'; + } else if (colorFormat === 'RGBA_OBJ') { + return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}'; + } else if (colorFormat === 'HSV_OBJ') { + return '{h:' + h + ',s:' + s + ',v:' + v + '}'; + } else if (colorFormat === 'HSVA_OBJ') { + return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}'; + } + return 'unknown format'; +} + +var ARR_EACH = Array.prototype.forEach; +var ARR_SLICE = Array.prototype.slice; +var Common = { + BREAK: {}, + extend: function extend(target) { + this.each(ARR_SLICE.call(arguments, 1), function (obj) { + var keys = this.isObject(obj) ? Object.keys(obj) : []; + keys.forEach(function (key) { + if (!this.isUndefined(obj[key])) { + target[key] = obj[key]; + } + }.bind(this)); + }, this); + return target; + }, + defaults: function defaults(target) { + this.each(ARR_SLICE.call(arguments, 1), function (obj) { + var keys = this.isObject(obj) ? Object.keys(obj) : []; + keys.forEach(function (key) { + if (this.isUndefined(target[key])) { + target[key] = obj[key]; + } + }.bind(this)); + }, this); + return target; + }, + compose: function compose() { + var toCall = ARR_SLICE.call(arguments); + return function () { + var args = ARR_SLICE.call(arguments); + for (var i = toCall.length - 1; i >= 0; i--) { + args = [toCall[i].apply(this, args)]; + } + return args[0]; + }; + }, + each: function each(obj, itr, scope) { + if (!obj) { + return; + } + if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) { + obj.forEach(itr, scope); + } else if (obj.length === obj.length + 0) { + var key = void 0; + var l = void 0; + for (key = 0, l = obj.length; key < l; key++) { + if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) { + return; + } + } + } else { + for (var _key in obj) { + if (itr.call(scope, obj[_key], _key) === this.BREAK) { + return; + } + } + } + }, + defer: function defer(fnc) { + setTimeout(fnc, 0); + }, + debounce: function debounce(func, threshold, callImmediately) { + var timeout = void 0; + return function () { + var obj = this; + var args = arguments; + function delayed() { + timeout = null; + if (!callImmediately) func.apply(obj, args); + } + var callNow = callImmediately || !timeout; + clearTimeout(timeout); + timeout = setTimeout(delayed, threshold); + if (callNow) { + func.apply(obj, args); + } + }; + }, + toArray: function toArray(obj) { + if (obj.toArray) return obj.toArray(); + return ARR_SLICE.call(obj); + }, + isUndefined: function isUndefined(obj) { + return obj === undefined; + }, + isNull: function isNull(obj) { + return obj === null; + }, + isNaN: function (_isNaN) { + function isNaN(_x) { + return _isNaN.apply(this, arguments); + } + isNaN.toString = function () { + return _isNaN.toString(); + }; + return isNaN; + }(function (obj) { + return isNaN(obj); + }), + isArray: Array.isArray || function (obj) { + return obj.constructor === Array; + }, + isObject: function isObject(obj) { + return obj === Object(obj); + }, + isNumber: function isNumber(obj) { + return obj === obj + 0; + }, + isString: function isString(obj) { + return obj === obj + ''; + }, + isBoolean: function isBoolean(obj) { + return obj === false || obj === true; + }, + isFunction: function isFunction(obj) { + return Object.prototype.toString.call(obj) === '[object Function]'; + } +}; + +var INTERPRETATIONS = [ +{ + litmus: Common.isString, + conversions: { + THREE_CHAR_HEX: { + read: function read(original) { + var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); + if (test === null) { + return false; + } + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0) + }; + }, + write: colorToString + }, + SIX_CHAR_HEX: { + read: function read(original) { + var test = original.match(/^#([A-F0-9]{6})$/i); + if (test === null) { + return false; + } + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString(), 0) + }; + }, + write: colorToString + }, + CSS_RGB: { + read: function read(original) { + var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) { + return false; + } + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]) + }; + }, + write: colorToString + }, + CSS_RGBA: { + read: function read(original) { + var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) { + return false; + } + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]), + a: parseFloat(test[4]) + }; + }, + write: colorToString + } + } +}, +{ + litmus: Common.isNumber, + conversions: { + HEX: { + read: function read(original) { + return { + space: 'HEX', + hex: original, + conversionName: 'HEX' + }; + }, + write: function write(color) { + return color.hex; + } + } + } +}, +{ + litmus: Common.isArray, + conversions: { + RGB_ARRAY: { + read: function read(original) { + if (original.length !== 3) { + return false; + } + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2] + }; + }, + write: function write(color) { + return [color.r, color.g, color.b]; + } + }, + RGBA_ARRAY: { + read: function read(original) { + if (original.length !== 4) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2], + a: original[3] + }; + }, + write: function write(color) { + return [color.r, color.g, color.b, color.a]; + } + } + } +}, +{ + litmus: Common.isObject, + conversions: { + RGBA_OBJ: { + read: function read(original) { + if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b, + a: original.a + }; + } + return false; + }, + write: function write(color) { + return { + r: color.r, + g: color.g, + b: color.b, + a: color.a + }; + } + }, + RGB_OBJ: { + read: function read(original) { + if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b + }; + } + return false; + }, + write: function write(color) { + return { + r: color.r, + g: color.g, + b: color.b + }; + } + }, + HSVA_OBJ: { + read: function read(original) { + if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v, + a: original.a + }; + } + return false; + }, + write: function write(color) { + return { + h: color.h, + s: color.s, + v: color.v, + a: color.a + }; + } + }, + HSV_OBJ: { + read: function read(original) { + if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v + }; + } + return false; + }, + write: function write(color) { + return { + h: color.h, + s: color.s, + v: color.v + }; + } + } + } +}]; +var result = void 0; +var toReturn = void 0; +var interpret = function interpret() { + toReturn = false; + var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0]; + Common.each(INTERPRETATIONS, function (family) { + if (family.litmus(original)) { + Common.each(family.conversions, function (conversion, conversionName) { + result = conversion.read(original); + if (toReturn === false && result !== false) { + toReturn = result; + result.conversionName = conversionName; + result.conversion = conversion; + return Common.BREAK; + } + }); + return Common.BREAK; + } + }); + return toReturn; +}; + +var tmpComponent = void 0; +var ColorMath = { + hsv_to_rgb: function hsv_to_rgb(h, s, v) { + var hi = Math.floor(h / 60) % 6; + var f = h / 60 - Math.floor(h / 60); + var p = v * (1.0 - s); + var q = v * (1.0 - f * s); + var t = v * (1.0 - (1.0 - f) * s); + var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi]; + return { + r: c[0] * 255, + g: c[1] * 255, + b: c[2] * 255 + }; + }, + rgb_to_hsv: function rgb_to_hsv(r, g, b) { + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h = void 0; + var s = void 0; + if (max !== 0) { + s = delta / max; + } else { + return { + h: NaN, + s: 0, + v: 0 + }; + } + if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else { + h = 4 + (r - g) / delta; + } + h /= 6; + if (h < 0) { + h += 1; + } + return { + h: h * 360, + s: s, + v: max / 255 + }; + }, + rgb_to_hex: function rgb_to_hex(r, g, b) { + var hex = this.hex_with_component(0, 2, r); + hex = this.hex_with_component(hex, 1, g); + hex = this.hex_with_component(hex, 0, b); + return hex; + }, + component_from_hex: function component_from_hex(hex, componentIndex) { + return hex >> componentIndex * 8 & 0xFF; + }, + hex_with_component: function hex_with_component(hex, componentIndex, value) { + return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent); + } +}; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; +}; + + + + + + + + + + + +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + + + + + + + +var get = function get(object, property, receiver) { + if (object === null) object = Function.prototype; + var desc = Object.getOwnPropertyDescriptor(object, property); + + if (desc === undefined) { + var parent = Object.getPrototypeOf(object); + + if (parent === null) { + return undefined; + } else { + return get(parent, property, receiver); + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get; + + if (getter === undefined) { + return undefined; + } + + return getter.call(receiver); + } +}; + +var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +}; + + + + + + + + + + + +var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; +}; + +var Color = function () { + function Color() { + classCallCheck(this, Color); + this.__state = interpret.apply(this, arguments); + if (this.__state === false) { + throw new Error('Failed to interpret color arguments'); + } + this.__state.a = this.__state.a || 1; + } + createClass(Color, [{ + key: 'toString', + value: function toString() { + return colorToString(this); + } + }, { + key: 'toHexString', + value: function toHexString() { + return colorToString(this, true); + } + }, { + key: 'toOriginal', + value: function toOriginal() { + return this.__state.conversion.write(this); + } + }]); + return Color; +}(); +function defineRGBComponent(target, component, componentHexIndex) { + Object.defineProperty(target, component, { + get: function get$$1() { + if (this.__state.space === 'RGB') { + return this.__state[component]; + } + Color.recalculateRGB(this, component, componentHexIndex); + return this.__state[component]; + }, + set: function set$$1(v) { + if (this.__state.space !== 'RGB') { + Color.recalculateRGB(this, component, componentHexIndex); + this.__state.space = 'RGB'; + } + this.__state[component] = v; + } + }); +} +function defineHSVComponent(target, component) { + Object.defineProperty(target, component, { + get: function get$$1() { + if (this.__state.space === 'HSV') { + return this.__state[component]; + } + Color.recalculateHSV(this); + return this.__state[component]; + }, + set: function set$$1(v) { + if (this.__state.space !== 'HSV') { + Color.recalculateHSV(this); + this.__state.space = 'HSV'; + } + this.__state[component] = v; + } + }); +} +Color.recalculateRGB = function (color, component, componentHexIndex) { + if (color.__state.space === 'HEX') { + color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex); + } else if (color.__state.space === 'HSV') { + Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); + } else { + throw new Error('Corrupted color state'); + } +}; +Color.recalculateHSV = function (color) { + var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b); + Common.extend(color.__state, { + s: result.s, + v: result.v + }); + if (!Common.isNaN(result.h)) { + color.__state.h = result.h; + } else if (Common.isUndefined(color.__state.h)) { + color.__state.h = 0; + } +}; +Color.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a']; +defineRGBComponent(Color.prototype, 'r', 2); +defineRGBComponent(Color.prototype, 'g', 1); +defineRGBComponent(Color.prototype, 'b', 0); +defineHSVComponent(Color.prototype, 'h'); +defineHSVComponent(Color.prototype, 's'); +defineHSVComponent(Color.prototype, 'v'); +Object.defineProperty(Color.prototype, 'a', { + get: function get$$1() { + return this.__state.a; + }, + set: function set$$1(v) { + this.__state.a = v; + } +}); +Object.defineProperty(Color.prototype, 'hex', { + get: function get$$1() { + if (!this.__state.space !== 'HEX') { + this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b); + } + return this.__state.hex; + }, + set: function set$$1(v) { + this.__state.space = 'HEX'; + this.__state.hex = v; + } +}); + +var Controller = function () { + function Controller(object, property) { + classCallCheck(this, Controller); + this.initialValue = object[property]; + this.domElement = document.createElement('div'); + this.object = object; + this.property = property; + this.__onChange = undefined; + this.__onFinishChange = undefined; + } + createClass(Controller, [{ + key: 'onChange', + value: function onChange(fnc) { + this.__onChange = fnc; + return this; + } + }, { + key: 'onFinishChange', + value: function onFinishChange(fnc) { + this.__onFinishChange = fnc; + return this; + } + }, { + key: 'setValue', + value: function setValue(newValue) { + this.object[this.property] = newValue; + if (this.__onChange) { + this.__onChange.call(this, newValue); + } + this.updateDisplay(); + return this; + } + }, { + key: 'getValue', + value: function getValue() { + return this.object[this.property]; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + return this; + } + }, { + key: 'isModified', + value: function isModified() { + return this.initialValue !== this.getValue(); + } + }]); + return Controller; +}(); + +var EVENT_MAP = { + HTMLEvents: ['change'], + MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'], + KeyboardEvents: ['keydown'] +}; +var EVENT_MAP_INV = {}; +Common.each(EVENT_MAP, function (v, k) { + Common.each(v, function (e) { + EVENT_MAP_INV[e] = k; + }); +}); +var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; +function cssValueToPixels(val) { + if (val === '0' || Common.isUndefined(val)) { + return 0; + } + var match = val.match(CSS_VALUE_PIXELS); + if (!Common.isNull(match)) { + return parseFloat(match[1]); + } + return 0; +} +var dom = { + makeSelectable: function makeSelectable(elem, selectable) { + if (elem === undefined || elem.style === undefined) return; + elem.onselectstart = selectable ? function () { + return false; + } : function () {}; + elem.style.MozUserSelect = selectable ? 'auto' : 'none'; + elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; + elem.unselectable = selectable ? 'on' : 'off'; + }, + makeFullscreen: function makeFullscreen(elem, hor, vert) { + var vertical = vert; + var horizontal = hor; + if (Common.isUndefined(horizontal)) { + horizontal = true; + } + if (Common.isUndefined(vertical)) { + vertical = true; + } + elem.style.position = 'absolute'; + if (horizontal) { + elem.style.left = 0; + elem.style.right = 0; + } + if (vertical) { + elem.style.top = 0; + elem.style.bottom = 0; + } + }, + fakeEvent: function fakeEvent(elem, eventType, pars, aux) { + var params = pars || {}; + var className = EVENT_MAP_INV[eventType]; + if (!className) { + throw new Error('Event type ' + eventType + ' not supported.'); + } + var evt = document.createEvent(className); + switch (className) { + case 'MouseEvents': + { + var clientX = params.x || params.clientX || 0; + var clientY = params.y || params.clientY || 0; + evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0, + 0, + clientX, + clientY, + false, false, false, false, 0, null); + break; + } + case 'KeyboardEvents': + { + var init = evt.initKeyboardEvent || evt.initKeyEvent; + Common.defaults(params, { + cancelable: true, + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false, + keyCode: undefined, + charCode: undefined + }); + init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode); + break; + } + default: + { + evt.initEvent(eventType, params.bubbles || false, params.cancelable || true); + break; + } + } + Common.defaults(evt, aux); + elem.dispatchEvent(evt); + }, + bind: function bind(elem, event, func, newBool) { + var bool = newBool || false; + if (elem.addEventListener) { + elem.addEventListener(event, func, bool); + } else if (elem.attachEvent) { + elem.attachEvent('on' + event, func); + } + return dom; + }, + unbind: function unbind(elem, event, func, newBool) { + var bool = newBool || false; + if (elem.removeEventListener) { + elem.removeEventListener(event, func, bool); + } else if (elem.detachEvent) { + elem.detachEvent('on' + event, func); + } + return dom; + }, + addClass: function addClass(elem, className) { + if (elem.className === undefined) { + elem.className = className; + } else if (elem.className !== className) { + var classes = elem.className.split(/ +/); + if (classes.indexOf(className) === -1) { + classes.push(className); + elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); + } + } + return dom; + }, + removeClass: function removeClass(elem, className) { + if (className) { + if (elem.className === className) { + elem.removeAttribute('class'); + } else { + var classes = elem.className.split(/ +/); + var index = classes.indexOf(className); + if (index !== -1) { + classes.splice(index, 1); + elem.className = classes.join(' '); + } + } + } else { + elem.className = undefined; + } + return dom; + }, + hasClass: function hasClass(elem, className) { + return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; + }, + getWidth: function getWidth(elem) { + var style = getComputedStyle(elem); + return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width); + }, + getHeight: function getHeight(elem) { + var style = getComputedStyle(elem); + return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height); + }, + getOffset: function getOffset(el) { + var elem = el; + var offset = { left: 0, top: 0 }; + if (elem.offsetParent) { + do { + offset.left += elem.offsetLeft; + offset.top += elem.offsetTop; + elem = elem.offsetParent; + } while (elem); + } + return offset; + }, + isActive: function isActive(elem) { + return elem === document.activeElement && (elem.type || elem.href); + } +}; + +var BooleanController = function (_Controller) { + inherits(BooleanController, _Controller); + function BooleanController(object, property) { + classCallCheck(this, BooleanController); + var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property)); + var _this = _this2; + _this2.__prev = _this2.getValue(); + _this2.__checkbox = document.createElement('input'); + _this2.__checkbox.setAttribute('type', 'checkbox'); + function onChange() { + _this.setValue(!_this.__prev); + } + dom.bind(_this2.__checkbox, 'change', onChange, false); + _this2.domElement.appendChild(_this2.__checkbox); + _this2.updateDisplay(); + return _this2; + } + createClass(BooleanController, [{ + key: 'setValue', + value: function setValue(v) { + var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + this.__prev = this.getValue(); + return toReturn; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + if (this.getValue() === true) { + this.__checkbox.setAttribute('checked', 'checked'); + this.__checkbox.checked = true; + this.__prev = true; + } else { + this.__checkbox.checked = false; + this.__prev = false; + } + return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this); + } + }]); + return BooleanController; +}(Controller); + +var OptionController = function (_Controller) { + inherits(OptionController, _Controller); + function OptionController(object, property, opts) { + classCallCheck(this, OptionController); + var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property)); + var options = opts; + var _this = _this2; + _this2.__select = document.createElement('select'); + if (Common.isArray(options)) { + var map = {}; + Common.each(options, function (element) { + map[element] = element; + }); + options = map; + } + Common.each(options, function (value, key) { + var opt = document.createElement('option'); + opt.innerHTML = key; + opt.setAttribute('value', value); + _this.__select.appendChild(opt); + }); + _this2.updateDisplay(); + dom.bind(_this2.__select, 'change', function () { + var desiredValue = this.options[this.selectedIndex].value; + _this.setValue(desiredValue); + }); + _this2.domElement.appendChild(_this2.__select); + return _this2; + } + createClass(OptionController, [{ + key: 'setValue', + value: function setValue(v) { + var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + return toReturn; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + if (dom.isActive(this.__select)) return this; + this.__select.value = this.getValue(); + return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this); + } + }]); + return OptionController; +}(Controller); + +var StringController = function (_Controller) { + inherits(StringController, _Controller); + function StringController(object, property) { + classCallCheck(this, StringController); + var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property)); + var _this = _this2; + function onChange() { + _this.setValue(_this.__input.value); + } + function onBlur() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + _this2.__input = document.createElement('input'); + _this2.__input.setAttribute('type', 'text'); + dom.bind(_this2.__input, 'keyup', onChange); + dom.bind(_this2.__input, 'change', onChange); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + this.blur(); + } + }); + _this2.updateDisplay(); + _this2.domElement.appendChild(_this2.__input); + return _this2; + } + createClass(StringController, [{ + key: 'updateDisplay', + value: function updateDisplay() { + if (!dom.isActive(this.__input)) { + this.__input.value = this.getValue(); + } + return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this); + } + }]); + return StringController; +}(Controller); + +function numDecimals(x) { + var _x = x.toString(); + if (_x.indexOf('.') > -1) { + return _x.length - _x.indexOf('.') - 1; + } + return 0; +} +var NumberController = function (_Controller) { + inherits(NumberController, _Controller); + function NumberController(object, property, params) { + classCallCheck(this, NumberController); + var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property)); + var _params = params || {}; + _this.__min = _params.min; + _this.__max = _params.max; + _this.__step = _params.step; + if (Common.isUndefined(_this.__step)) { + if (_this.initialValue === 0) { + _this.__impliedStep = 1; + } else { + _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10; + } + } else { + _this.__impliedStep = _this.__step; + } + _this.__precision = numDecimals(_this.__impliedStep); + return _this; + } + createClass(NumberController, [{ + key: 'setValue', + value: function setValue(v) { + var _v = v; + if (this.__min !== undefined && _v < this.__min) { + _v = this.__min; + } else if (this.__max !== undefined && _v > this.__max) { + _v = this.__max; + } + if (this.__step !== undefined && _v % this.__step !== 0) { + _v = Math.round(_v / this.__step) * this.__step; + } + return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v); + } + }, { + key: 'min', + value: function min(minValue) { + this.__min = minValue; + return this; + } + }, { + key: 'max', + value: function max(maxValue) { + this.__max = maxValue; + return this; + } + }, { + key: 'step', + value: function step(stepValue) { + this.__step = stepValue; + this.__impliedStep = stepValue; + this.__precision = numDecimals(stepValue); + return this; + } + }]); + return NumberController; +}(Controller); + +function roundToDecimal(value, decimals) { + var tenTo = Math.pow(10, decimals); + return Math.round(value * tenTo) / tenTo; +} +var NumberControllerBox = function (_NumberController) { + inherits(NumberControllerBox, _NumberController); + function NumberControllerBox(object, property, params) { + classCallCheck(this, NumberControllerBox); + var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params)); + _this2.__truncationSuspended = false; + var _this = _this2; + var prevY = void 0; + function onChange() { + var attempted = parseFloat(_this.__input.value); + if (!Common.isNaN(attempted)) { + _this.setValue(attempted); + } + } + function onFinish() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + function onBlur() { + onFinish(); + } + function onMouseDrag(e) { + var diff = prevY - e.clientY; + _this.setValue(_this.getValue() + diff * _this.__impliedStep); + prevY = e.clientY; + } + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + onFinish(); + } + function onMouseDown(e) { + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + prevY = e.clientY; + } + _this2.__input = document.createElement('input'); + _this2.__input.setAttribute('type', 'text'); + dom.bind(_this2.__input, 'change', onChange); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__input, 'mousedown', onMouseDown); + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + _this.__truncationSuspended = true; + this.blur(); + _this.__truncationSuspended = false; + onFinish(); + } + }); + _this2.updateDisplay(); + _this2.domElement.appendChild(_this2.__input); + return _this2; + } + createClass(NumberControllerBox, [{ + key: 'updateDisplay', + value: function updateDisplay() { + this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); + return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this); + } + }]); + return NumberControllerBox; +}(NumberController); + +function map(v, i1, i2, o1, o2) { + return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); +} +var NumberControllerSlider = function (_NumberController) { + inherits(NumberControllerSlider, _NumberController); + function NumberControllerSlider(object, property, min, max, step) { + classCallCheck(this, NumberControllerSlider); + var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step })); + var _this = _this2; + _this2.__background = document.createElement('div'); + _this2.__foreground = document.createElement('div'); + dom.bind(_this2.__background, 'mousedown', onMouseDown); + dom.bind(_this2.__background, 'touchstart', onTouchStart); + dom.addClass(_this2.__background, 'slider'); + dom.addClass(_this2.__foreground, 'slider-fg'); + function onMouseDown(e) { + document.activeElement.blur(); + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + onMouseDrag(e); + } + function onMouseDrag(e) { + e.preventDefault(); + var bgRect = _this.__background.getBoundingClientRect(); + _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); + return false; + } + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + function onTouchStart(e) { + if (e.touches.length !== 1) { + return; + } + dom.bind(window, 'touchmove', onTouchMove); + dom.bind(window, 'touchend', onTouchEnd); + onTouchMove(e); + } + function onTouchMove(e) { + var clientX = e.touches[0].clientX; + var bgRect = _this.__background.getBoundingClientRect(); + _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); + } + function onTouchEnd() { + dom.unbind(window, 'touchmove', onTouchMove); + dom.unbind(window, 'touchend', onTouchEnd); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + _this2.updateDisplay(); + _this2.__background.appendChild(_this2.__foreground); + _this2.domElement.appendChild(_this2.__background); + return _this2; + } + createClass(NumberControllerSlider, [{ + key: 'updateDisplay', + value: function updateDisplay() { + var pct = (this.getValue() - this.__min) / (this.__max - this.__min); + this.__foreground.style.width = pct * 100 + '%'; + return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this); + } + }]); + return NumberControllerSlider; +}(NumberController); + +var FunctionController = function (_Controller) { + inherits(FunctionController, _Controller); + function FunctionController(object, property, text) { + classCallCheck(this, FunctionController); + var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property)); + var _this = _this2; + _this2.__button = document.createElement('div'); + _this2.__button.innerHTML = text === undefined ? 'Fire' : text; + dom.bind(_this2.__button, 'click', function (e) { + e.preventDefault(); + _this.fire(); + return false; + }); + dom.addClass(_this2.__button, 'button'); + _this2.domElement.appendChild(_this2.__button); + return _this2; + } + createClass(FunctionController, [{ + key: 'fire', + value: function fire() { + if (this.__onChange) { + this.__onChange.call(this); + } + this.getValue().call(this.object); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + } + }]); + return FunctionController; +}(Controller); + +var ColorController = function (_Controller) { + inherits(ColorController, _Controller); + function ColorController(object, property) { + classCallCheck(this, ColorController); + var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property)); + _this2.__color = new Color(_this2.getValue()); + _this2.__temp = new Color(0); + var _this = _this2; + _this2.domElement = document.createElement('div'); + dom.makeSelectable(_this2.domElement, false); + _this2.__selector = document.createElement('div'); + _this2.__selector.className = 'selector'; + _this2.__saturation_field = document.createElement('div'); + _this2.__saturation_field.className = 'saturation-field'; + _this2.__field_knob = document.createElement('div'); + _this2.__field_knob.className = 'field-knob'; + _this2.__field_knob_border = '2px solid '; + _this2.__hue_knob = document.createElement('div'); + _this2.__hue_knob.className = 'hue-knob'; + _this2.__hue_field = document.createElement('div'); + _this2.__hue_field.className = 'hue-field'; + _this2.__input = document.createElement('input'); + _this2.__input.type = 'text'; + _this2.__input_textShadow = '0 1px 1px '; + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + onBlur.call(this); + } + }); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__selector, 'mousedown', function () { + dom.addClass(this, 'drag').bind(window, 'mouseup', function () { + dom.removeClass(_this.__selector, 'drag'); + }); + }); + dom.bind(_this2.__selector, 'touchstart', function () { + dom.addClass(this, 'drag').bind(window, 'touchend', function () { + dom.removeClass(_this.__selector, 'drag'); + }); + }); + var valueField = document.createElement('div'); + Common.extend(_this2.__selector.style, { + width: '122px', + height: '102px', + padding: '3px', + backgroundColor: '#222', + boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' + }); + Common.extend(_this2.__field_knob.style, { + position: 'absolute', + width: '12px', + height: '12px', + border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'), + boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', + borderRadius: '12px', + zIndex: 1 + }); + Common.extend(_this2.__hue_knob.style, { + position: 'absolute', + width: '15px', + height: '2px', + borderRight: '4px solid #fff', + zIndex: 1 + }); + Common.extend(_this2.__saturation_field.style, { + width: '100px', + height: '100px', + border: '1px solid #555', + marginRight: '3px', + display: 'inline-block', + cursor: 'pointer' + }); + Common.extend(valueField.style, { + width: '100%', + height: '100%', + background: 'none' + }); + linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000'); + Common.extend(_this2.__hue_field.style, { + width: '15px', + height: '100px', + border: '1px solid #555', + cursor: 'ns-resize', + position: 'absolute', + top: '3px', + right: '3px' + }); + hueGradient(_this2.__hue_field); + Common.extend(_this2.__input.style, { + outline: 'none', + textAlign: 'center', + color: '#fff', + border: 0, + fontWeight: 'bold', + textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)' + }); + dom.bind(_this2.__saturation_field, 'mousedown', fieldDown); + dom.bind(_this2.__saturation_field, 'touchstart', fieldDown); + dom.bind(_this2.__field_knob, 'mousedown', fieldDown); + dom.bind(_this2.__field_knob, 'touchstart', fieldDown); + dom.bind(_this2.__hue_field, 'mousedown', fieldDownH); + dom.bind(_this2.__hue_field, 'touchstart', fieldDownH); + function fieldDown(e) { + setSV(e); + dom.bind(window, 'mousemove', setSV); + dom.bind(window, 'touchmove', setSV); + dom.bind(window, 'mouseup', fieldUpSV); + dom.bind(window, 'touchend', fieldUpSV); + } + function fieldDownH(e) { + setH(e); + dom.bind(window, 'mousemove', setH); + dom.bind(window, 'touchmove', setH); + dom.bind(window, 'mouseup', fieldUpH); + dom.bind(window, 'touchend', fieldUpH); + } + function fieldUpSV() { + dom.unbind(window, 'mousemove', setSV); + dom.unbind(window, 'touchmove', setSV); + dom.unbind(window, 'mouseup', fieldUpSV); + dom.unbind(window, 'touchend', fieldUpSV); + onFinish(); + } + function fieldUpH() { + dom.unbind(window, 'mousemove', setH); + dom.unbind(window, 'touchmove', setH); + dom.unbind(window, 'mouseup', fieldUpH); + dom.unbind(window, 'touchend', fieldUpH); + onFinish(); + } + function onBlur() { + var i = interpret(this.value); + if (i !== false) { + _this.__color.__state = i; + _this.setValue(_this.__color.toOriginal()); + } else { + this.value = _this.__color.toString(); + } + } + function onFinish() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.__color.toOriginal()); + } + } + _this2.__saturation_field.appendChild(valueField); + _this2.__selector.appendChild(_this2.__field_knob); + _this2.__selector.appendChild(_this2.__saturation_field); + _this2.__selector.appendChild(_this2.__hue_field); + _this2.__hue_field.appendChild(_this2.__hue_knob); + _this2.domElement.appendChild(_this2.__input); + _this2.domElement.appendChild(_this2.__selector); + _this2.updateDisplay(); + function setSV(e) { + if (e.type.indexOf('touch') === -1) { + e.preventDefault(); + } + var fieldRect = _this.__saturation_field.getBoundingClientRect(); + var _ref = e.touches && e.touches[0] || e, + clientX = _ref.clientX, + clientY = _ref.clientY; + var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left); + var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); + if (v > 1) { + v = 1; + } else if (v < 0) { + v = 0; + } + if (s > 1) { + s = 1; + } else if (s < 0) { + s = 0; + } + _this.__color.v = v; + _this.__color.s = s; + _this.setValue(_this.__color.toOriginal()); + return false; + } + function setH(e) { + if (e.type.indexOf('touch') === -1) { + e.preventDefault(); + } + var fieldRect = _this.__hue_field.getBoundingClientRect(); + var _ref2 = e.touches && e.touches[0] || e, + clientY = _ref2.clientY; + var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); + if (h > 1) { + h = 1; + } else if (h < 0) { + h = 0; + } + _this.__color.h = h * 360; + _this.setValue(_this.__color.toOriginal()); + return false; + } + return _this2; + } + createClass(ColorController, [{ + key: 'updateDisplay', + value: function updateDisplay() { + var i = interpret(this.getValue()); + if (i !== false) { + var mismatch = false; + Common.each(Color.COMPONENTS, function (component) { + if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) { + mismatch = true; + return {}; + } + }, this); + if (mismatch) { + Common.extend(this.__color.__state, i); + } + } + Common.extend(this.__temp.__state, this.__color.__state); + this.__temp.a = 1; + var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0; + var _flip = 255 - flip; + Common.extend(this.__field_knob.style, { + marginLeft: 100 * this.__color.s - 7 + 'px', + marginTop: 100 * (1 - this.__color.v) - 7 + 'px', + backgroundColor: this.__temp.toHexString(), + border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')' + }); + this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'; + this.__temp.s = 1; + this.__temp.v = 1; + linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString()); + this.__input.value = this.__color.toString(); + Common.extend(this.__input.style, { + backgroundColor: this.__color.toHexString(), + color: 'rgb(' + flip + ',' + flip + ',' + flip + ')', + textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)' + }); + } + }]); + return ColorController; +}(Controller); +var vendors = ['-moz-', '-o-', '-webkit-', '-ms-', '']; +function linearGradient(elem, x, a, b) { + elem.style.background = ''; + Common.each(vendors, function (vendor) { + elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); '; + }); +} +function hueGradient(elem) { + elem.style.background = ''; + elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'; + elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; +} + +var css = { + load: function load(url, indoc) { + var doc = indoc || document; + var link = doc.createElement('link'); + link.type = 'text/css'; + link.rel = 'stylesheet'; + link.href = url; + doc.getElementsByTagName('head')[0].appendChild(link); + }, + inject: function inject(cssContent, indoc) { + var doc = indoc || document; + var injected = document.createElement('style'); + injected.type = 'text/css'; + injected.innerHTML = cssContent; + var head = doc.getElementsByTagName('head')[0]; + try { + head.appendChild(injected); + } catch (e) { + } + } +}; + +var saveDialogContents = "
\n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n
"; + +var ControllerFactory = function ControllerFactory(object, property) { + var initialValue = object[property]; + if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) { + return new OptionController(object, property, arguments[2]); + } + if (Common.isNumber(initialValue)) { + if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) { + if (Common.isNumber(arguments[4])) { + return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]); + } + return new NumberControllerSlider(object, property, arguments[2], arguments[3]); + } + if (Common.isNumber(arguments[4])) { + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] }); + } + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); + } + if (Common.isString(initialValue)) { + return new StringController(object, property); + } + if (Common.isFunction(initialValue)) { + return new FunctionController(object, property, ''); + } + if (Common.isBoolean(initialValue)) { + return new BooleanController(object, property); + } + return null; +}; + +function requestAnimationFrame(callback) { + setTimeout(callback, 1000 / 60); +} +var requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame; + +var CenteredDiv = function () { + function CenteredDiv() { + classCallCheck(this, CenteredDiv); + this.backgroundElement = document.createElement('div'); + Common.extend(this.backgroundElement.style, { + backgroundColor: 'rgba(0,0,0,0.8)', + top: 0, + left: 0, + display: 'none', + zIndex: '1000', + opacity: 0, + WebkitTransition: 'opacity 0.2s linear', + transition: 'opacity 0.2s linear' + }); + dom.makeFullscreen(this.backgroundElement); + this.backgroundElement.style.position = 'fixed'; + this.domElement = document.createElement('div'); + Common.extend(this.domElement.style, { + position: 'fixed', + display: 'none', + zIndex: '1001', + opacity: 0, + WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear', + transition: 'transform 0.2s ease-out, opacity 0.2s linear' + }); + document.body.appendChild(this.backgroundElement); + document.body.appendChild(this.domElement); + var _this = this; + dom.bind(this.backgroundElement, 'click', function () { + _this.hide(); + }); + } + createClass(CenteredDiv, [{ + key: 'show', + value: function show() { + var _this = this; + this.backgroundElement.style.display = 'block'; + this.domElement.style.display = 'block'; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + this.layout(); + Common.defer(function () { + _this.backgroundElement.style.opacity = 1; + _this.domElement.style.opacity = 1; + _this.domElement.style.webkitTransform = 'scale(1)'; + }); + } + }, { + key: 'hide', + value: function hide() { + var _this = this; + var hide = function hide() { + _this.domElement.style.display = 'none'; + _this.backgroundElement.style.display = 'none'; + dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); + dom.unbind(_this.domElement, 'transitionend', hide); + dom.unbind(_this.domElement, 'oTransitionEnd', hide); + }; + dom.bind(this.domElement, 'webkitTransitionEnd', hide); + dom.bind(this.domElement, 'transitionend', hide); + dom.bind(this.domElement, 'oTransitionEnd', hide); + this.backgroundElement.style.opacity = 0; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + } + }, { + key: 'layout', + value: function layout() { + this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px'; + this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px'; + } + }]); + return CenteredDiv; +}(); + +var styleSheet = ___$insertStyle(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"); + +css.inject(styleSheet); +var CSS_NAMESPACE = 'dg'; +var HIDE_KEY_CODE = 72; +var CLOSE_BUTTON_HEIGHT = 20; +var DEFAULT_DEFAULT_PRESET_NAME = 'Default'; +var SUPPORTS_LOCAL_STORAGE = function () { + try { + return !!window.localStorage; + } catch (e) { + return false; + } +}(); +var SAVE_DIALOGUE = void 0; +var autoPlaceVirgin = true; +var autoPlaceContainer = void 0; +var hide = false; +var hideableGuis = []; +var GUI = function GUI(pars) { + var _this = this; + var params = pars || {}; + this.domElement = document.createElement('div'); + this.__ul = document.createElement('ul'); + this.domElement.appendChild(this.__ul); + dom.addClass(this.domElement, CSS_NAMESPACE); + this.__folders = {}; + this.__controllers = []; + this.__rememberedObjects = []; + this.__rememberedObjectIndecesToControllers = []; + this.__listening = []; + params = Common.defaults(params, { + closeOnTop: false, + autoPlace: true, + width: GUI.DEFAULT_WIDTH + }); + params = Common.defaults(params, { + resizable: params.autoPlace, + hideable: params.autoPlace + }); + if (!Common.isUndefined(params.load)) { + if (params.preset) { + params.load.preset = params.preset; + } + } else { + params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; + } + if (Common.isUndefined(params.parent) && params.hideable) { + hideableGuis.push(this); + } + params.resizable = Common.isUndefined(params.parent) && params.resizable; + if (params.autoPlace && Common.isUndefined(params.scrollable)) { + params.scrollable = true; + } + var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; + var saveToLocalStorage = void 0; + var titleRow = void 0; + Object.defineProperties(this, + { + parent: { + get: function get$$1() { + return params.parent; + } + }, + scrollable: { + get: function get$$1() { + return params.scrollable; + } + }, + autoPlace: { + get: function get$$1() { + return params.autoPlace; + } + }, + closeOnTop: { + get: function get$$1() { + return params.closeOnTop; + } + }, + preset: { + get: function get$$1() { + if (_this.parent) { + return _this.getRoot().preset; + } + return params.load.preset; + }, + set: function set$$1(v) { + if (_this.parent) { + _this.getRoot().preset = v; + } else { + params.load.preset = v; + } + setPresetSelectIndex(this); + _this.revert(); + } + }, + width: { + get: function get$$1() { + return params.width; + }, + set: function set$$1(v) { + params.width = v; + setWidth(_this, v); + } + }, + name: { + get: function get$$1() { + return params.name; + }, + set: function set$$1(v) { + params.name = v; + if (titleRow) { + titleRow.innerHTML = params.name; + } + } + }, + closed: { + get: function get$$1() { + return params.closed; + }, + set: function set$$1(v) { + params.closed = v; + if (params.closed) { + dom.addClass(_this.__ul, GUI.CLASS_CLOSED); + } else { + dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); + } + this.onResize(); + if (_this.__closeButton) { + _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; + } + } + }, + load: { + get: function get$$1() { + return params.load; + } + }, + useLocalStorage: { + get: function get$$1() { + return useLocalStorage; + }, + set: function set$$1(bool) { + if (SUPPORTS_LOCAL_STORAGE) { + useLocalStorage = bool; + if (bool) { + dom.bind(window, 'unload', saveToLocalStorage); + } else { + dom.unbind(window, 'unload', saveToLocalStorage); + } + localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); + } + } + } + }); + if (Common.isUndefined(params.parent)) { + this.closed = params.closed || false; + dom.addClass(this.domElement, GUI.CLASS_MAIN); + dom.makeSelectable(this.domElement, false); + if (SUPPORTS_LOCAL_STORAGE) { + if (useLocalStorage) { + _this.useLocalStorage = true; + var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui')); + if (savedGui) { + params.load = JSON.parse(savedGui); + } + } + } + this.__closeButton = document.createElement('div'); + this.__closeButton.innerHTML = GUI.TEXT_CLOSED; + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); + if (params.closeOnTop) { + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP); + this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]); + } else { + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM); + this.domElement.appendChild(this.__closeButton); + } + dom.bind(this.__closeButton, 'click', function () { + _this.closed = !_this.closed; + }); + } else { + if (params.closed === undefined) { + params.closed = true; + } + var titleRowName = document.createTextNode(params.name); + dom.addClass(titleRowName, 'controller-name'); + titleRow = addRow(_this, titleRowName); + var onClickTitle = function onClickTitle(e) { + e.preventDefault(); + _this.closed = !_this.closed; + return false; + }; + dom.addClass(this.__ul, GUI.CLASS_CLOSED); + dom.addClass(titleRow, 'title'); + dom.bind(titleRow, 'click', onClickTitle); + if (!params.closed) { + this.closed = false; + } + } + if (params.autoPlace) { + if (Common.isUndefined(params.parent)) { + if (autoPlaceVirgin) { + autoPlaceContainer = document.createElement('div'); + dom.addClass(autoPlaceContainer, CSS_NAMESPACE); + dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER); + document.body.appendChild(autoPlaceContainer); + autoPlaceVirgin = false; + } + autoPlaceContainer.appendChild(this.domElement); + dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); + } + if (!this.parent) { + setWidth(_this, params.width); + } + } + this.__resizeHandler = function () { + _this.onResizeDebounced(); + }; + dom.bind(window, 'resize', this.__resizeHandler); + dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler); + dom.bind(this.__ul, 'transitionend', this.__resizeHandler); + dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler); + this.onResize(); + if (params.resizable) { + addResizeHandle(this); + } + saveToLocalStorage = function saveToLocalStorage() { + if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') { + localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); + } + }; + this.saveToLocalStorageIfPossible = saveToLocalStorage; + function resetWidth() { + var root = _this.getRoot(); + root.width += 1; + Common.defer(function () { + root.width -= 1; + }); + } + if (!params.parent) { + resetWidth(); + } +}; +GUI.toggleHide = function () { + hide = !hide; + Common.each(hideableGuis, function (gui) { + gui.domElement.style.display = hide ? 'none' : ''; + }); +}; +GUI.CLASS_AUTO_PLACE = 'a'; +GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; +GUI.CLASS_MAIN = 'main'; +GUI.CLASS_CONTROLLER_ROW = 'cr'; +GUI.CLASS_TOO_TALL = 'taller-than-window'; +GUI.CLASS_CLOSED = 'closed'; +GUI.CLASS_CLOSE_BUTTON = 'close-button'; +GUI.CLASS_CLOSE_TOP = 'close-top'; +GUI.CLASS_CLOSE_BOTTOM = 'close-bottom'; +GUI.CLASS_DRAG = 'drag'; +GUI.DEFAULT_WIDTH = 245; +GUI.TEXT_CLOSED = 'Close Controls'; +GUI.TEXT_OPEN = 'Open Controls'; +GUI._keydownHandler = function (e) { + if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) { + GUI.toggleHide(); + } +}; +dom.bind(window, 'keydown', GUI._keydownHandler, false); +Common.extend(GUI.prototype, +{ + add: function add(object, property) { + return _add(this, object, property, { + factoryArgs: Array.prototype.slice.call(arguments, 2) + }); + }, + addColor: function addColor(object, property) { + return _add(this, object, property, { + color: true + }); + }, + remove: function remove(controller) { + this.__ul.removeChild(controller.__li); + this.__controllers.splice(this.__controllers.indexOf(controller), 1); + var _this = this; + Common.defer(function () { + _this.onResize(); + }); + }, + destroy: function destroy() { + if (this.parent) { + throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.'); + } + if (this.autoPlace) { + autoPlaceContainer.removeChild(this.domElement); + } + var _this = this; + Common.each(this.__folders, function (subfolder) { + _this.removeFolder(subfolder); + }); + dom.unbind(window, 'keydown', GUI._keydownHandler, false); + removeListeners(this); + }, + addFolder: function addFolder(name) { + if (this.__folders[name] !== undefined) { + throw new Error('You already have a folder in this GUI by the' + ' name "' + name + '"'); + } + var newGuiParams = { name: name, parent: this }; + newGuiParams.autoPlace = this.autoPlace; + if (this.load && + this.load.folders && + this.load.folders[name]) { + newGuiParams.closed = this.load.folders[name].closed; + newGuiParams.load = this.load.folders[name]; + } + var gui = new GUI(newGuiParams); + this.__folders[name] = gui; + var li = addRow(this, gui.domElement); + dom.addClass(li, 'folder'); + return gui; + }, + removeFolder: function removeFolder(folder) { + this.__ul.removeChild(folder.domElement.parentElement); + delete this.__folders[folder.name]; + if (this.load && + this.load.folders && + this.load.folders[folder.name]) { + delete this.load.folders[folder.name]; + } + removeListeners(folder); + var _this = this; + Common.each(folder.__folders, function (subfolder) { + folder.removeFolder(subfolder); + }); + Common.defer(function () { + _this.onResize(); + }); + }, + open: function open() { + this.closed = false; + }, + close: function close() { + this.closed = true; + }, + hide: function hide() { + this.domElement.style.display = 'none'; + }, + show: function show() { + this.domElement.style.display = ''; + }, + onResize: function onResize() { + var root = this.getRoot(); + if (root.scrollable) { + var top = dom.getOffset(root.__ul).top; + var h = 0; + Common.each(root.__ul.childNodes, function (node) { + if (!(root.autoPlace && node === root.__save_row)) { + h += dom.getHeight(node); + } + }); + if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { + dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; + } else { + dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = 'auto'; + } + } + if (root.__resize_handle) { + Common.defer(function () { + root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; + }); + } + if (root.__closeButton) { + root.__closeButton.style.width = root.width + 'px'; + } + }, + onResizeDebounced: Common.debounce(function () { + this.onResize(); + }, 50), + remember: function remember() { + if (Common.isUndefined(SAVE_DIALOGUE)) { + SAVE_DIALOGUE = new CenteredDiv(); + SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents; + } + if (this.parent) { + throw new Error('You can only call remember on a top level GUI.'); + } + var _this = this; + Common.each(Array.prototype.slice.call(arguments), function (object) { + if (_this.__rememberedObjects.length === 0) { + addSaveMenu(_this); + } + if (_this.__rememberedObjects.indexOf(object) === -1) { + _this.__rememberedObjects.push(object); + } + }); + if (this.autoPlace) { + setWidth(this, this.width); + } + }, + getRoot: function getRoot() { + var gui = this; + while (gui.parent) { + gui = gui.parent; + } + return gui; + }, + getSaveObject: function getSaveObject() { + var toReturn = this.load; + toReturn.closed = this.closed; + if (this.__rememberedObjects.length > 0) { + toReturn.preset = this.preset; + if (!toReturn.remembered) { + toReturn.remembered = {}; + } + toReturn.remembered[this.preset] = getCurrentPreset(this); + } + toReturn.folders = {}; + Common.each(this.__folders, function (element, key) { + toReturn.folders[key] = element.getSaveObject(); + }); + return toReturn; + }, + save: function save() { + if (!this.load.remembered) { + this.load.remembered = {}; + } + this.load.remembered[this.preset] = getCurrentPreset(this); + markPresetModified(this, false); + this.saveToLocalStorageIfPossible(); + }, + saveAs: function saveAs(presetName) { + if (!this.load.remembered) { + this.load.remembered = {}; + this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); + } + this.load.remembered[presetName] = getCurrentPreset(this); + this.preset = presetName; + addPresetOption(this, presetName, true); + this.saveToLocalStorageIfPossible(); + }, + revert: function revert(gui) { + Common.each(this.__controllers, function (controller) { + if (!this.getRoot().load.remembered) { + controller.setValue(controller.initialValue); + } else { + recallSavedValue(gui || this.getRoot(), controller); + } + if (controller.__onFinishChange) { + controller.__onFinishChange.call(controller, controller.getValue()); + } + }, this); + Common.each(this.__folders, function (folder) { + folder.revert(folder); + }); + if (!gui) { + markPresetModified(this.getRoot(), false); + } + }, + listen: function listen(controller) { + var init = this.__listening.length === 0; + this.__listening.push(controller); + if (init) { + updateDisplays(this.__listening); + } + }, + updateDisplay: function updateDisplay() { + Common.each(this.__controllers, function (controller) { + controller.updateDisplay(); + }); + Common.each(this.__folders, function (folder) { + folder.updateDisplay(); + }); + } +}); +function addRow(gui, newDom, liBefore) { + var li = document.createElement('li'); + if (newDom) { + li.appendChild(newDom); + } + if (liBefore) { + gui.__ul.insertBefore(li, liBefore); + } else { + gui.__ul.appendChild(li); + } + gui.onResize(); + return li; +} +function removeListeners(gui) { + dom.unbind(window, 'resize', gui.__resizeHandler); + if (gui.saveToLocalStorageIfPossible) { + dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible); + } +} +function markPresetModified(gui, modified) { + var opt = gui.__preset_select[gui.__preset_select.selectedIndex]; + if (modified) { + opt.innerHTML = opt.value + '*'; + } else { + opt.innerHTML = opt.value; + } +} +function augmentController(gui, li, controller) { + controller.__li = li; + controller.__gui = gui; + Common.extend(controller, { + options: function options(_options) { + if (arguments.length > 1) { + var nextSibling = controller.__li.nextElementSibling; + controller.remove(); + return _add(gui, controller.object, controller.property, { + before: nextSibling, + factoryArgs: [Common.toArray(arguments)] + }); + } + if (Common.isArray(_options) || Common.isObject(_options)) { + var _nextSibling = controller.__li.nextElementSibling; + controller.remove(); + return _add(gui, controller.object, controller.property, { + before: _nextSibling, + factoryArgs: [_options] + }); + } + }, + name: function name(_name) { + controller.__li.firstElementChild.firstElementChild.innerHTML = _name; + return controller; + }, + listen: function listen() { + controller.__gui.listen(controller); + return controller; + }, + remove: function remove() { + controller.__gui.remove(controller); + return controller; + } + }); + if (controller instanceof NumberControllerSlider) { + var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step }); + Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) { + var pc = controller[method]; + var pb = box[method]; + controller[method] = box[method] = function () { + var args = Array.prototype.slice.call(arguments); + pb.apply(box, args); + return pc.apply(controller, args); + }; + }); + dom.addClass(li, 'has-slider'); + controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); + } else if (controller instanceof NumberControllerBox) { + var r = function r(returned) { + if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) { + var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML; + var wasListening = controller.__gui.__listening.indexOf(controller) > -1; + controller.remove(); + var newController = _add(gui, controller.object, controller.property, { + before: controller.__li.nextElementSibling, + factoryArgs: [controller.__min, controller.__max, controller.__step] + }); + newController.name(oldName); + if (wasListening) newController.listen(); + return newController; + } + return returned; + }; + controller.min = Common.compose(r, controller.min); + controller.max = Common.compose(r, controller.max); + } else if (controller instanceof BooleanController) { + dom.bind(li, 'click', function () { + dom.fakeEvent(controller.__checkbox, 'click'); + }); + dom.bind(controller.__checkbox, 'click', function (e) { + e.stopPropagation(); + }); + } else if (controller instanceof FunctionController) { + dom.bind(li, 'click', function () { + dom.fakeEvent(controller.__button, 'click'); + }); + dom.bind(li, 'mouseover', function () { + dom.addClass(controller.__button, 'hover'); + }); + dom.bind(li, 'mouseout', function () { + dom.removeClass(controller.__button, 'hover'); + }); + } else if (controller instanceof ColorController) { + dom.addClass(li, 'color'); + controller.updateDisplay = Common.compose(function (val) { + li.style.borderLeftColor = controller.__color.toString(); + return val; + }, controller.updateDisplay); + controller.updateDisplay(); + } + controller.setValue = Common.compose(function (val) { + if (gui.getRoot().__preset_select && controller.isModified()) { + markPresetModified(gui.getRoot(), true); + } + return val; + }, controller.setValue); +} +function recallSavedValue(gui, controller) { + var root = gui.getRoot(); + var matchedIndex = root.__rememberedObjects.indexOf(controller.object); + if (matchedIndex !== -1) { + var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex]; + if (controllerMap === undefined) { + controllerMap = {}; + root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap; + } + controllerMap[controller.property] = controller; + if (root.load && root.load.remembered) { + var presetMap = root.load.remembered; + var preset = void 0; + if (presetMap[gui.preset]) { + preset = presetMap[gui.preset]; + } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) { + preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME]; + } else { + return; + } + if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) { + var value = preset[matchedIndex][controller.property]; + controller.initialValue = value; + controller.setValue(value); + } + } + } +} +function _add(gui, object, property, params) { + if (object[property] === undefined) { + throw new Error('Object "' + object + '" has no property "' + property + '"'); + } + var controller = void 0; + if (params.color) { + controller = new ColorController(object, property); + } else { + var factoryArgs = [object, property].concat(params.factoryArgs); + controller = ControllerFactory.apply(gui, factoryArgs); + } + if (params.before instanceof Controller) { + params.before = params.before.__li; + } + recallSavedValue(gui, controller); + dom.addClass(controller.domElement, 'c'); + var name = document.createElement('span'); + dom.addClass(name, 'property-name'); + name.innerHTML = controller.property; + var container = document.createElement('div'); + container.appendChild(name); + container.appendChild(controller.domElement); + var li = addRow(gui, container, params.before); + dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); + if (controller instanceof ColorController) { + dom.addClass(li, 'color'); + } else { + dom.addClass(li, _typeof(controller.getValue())); + } + augmentController(gui, li, controller); + gui.__controllers.push(controller); + return controller; +} +function getLocalStorageHash(gui, key) { + return document.location.href + '.' + key; +} +function addPresetOption(gui, name, setSelected) { + var opt = document.createElement('option'); + opt.innerHTML = name; + opt.value = name; + gui.__preset_select.appendChild(opt); + if (setSelected) { + gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; + } +} +function showHideExplain(gui, explain) { + explain.style.display = gui.useLocalStorage ? 'block' : 'none'; +} +function addSaveMenu(gui) { + var div = gui.__save_row = document.createElement('li'); + dom.addClass(gui.domElement, 'has-save'); + gui.__ul.insertBefore(div, gui.__ul.firstChild); + dom.addClass(div, 'save-row'); + var gears = document.createElement('span'); + gears.innerHTML = ' '; + dom.addClass(gears, 'button gears'); + var button = document.createElement('span'); + button.innerHTML = 'Save'; + dom.addClass(button, 'button'); + dom.addClass(button, 'save'); + var button2 = document.createElement('span'); + button2.innerHTML = 'New'; + dom.addClass(button2, 'button'); + dom.addClass(button2, 'save-as'); + var button3 = document.createElement('span'); + button3.innerHTML = 'Revert'; + dom.addClass(button3, 'button'); + dom.addClass(button3, 'revert'); + var select = gui.__preset_select = document.createElement('select'); + if (gui.load && gui.load.remembered) { + Common.each(gui.load.remembered, function (value, key) { + addPresetOption(gui, key, key === gui.preset); + }); + } else { + addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); + } + dom.bind(select, 'change', function () { + for (var index = 0; index < gui.__preset_select.length; index++) { + gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; + } + gui.preset = this.value; + }); + div.appendChild(select); + div.appendChild(gears); + div.appendChild(button); + div.appendChild(button2); + div.appendChild(button3); + if (SUPPORTS_LOCAL_STORAGE) { + var explain = document.getElementById('dg-local-explain'); + var localStorageCheckBox = document.getElementById('dg-local-storage'); + var saveLocally = document.getElementById('dg-save-locally'); + saveLocally.style.display = 'block'; + if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { + localStorageCheckBox.setAttribute('checked', 'checked'); + } + showHideExplain(gui, explain); + dom.bind(localStorageCheckBox, 'change', function () { + gui.useLocalStorage = !gui.useLocalStorage; + showHideExplain(gui, explain); + }); + } + var newConstructorTextArea = document.getElementById('dg-new-constructor'); + dom.bind(newConstructorTextArea, 'keydown', function (e) { + if (e.metaKey && (e.which === 67 || e.keyCode === 67)) { + SAVE_DIALOGUE.hide(); + } + }); + dom.bind(gears, 'click', function () { + newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); + SAVE_DIALOGUE.show(); + newConstructorTextArea.focus(); + newConstructorTextArea.select(); + }); + dom.bind(button, 'click', function () { + gui.save(); + }); + dom.bind(button2, 'click', function () { + var presetName = prompt('Enter a new preset name.'); + if (presetName) { + gui.saveAs(presetName); + } + }); + dom.bind(button3, 'click', function () { + gui.revert(); + }); +} +function addResizeHandle(gui) { + var pmouseX = void 0; + gui.__resize_handle = document.createElement('div'); + Common.extend(gui.__resize_handle.style, { + width: '6px', + marginLeft: '-3px', + height: '200px', + cursor: 'ew-resize', + position: 'absolute' + }); + function drag(e) { + e.preventDefault(); + gui.width += pmouseX - e.clientX; + gui.onResize(); + pmouseX = e.clientX; + return false; + } + function dragStop() { + dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.unbind(window, 'mousemove', drag); + dom.unbind(window, 'mouseup', dragStop); + } + function dragStart(e) { + e.preventDefault(); + pmouseX = e.clientX; + dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.bind(window, 'mousemove', drag); + dom.bind(window, 'mouseup', dragStop); + return false; + } + dom.bind(gui.__resize_handle, 'mousedown', dragStart); + dom.bind(gui.__closeButton, 'mousedown', dragStart); + gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); +} +function setWidth(gui, w) { + gui.domElement.style.width = w + 'px'; + if (gui.__save_row && gui.autoPlace) { + gui.__save_row.style.width = w + 'px'; + } + if (gui.__closeButton) { + gui.__closeButton.style.width = w + 'px'; + } +} +function getCurrentPreset(gui, useInitialValues) { + var toReturn = {}; + Common.each(gui.__rememberedObjects, function (val, index) { + var savedValues = {}; + var controllerMap = gui.__rememberedObjectIndecesToControllers[index]; + Common.each(controllerMap, function (controller, property) { + savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue(); + }); + toReturn[index] = savedValues; + }); + return toReturn; +} +function setPresetSelectIndex(gui) { + for (var index = 0; index < gui.__preset_select.length; index++) { + if (gui.__preset_select[index].value === gui.preset) { + gui.__preset_select.selectedIndex = index; + } + } +} +function updateDisplays(controllerArray) { + if (controllerArray.length !== 0) { + requestAnimationFrame$1.call(window, function () { + updateDisplays(controllerArray); + }); + } + Common.each(controllerArray, function (c) { + c.updateDisplay(); + }); +} + +var color = { + Color: Color, + math: ColorMath, + interpret: interpret +}; +var controllers = { + Controller: Controller, + BooleanController: BooleanController, + OptionController: OptionController, + StringController: StringController, + NumberController: NumberController, + NumberControllerBox: NumberControllerBox, + NumberControllerSlider: NumberControllerSlider, + FunctionController: FunctionController, + ColorController: ColorController +}; +var dom$1 = { dom: dom }; +var gui = { GUI: GUI }; +var GUI$1 = GUI; +var index = { + color: color, + controllers: controllers, + dom: dom$1, + gui: gui, + GUI: GUI$1 +}; + +export { color, controllers, dom$1 as dom, gui, GUI$1 as GUI }; +export default index; +//# sourceMappingURL=dat.gui.module.js.map diff --git a/build/dat.gui.module.js.map b/build/dat.gui.module.js.map new file mode 100644 index 000000000..15c522a3f --- /dev/null +++ b/build/dat.gui.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dat.gui.module.js","sources":["../src/dat/color/toString.js","../src/dat/utils/common.js","../src/dat/color/interpret.js","../src/dat/color/math.js","../src/dat/color/Color.js","../src/dat/controllers/Controller.js","../src/dat/dom/dom.js","../src/dat/controllers/BooleanController.js","../src/dat/controllers/OptionController.js","../src/dat/controllers/StringController.js","../src/dat/controllers/NumberController.js","../src/dat/controllers/NumberControllerBox.js","../src/dat/controllers/NumberControllerSlider.js","../src/dat/controllers/FunctionController.js","../src/dat/controllers/ColorController.js","../src/dat/utils/css.js","../src/dat/gui/saveDialogue.html.js","../src/dat/controllers/ControllerFactory.js","../src/dat/utils/requestAnimationFrame.js","../src/dat/dom/CenteredDiv.js","../src/dat/gui/GUI.js","../src/dat/index.js"],"sourcesContent":["/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nexport default function(color, forceCSSHex) {\n const colorFormat = color.__state.conversionName.toString();\n\n const r = Math.round(color.r);\n const g = Math.round(color.g);\n const b = Math.round(color.b);\n const a = color.a;\n const h = Math.round(color.h);\n const s = color.s.toFixed(1);\n const v = color.v.toFixed(1);\n\n if (forceCSSHex || (colorFormat === 'THREE_CHAR_HEX') || (colorFormat === 'SIX_CHAR_HEX')) {\n let str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n\n return 'unknown format';\n}\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nconst ARR_EACH = Array.prototype.forEach;\nconst ARR_SLICE = Array.prototype.slice;\n\n/**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\nconst Common = {\n BREAK: {},\n\n extend: function(target) {\n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n const keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function(key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n\n return target;\n },\n\n defaults: function(target) {\n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n const keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function(key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n\n return target;\n },\n\n compose: function() {\n const toCall = ARR_SLICE.call(arguments);\n return function() {\n let args = ARR_SLICE.call(arguments);\n for (let i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n\n each: function(obj, itr, scope) {\n if (!obj) {\n return;\n }\n\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n let key;\n let l;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (const key in obj) {\n if (itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n }\n },\n\n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n\n // if the function is called repeatedly, wait until threshold passes until we execute the function\n debounce: function(func, threshold, callImmediately) {\n let timeout;\n\n return function() {\n const obj = this;\n const args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n\n const callNow = callImmediately || !timeout;\n\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n\n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n\n isNull: function(obj) {\n return obj === null;\n },\n\n isNaN: function(obj) {\n return isNaN(obj);\n },\n\n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n\n isObject: function(obj) {\n return obj === Object(obj);\n },\n\n isNumber: function(obj) {\n return obj === obj + 0;\n },\n\n isString: function(obj) {\n return obj === obj + '';\n },\n\n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n\n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n\n};\n\nexport default Common;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport toString from './toString';\nimport common from '../utils/common';\n\nconst INTERPRETATIONS = [\n // Strings\n {\n litmus: common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function(original) {\n const test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString(), 0)\n };\n },\n\n write: toString\n },\n\n SIX_CHAR_HEX: {\n read: function(original) {\n const test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n\n write: toString\n },\n\n CSS_RGB: {\n read: function(original) {\n const test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n\n write: toString\n },\n\n CSS_RGBA: {\n read: function(original) {\n const test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n\n write: toString\n }\n }\n },\n\n // Numbers\n {\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n litmus: common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function(original) {\n if (original.length !== 3) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n },\n\n // Objects\n {\n litmus: common.isObject,\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n }\n];\n\nlet result;\nlet toReturn;\n\nconst interpret = function() {\n toReturn = false;\n\n const original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n common.each(INTERPRETATIONS, function(family) {\n if (family.litmus(original)) {\n common.each(family.conversions, function(conversion, conversionName) {\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n }\n });\n\n return common.BREAK;\n }\n });\n\n return toReturn;\n};\n\nexport default interpret;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nlet tmpComponent;\n\nconst ColorMath = {\n hsv_to_rgb: function(h, s, v) {\n const hi = Math.floor(h / 60) % 6;\n\n const f = h / 60 - Math.floor(h / 60);\n const p = v * (1.0 - s);\n const q = v * (1.0 - (f * s));\n const t = v * (1.0 - ((1.0 - f) * s));\n\n const c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n\n rgb_to_hsv: function(r, g, b) {\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n const delta = max - min;\n let h;\n let s;\n\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n let hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~(0xFF << tmpComponent));\n }\n};\n\nexport default ColorMath;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport interpret from './interpret';\nimport math from './math';\nimport colorToString from './toString';\nimport common from '../utils/common';\n\nclass Color {\n constructor() {\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n\n this.__state.a = this.__state.a || 1;\n }\n\n toString() {\n return colorToString(this);\n }\n\n toHexString() {\n return colorToString(this, true);\n }\n\n toOriginal() {\n return this.__state.conversion.write(this);\n }\n}\n\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n Color.recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n },\n\n set: function(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n }\n });\n}\n\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n\n Color.recalculateHSV(this);\n\n return this.__state[component];\n },\n\n set: function(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n }\n });\n}\n\n\nColor.recalculateRGB = function(color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\n\nColor.recalculateHSV = function(color) {\n const result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\n\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\n\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\n\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\n\nObject.defineProperty(Color.prototype, 'a', {\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n});\n\nObject.defineProperty(Color.prototype, 'hex', {\n get: function() {\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n },\n\n set: function(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nexport default Color;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass Controller {\n constructor(object, property) {\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n }\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {Controller} this\n */\n onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {Controller} this\n */\n onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n\n this.updateDisplay();\n return this;\n }\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue() {\n return this.object[this.property];\n }\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {Controller} this\n */\n updateDisplay() {\n return this;\n }\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified() {\n return this.initialValue !== this.getValue();\n }\n}\n\nexport default Controller;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport common from '../utils/common';\n\nconst EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\n\nconst EVENT_MAP_INV = {};\ncommon.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n});\n\nconst CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\nfunction cssValueToPixels(val) {\n if (val === '0' || common.isUndefined(val)) {\n return 0;\n }\n\n const match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n}\n\n/**\n * @namespace\n * @member dat.dom\n */\nconst dom = {\n\n /**\n *\n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vert\n */\n makeFullscreen: function(elem, hor, vert) {\n let vertical = vert;\n let horizontal = hor;\n\n if (common.isUndefined(horizontal)) {\n horizontal = true;\n }\n\n if (common.isUndefined(vertical)) {\n vertical = true;\n }\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, pars, aux) {\n const params = pars || {};\n const className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n const evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n const clientX = params.x || params.clientX || 0;\n const clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, // screen X\n 0, // screen Y\n clientX, // client X\n clientY, // client Y\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n const init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, newBool) {\n const bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, newBool) {\n const bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n const classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n const classes = elem.className.split(/ +/);\n const index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n const style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style.width);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n const style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style.height);\n },\n\n /**\n *\n * @param el\n */\n getOffset: function(el) {\n let elem = el;\n const offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n *\n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n\n};\n\nexport default dom;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a checkbox input to alter the boolean property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass BooleanController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n const _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n }\n\n setValue(v) {\n const toReturn = super.setValue(v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n\n updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n\n return super.updateDisplay();\n }\n}\n\nexport default BooleanController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\n/**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n */\nclass OptionController extends Controller {\n constructor(object, property, opts) {\n super(object, property);\n\n let options = opts;\n\n const _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n const map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n const opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n const desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n }\n\n setValue(v) {\n const toReturn = super.setValue(v);\n\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n\n updateDisplay() {\n if (dom.isActive(this.__select)) return this; // prevent number from updating if user is trying to manually update\n this.__select.value = this.getValue();\n return super.updateDisplay();\n }\n}\n\nexport default OptionController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass StringController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n const _this = this;\n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n }\n\n updateDisplay() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return super.updateDisplay();\n }\n}\n\nexport default StringController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport common from '../utils/common';\n\nfunction numDecimals(x) {\n const _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n\n return 0;\n}\n\n/**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n */\nclass NumberController extends Controller {\n constructor(object, property, params) {\n super(object, property);\n\n const _params = params || {};\n\n this.__min = _params.min;\n this.__max = _params.max;\n this.__step = _params.step;\n\n if (common.isUndefined(this.__step)) {\n if (this.initialValue === 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n this.__impliedStep = this.__step;\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n }\n\n setValue(v) {\n let _v = v;\n\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n\n return super.setValue(_v);\n }\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min(minValue) {\n this.__min = minValue;\n return this;\n }\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n}\n\nexport default NumberController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport NumberController from './NumberController';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nfunction roundToDecimal(value, decimals) {\n const tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\n\n/**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n */\nclass NumberControllerBox extends NumberController {\n constructor(object, property, params) {\n super(object, property, params);\n\n this.__truncationSuspended = false;\n\n const _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n let prevY;\n\n function onChange() {\n const attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onBlur() {\n onFinish();\n }\n\n function onMouseDrag(e) {\n const diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prevY = e.clientY;\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n // When pressing enter, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n }\n\n updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return super.updateDisplay();\n }\n}\n\nexport default NumberControllerBox;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport NumberController from './NumberController';\nimport dom from '../dom/dom';\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\n\n/**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n */\nclass NumberControllerSlider extends NumberController {\n constructor(object, property, min, max, step) {\n super(object, property, { min: min, max: max, step: step });\n\n const _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n dom.bind(this.__background, 'touchstart', onTouchStart);\n\n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n document.activeElement.blur();\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n e.preventDefault();\n\n const bgRect = _this.__background.getBoundingClientRect();\n\n _this.setValue(\n map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)\n );\n\n return false;\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onTouchStart(e) {\n if (e.touches.length !== 1) { return; }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n\n function onTouchMove(e) {\n const clientX = e.touches[0].clientX;\n const bgRect = _this.__background.getBoundingClientRect();\n\n _this.setValue(\n map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)\n );\n }\n\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n }\n\n updateDisplay() {\n const pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return super.updateDisplay();\n }\n}\n\nexport default NumberControllerSlider;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass FunctionController extends Controller {\n constructor(object, property, text) {\n super(object, property);\n\n const _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n }\n\n fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n}\n\nexport default FunctionController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\nimport Color from '../color/Color';\nimport interpret from '../color/interpret';\nimport common from '../utils/common';\n\n/**\n * @class Represents a given property of an object that is a color.\n * @param {Object} object\n * @param {string} property\n */\nclass ColorController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n const _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(/* e */) {\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(/* e */) {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n\n dom.bind(this.__selector, 'touchstart', function(/* e */) {\n dom\n .addClass(this, 'drag')\n .bind(window, 'touchend', function(/* e */) {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n\n const valueField = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n\n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__saturation_field, 'touchstart', fieldDown);\n\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'touchstart', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', fieldDownH);\n dom.bind(this.__hue_field, 'touchstart', fieldDownH);\n\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n\n function onBlur() {\n const i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n\n this.__saturation_field.appendChild(valueField);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) { e.preventDefault(); }\n\n const fieldRect = _this.__saturation_field.getBoundingClientRect();\n const { clientX, clientY } = (e.touches && e.touches[0]) || e;\n let s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n let v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n }\n\n function setH(e) {\n if (e.type.indexOf('touch') === -1) { e.preventDefault(); }\n\n const fieldRect = _this.__hue_field.getBoundingClientRect();\n const { clientY } = (e.touches && e.touches[0]) || e;\n let h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n }\n }\n\n updateDisplay() {\n const i = interpret(this.getValue());\n\n if (i !== false) {\n let mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) && !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n const flip = (this.__color.v < 0.5 || this.__color.s > 0.5) ? 255 : 0;\n const _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n\n this.__input.value = this.__color.toString();\n\n common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n}\n\nconst vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\n\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\n\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nexport default ColorController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nconst css = {\n load: function(url, indoc) {\n const doc = indoc || document;\n const link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n\n inject: function(cssContent, indoc) {\n const doc = indoc || document;\n const injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n const head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) { // Unable to inject CSS, probably because of a Content Security Policy\n }\n }\n};\n\nexport default css;\n","const saveDialogContents = `
\n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n
`;\n\nexport default saveDialogContents;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport OptionController from './OptionController';\nimport NumberControllerBox from './NumberControllerBox';\nimport NumberControllerSlider from './NumberControllerSlider';\nimport StringController from './StringController';\nimport FunctionController from './FunctionController';\nimport BooleanController from './BooleanController';\nimport common from '../utils/common';\n\nconst ControllerFactory = function(object, property) {\n const initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n if (common.isNumber(initialValue)) {\n // Has min and max? (slider)\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n // has step?\n if (common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property,\n arguments[2], arguments[3], arguments[4]);\n }\n\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n\n // number box\n if (common.isNumber(arguments[4])) { // has step\n return new NumberControllerBox(object, property,\n { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n return null;\n};\n\nexport default ControllerFactory;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\n\nexport default window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n requestAnimationFrame;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nclass CenteredDiv {\n constructor() {\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n const _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n }\n\n show() {\n const _this = this;\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n\n /**\n * Hide centered div\n */\n hide() {\n const _this = this;\n\n const hide = function() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n\n layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n}\n\nexport default CenteredDiv;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport css from '../utils/css';\nimport saveDialogueContents from './saveDialogue.html';\nimport ControllerFactory from '../controllers/ControllerFactory';\nimport Controller from '../controllers/Controller';\nimport BooleanController from '../controllers/BooleanController';\nimport FunctionController from '../controllers/FunctionController';\nimport NumberControllerBox from '../controllers/NumberControllerBox';\nimport NumberControllerSlider from '../controllers/NumberControllerSlider';\nimport ColorController from '../controllers/ColorController';\nimport requestAnimationFrame from '../utils/requestAnimationFrame';\nimport CenteredDiv from '../dom/CenteredDiv';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nimport styleSheet from './style.scss'; // CSS to embed in build\n\ncss.inject(styleSheet);\n\n/** @ignore Outer-most className for GUI's */\nconst CSS_NAMESPACE = 'dg';\n\nconst HIDE_KEY_CODE = 72;\n\n/** @ignore The only value shared between the JS and SCSS. Use caution. */\nconst CLOSE_BUTTON_HEIGHT = 20;\n\nconst DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\nconst SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}());\n\nlet SAVE_DIALOGUE;\n\n/** @ignore Have we yet to create an autoPlace GUI? */\nlet autoPlaceVirgin = true;\n\n/** @ignore Fixed position div that auto place GUI's go inside */\nlet autoPlaceContainer;\n\n/** @ignore Are we hiding the GUI's ? */\nlet hide = false;\n\n/** @private GUI's which should be hidden */\nconst hideableGuis = [];\n\n/**\n * @class A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n *\n * @typicalname gui\n *\n * @example\n * // Creating a GUI with options.\n * var gui = new dat.GUI({name: 'My GUI'});\n *\n * @example\n * // Creating a GUI and a subfolder.\n * var gui = new dat.GUI();\n * var folder1 = gui.addFolder('Flow Field');\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.autoPlace=true]\n * @param {Boolean} [params.hideable=true] If true, GUI is shown/hidden by h keypress.\n * @param {Boolean} [params.closed=false] If true, starts closed\n * @param {Boolean} [params.closeOnTop=false] If true, close/open button shows on top of the GUI\n */\nconst GUI = function(pars) {\n const _this = this;\n\n let params = pars || {};\n\n /**\n * Outermost DOM Element\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n // Default parameters\n params = common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n if (!common.isUndefined(params.load)) {\n // Explicit preset\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n let useLocalStorage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n let saveToLocalStorage;\n let titleRow;\n\n Object.defineProperties(this,\n /** @lends GUI.prototype */\n {\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * Handles GUI's position of open/close button\n * @type Boolean\n */\n closeOnTop: {\n get: function() {\n return params.closeOnTop;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n\n return params.load.preset;\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return useLocalStorage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n\n const savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n\n dom.bind(this.__closeButton, 'click', function() {\n _this.closed = !_this.closed;\n });\n // Oh, you're a nested GUI!\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n const titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n\n titleRow = addRow(_this, titleRowName);\n\n const onClickTitle = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n\n if (!params.closed) {\n this.closed = false;\n }\n }\n\n if (params.autoPlace) {\n if (common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n\n // Put it in the dom for you.\n autoPlaceContainer.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n\n\n // Make it not elastic.\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n\n this.__resizeHandler = function() {\n _this.onResizeDebounced();\n };\n\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n saveToLocalStorage = function() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n\n // expose this method publicly\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n\n function resetWidth() {\n const root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n};\n\nGUI.toggleHide = function() {\n hide = !hide;\n common.each(hideableGuis, function(gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\n\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\n\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\n\nGUI._keydownHandler = function(e) {\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\n\ncommon.extend(\n GUI.prototype,\n\n /** @lends GUI.prototype */\n {\n\n /**\n * Adds a new {@link Controller} to the GUI. The type of controller created\n * is inferred from the initial value of object[property]. For\n * color properties, see {@link addColor}.\n *\n * @param {Object} object The object to be manipulated\n * @param {String} property The name of the property to be manipulated\n * @param {Number} [min] Minimum allowed value\n * @param {Number} [max] Maximum allowed value\n * @param {Number} [step] Increment by which to change value\n * @returns {Controller} The controller that was added to the GUI.\n * @instance\n *\n * @example\n * // Add a string controller.\n * var person = {name: 'Sam'};\n * gui.add(person, 'name');\n *\n * @example\n * // Add a number controller slider.\n * var person = {age: 45};\n * gui.add(person, 'age', 0, 100);\n */\n add: function(object, property) {\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n },\n\n /**\n * Adds a new color controller to the GUI.\n *\n * @param object\n * @param property\n * @returns {Controller} The controller that was added to the GUI.\n * @instance\n *\n * @example\n * var palette = {\n * color1: '#FF0000', // CSS string\n * color2: [ 0, 128, 255 ], // RGB array\n * color3: [ 0, 128, 255, 0.3 ], // RGB with alpha\n * color4: { h: 350, s: 0.9, v: 0.3 } // Hue, saturation, value\n * };\n * gui.addColor(palette, 'color1');\n * gui.addColor(palette, 'color2');\n * gui.addColor(palette, 'color3');\n * gui.addColor(palette, 'color4');\n */\n addColor: function(object, property) {\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n },\n\n /**\n * Removes the given controller from the GUI.\n * @param {Controller} controller\n * @instance\n */\n remove: function(controller) {\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n const _this = this;\n common.defer(function() {\n _this.onResize();\n });\n },\n\n /**\n * Removes the root GUI from the document and unbinds all event listeners.\n * For subfolders, use `gui.removeFolder(folder)` instead.\n * @instance\n */\n destroy: function() {\n if (this.parent) {\n throw new Error(\n 'Only the root GUI should be removed with .destroy(). ' +\n 'For subfolders, use gui.removeFolder(folder) instead.'\n );\n }\n\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n\n const _this = this;\n common.each(this.__folders, function(subfolder) {\n _this.removeFolder(subfolder);\n });\n\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n\n removeListeners(this);\n },\n\n /**\n * Creates a new subfolder GUI instance.\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n const newGuiParams = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n newGuiParams.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n // Start me closed if I was closed\n newGuiParams.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n newGuiParams.load = this.load.folders[name];\n }\n\n const gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n\n const li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n\n /**\n * Removes a subfolder GUI instance.\n * @param {dat.gui.GUI} folder The folder to remove.\n * @instance\n */\n removeFolder: function(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n\n delete this.__folders[folder.name];\n\n // Do we have saved appearance data for this folder?\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n\n removeListeners(folder);\n\n const _this = this;\n\n common.each(folder.__folders, function(subfolder) {\n folder.removeFolder(subfolder);\n });\n\n common.defer(function() {\n _this.onResize();\n });\n },\n\n /**\n * Opens the GUI.\n */\n open: function() {\n this.closed = false;\n },\n\n /**\n * Closes the GUI.\n */\n close: function() {\n this.closed = true;\n },\n\n /**\n * Hides the GUI.\n */\n hide: function() {\n this.domElement.style.display = 'none';\n },\n\n /**\n * Shows the GUI.\n */\n show: function() {\n this.domElement.style.display = '';\n },\n\n\n onResize: function() {\n // we debounce this function to prevent performance issues when rotating on tablet/mobile\n const root = this.getRoot();\n if (root.scrollable) {\n const top = dom.getOffset(root.__ul).top;\n let h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n\n onResizeDebounced: common.debounce(function() { this.onResize(); }, 50),\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {...Object} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n * @ignore\n */\n remember: function() {\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n\n const _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n let gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n const toReturn = this.load;\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n },\n\n save: function() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n\n saveAs: function(presetName) {\n if (!this.load.remembered) {\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n\n revert: function(gui) {\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n\n // fire onFinishChange callback\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n\n listen: function(controller) {\n const init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n\n updateDisplay: function() {\n common.each(this.__controllers, function(controller) {\n controller.updateDisplay();\n });\n common.each(this.__folders, function(folder) {\n folder.updateDisplay();\n });\n }\n }\n);\n\n/**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [newDom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n *\n * @ignore\n */\nfunction addRow(gui, newDom, liBefore) {\n const li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\n\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\n\nfunction markPresetModified(gui, modified) {\n const opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\n\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, /** @lends Controller.prototype */ {\n /**\n * @param {Array|Object} options\n * @return {Controller}\n */\n options: function(options) {\n if (arguments.length > 1) {\n const nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: nextSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n const nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: nextSibling,\n factoryArgs: [options]\n }\n );\n }\n },\n\n /**\n * Sets the name of the controller.\n * @param {string} name\n * @return {Controller}\n */\n name: function(name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = name;\n return controller;\n },\n\n /**\n * Sets controller to listen for changes on its underlying object.\n * @return {Controller}\n */\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n /**\n * Removes the controller from its parent GUI.\n * @return {Controller}\n */\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n const box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function(method) {\n const pc = controller[method];\n const pb = box[method];\n controller[method] = box[method] = function() {\n const args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n const r = function(returned) {\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n // Well, then lets just replace this with a slider.\n\n // lets remember if the old controller had a specific name or was listening\n const oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n const wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n\n controller.remove();\n const newController = add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n newController.name(oldName);\n if (wasListening) newController.listen();\n\n return newController;\n }\n\n return returned;\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n }\n\n controller.setValue = common.compose(function(val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n\n return val;\n }, controller.setValue);\n}\n\nfunction recallSavedValue(gui, controller) {\n // Find the topmost GUI, that's where remembered objects live.\n const root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n const matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matchedIndex !== -1) {\n // Let me fetch a map of controllers for thcommon.isObject.\n let controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] =\n controllerMap;\n }\n\n // Keep track of this controller\n controllerMap[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n const presetMap = root.load.remembered;\n\n // Which preset are we trying to load?\n let preset;\n\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n // Uhh, you can have the default instead?\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n // Nada.\n return;\n }\n\n // Did the loaded object remember thcommon.isObject? && Did we remember this particular property?\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n // We did remember something for this guy ...\n const value = preset[matchedIndex][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\n\nfunction add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error(`Object \"${object}\" has no property \"${property}\"`);\n }\n\n let controller;\n\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n const factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n const name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n const container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n const li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, typeof controller.getValue());\n }\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n}\n\nfunction getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n}\n\nfunction addPresetOption(gui, name, setSelected) {\n const opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\n\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\n\nfunction addSaveMenu(gui) {\n const div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n const gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n const button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n const button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n const button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n const select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n for (let index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n const explain = document.getElementById('dg-local-explain');\n const localStorageCheckBox = document.getElementById('dg-local-storage');\n const saveLocally = document.getElementById('dg-save-locally');\n\n saveLocally.style.display = 'block';\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n showHideExplain(gui, explain);\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n\n const newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n const presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n // div.appendChild(button2);\n}\n\nfunction addResizeHandle(gui) {\n let pmouseX;\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n // border: '1px solid blue'\n\n });\n\n function drag(e) {\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n }\n\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n\n function dragStart(e) {\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n }\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\n\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\n\nfunction getCurrentPreset(gui, useInitialValues) {\n const toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n const savedValues = {};\n\n // The controllers I've made for thcommon.isObject by property\n const controllerMap =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controllerMap, function(controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = savedValues;\n });\n\n return toReturn;\n}\n\nfunction setPresetSelectIndex(gui) {\n for (let index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\n\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame.call(window, function() {\n updateDisplays(controllerArray);\n });\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n}\n\nexport default GUI;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Color from './color/Color';\nimport math from './color/math';\nimport interpret from './color/interpret';\n\nimport Controller from './controllers/Controller';\nimport BooleanController from './controllers/BooleanController';\nimport OptionController from './controllers/OptionController';\nimport StringController from './controllers/StringController';\nimport NumberController from './controllers/NumberController';\nimport NumberControllerBox from './controllers/NumberControllerBox';\nimport NumberControllerSlider from './controllers/NumberControllerSlider';\nimport FunctionController from './controllers/FunctionController';\nimport ColorController from './controllers/ColorController';\n\nimport domImport from './dom/dom';\nimport GUIImport from './gui/GUI';\n\nexport const color = {\n Color: Color,\n math: math,\n interpret: interpret\n};\n\nexport const controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\n\nexport const dom = { dom: domImport };\n\nexport const gui = { GUI: GUIImport };\n\nexport const GUI = GUIImport;\n\nexport default {\n color,\n controllers,\n dom,\n gui,\n GUI\n};\n"],"names":["color","forceCSSHex","colorFormat","__state","conversionName","toString","r","Math","round","g","b","a","h","s","toFixed","v","str","hex","length","ARR_EACH","Array","prototype","forEach","ARR_SLICE","slice","Common","target","each","call","arguments","obj","keys","isObject","Object","key","isUndefined","bind","toCall","args","i","apply","itr","scope","l","BREAK","fnc","func","threshold","callImmediately","timeout","delayed","callNow","setTimeout","toArray","undefined","isNaN","isArray","constructor","INTERPRETATIONS","common","isString","original","test","match","parseInt","parseFloat","isNumber","result","toReturn","interpret","family","litmus","conversions","conversion","read","tmpComponent","ColorMath","hi","floor","f","p","q","t","c","min","max","delta","NaN","hex_with_component","componentIndex","value","Color","Error","colorToString","write","defineRGBComponent","component","componentHexIndex","defineProperty","space","recalculateRGB","defineHSVComponent","recalculateHSV","math","component_from_hex","extend","hsv_to_rgb","rgb_to_hsv","COMPONENTS","rgb_to_hex","Controller","object","property","initialValue","domElement","document","createElement","__onChange","__onFinishChange","newValue","updateDisplay","getValue","EVENT_MAP","EVENT_MAP_INV","k","e","CSS_VALUE_PIXELS","cssValueToPixels","val","isNull","dom","elem","selectable","style","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","hor","vert","vertical","horizontal","position","left","right","top","bottom","eventType","pars","aux","params","className","evt","createEvent","clientX","x","clientY","y","initMouseEvent","bubbles","cancelable","window","clickCount","init","initKeyboardEvent","initKeyEvent","defaults","ctrlKey","altKey","shiftKey","metaKey","keyCode","charCode","initEvent","dispatchEvent","event","newBool","bool","addEventListener","attachEvent","removeEventListener","detachEvent","classes","split","indexOf","push","join","replace","removeAttribute","index","splice","RegExp","getComputedStyle","width","height","el","offset","offsetParent","offsetLeft","offsetTop","activeElement","type","href","BooleanController","_this","__prev","__checkbox","setAttribute","onChange","setValue","appendChild","checked","OptionController","opts","options","__select","map","element","opt","innerHTML","desiredValue","selectedIndex","isActive","StringController","__input","onBlur","blur","numDecimals","_x","NumberController","_params","__min","__max","__step","step","__impliedStep","pow","log","abs","LN10","__precision","_v","minValue","maxValue","stepValue","roundToDecimal","decimals","tenTo","NumberControllerBox","__truncationSuspended","prevY","attempted","onFinish","onMouseDrag","diff","onMouseUp","unbind","onMouseDown","i1","i2","o1","o2","NumberControllerSlider","__background","__foreground","onTouchStart","addClass","preventDefault","bgRect","getBoundingClientRect","touches","onTouchMove","onTouchEnd","pct","FunctionController","text","__button","fire","ColorController","__color","__temp","makeSelectable","__selector","__saturation_field","__field_knob","__field_knob_border","__hue_knob","__hue_field","__input_textShadow","removeClass","valueField","fieldDown","fieldDownH","setSV","fieldUpSV","setH","fieldUpH","toOriginal","fieldRect","mismatch","flip","_flip","toHexString","marginTop","vendors","linearGradient","background","vendor","cssText","hueGradient","css","url","indoc","doc","link","rel","getElementsByTagName","cssContent","injected","head","saveDialogContents","ControllerFactory","isFunction","isBoolean","requestAnimationFrame","callback","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","CenteredDiv","backgroundElement","makeFullscreen","body","hide","display","opacity","webkitTransform","layout","defer","innerWidth","getWidth","innerHeight","getHeight","inject","styleSheet","CSS_NAMESPACE","HIDE_KEY_CODE","CLOSE_BUTTON_HEIGHT","DEFAULT_DEFAULT_PRESET_NAME","SUPPORTS_LOCAL_STORAGE","localStorage","SAVE_DIALOGUE","autoPlaceVirgin","autoPlaceContainer","hideableGuis","GUI","__ul","__folders","__controllers","__rememberedObjects","__rememberedObjectIndecesToControllers","__listening","DEFAULT_WIDTH","autoPlace","load","preset","parent","hideable","resizable","scrollable","useLocalStorage","getItem","getLocalStorageHash","saveToLocalStorage","titleRow","defineProperties","closeOnTop","getRoot","revert","name","closed","CLASS_CLOSED","onResize","__closeButton","TEXT_OPEN","TEXT_CLOSED","setItem","CLASS_MAIN","savedGui","JSON","parse","CLASS_CLOSE_BUTTON","CLASS_CLOSE_TOP","insertBefore","childNodes","CLASS_CLOSE_BOTTOM","titleRowName","createTextNode","addRow","onClickTitle","CLASS_AUTO_PLACE_CONTAINER","CLASS_AUTO_PLACE","__resizeHandler","onResizeDebounced","stringify","getSaveObject","saveToLocalStorageIfPossible","resetWidth","root","toggleHide","gui","CLASS_CONTROLLER_ROW","CLASS_TOO_TALL","CLASS_DRAG","_keydownHandler","which","add","controller","removeChild","__li","subfolder","removeFolder","newGuiParams","folders","li","folder","parentElement","getOffset","node","__save_row","__resize_handle","offsetHeight","debounce","saveDialogueContents","remembered","getCurrentPreset","presetName","newDom","liBefore","removeListeners","markPresetModified","modified","__preset_select","augmentController","__gui","nextSibling","nextElementSibling","remove","firstElementChild","listen","box","method","pc","pb","returned","oldName","wasListening","newController","compose","fakeEvent","stopPropagation","borderLeftColor","isModified","recallSavedValue","matchedIndex","controllerMap","presetMap","factoryArgs","concat","before","container","location","addPresetOption","setSelected","showHideExplain","explain","addSaveMenu","div","firstChild","gears","button","button2","button3","select","getElementById","localStorageCheckBox","saveLocally","newConstructorTextArea","show","focus","save","prompt","saveAs","addResizeHandle","pmouseX","drag","dragStop","dragStart","setWidth","w","useInitialValues","savedValues","setPresetSelectIndex","updateDisplays","controllerArray","controllers","domImport","GUIImport"],"mappings":"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"} \ No newline at end of file diff --git a/public/index.html b/public/index.html index a5cc49bed..08b46fe0a 100644 --- a/public/index.html +++ b/public/index.html @@ -14,7 +14,7 @@ - + diff --git a/public/js/myGui.js b/public/js/myGui.js index bc6ceadd5..ae348a072 100644 --- a/public/js/myGui.js +++ b/public/js/myGui.js @@ -11,6 +11,6 @@ let FizzyText = function() { this.message = 'dat.gui'; this.speed = 0.8; this.displayOutline = false; - this.explode = function() { ... }; + this.explode = function() { alert('Bang!'); }; // Define render logic ... } From be1c83cfd4e1d9628ff7f71569e1f976929d2232 Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 13:34:53 -0400 Subject: [PATCH 21/54] trying to show gui --- public/index.html | 4 ++-- public/js/myGui.js | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/public/index.html b/public/index.html index 08b46fe0a..0dfc6347c 100644 --- a/public/index.html +++ b/public/index.html @@ -16,9 +16,9 @@ - + - + creative coding -- a4-hcaouette -- CS4241 Assignment 4 diff --git a/public/js/myGui.js b/public/js/myGui.js index ae348a072..210b03ac9 100644 --- a/public/js/myGui.js +++ b/public/js/myGui.js @@ -1,6 +1,8 @@ window.onload = function() { var text = new FizzyText(); - var gui = new dat.GUI(); + var gui = new DAT.GUI({ + height : 5 * 32 - 1 +}); gui.add(text, 'message'); gui.add(text, 'speed', -5, 5); gui.add(text, 'displayOutline'); From 5fea76ee841a8c7ccd50ed6c9c12cdb25262a9d5 Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 13:36:18 -0400 Subject: [PATCH 22/54] moving build --- {build => public/build}/dat.gui.css | 0 {build => public/build}/dat.gui.js | 0 {build => public/build}/dat.gui.js.map | 0 {build => public/build}/dat.gui.min.js | 0 {build => public/build}/dat.gui.module.js | 0 {build => public/build}/dat.gui.module.js.map | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename {build => public/build}/dat.gui.css (100%) rename {build => public/build}/dat.gui.js (100%) rename {build => public/build}/dat.gui.js.map (100%) rename {build => public/build}/dat.gui.min.js (100%) rename {build => public/build}/dat.gui.module.js (100%) rename {build => public/build}/dat.gui.module.js.map (100%) diff --git a/build/dat.gui.css b/public/build/dat.gui.css similarity index 100% rename from build/dat.gui.css rename to public/build/dat.gui.css diff --git a/build/dat.gui.js b/public/build/dat.gui.js similarity index 100% rename from build/dat.gui.js rename to public/build/dat.gui.js diff --git a/build/dat.gui.js.map b/public/build/dat.gui.js.map similarity index 100% rename from build/dat.gui.js.map rename to public/build/dat.gui.js.map diff --git a/build/dat.gui.min.js b/public/build/dat.gui.min.js similarity index 100% rename from build/dat.gui.min.js rename to public/build/dat.gui.min.js diff --git a/build/dat.gui.module.js b/public/build/dat.gui.module.js similarity index 100% rename from build/dat.gui.module.js rename to public/build/dat.gui.module.js diff --git a/build/dat.gui.module.js.map b/public/build/dat.gui.module.js.map similarity index 100% rename from build/dat.gui.module.js.map rename to public/build/dat.gui.module.js.map From 4701a39bd0714ea160bef0e6d1a29369274d5c16 Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 13:40:01 -0400 Subject: [PATCH 23/54] js in head --- public/index.html | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/public/index.html b/public/index.html index 0dfc6347c..e242053e6 100644 --- a/public/index.html +++ b/public/index.html @@ -14,11 +14,31 @@ - + - + + creative coding -- a4-hcaouette -- CS4241 Assignment 4 From e8cb2cea4715928657cd5cdafb2cc46e3f0f0f08 Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 13:57:06 -0400 Subject: [PATCH 24/54] trying stuff --- public/dat.gui-master/.babelrc | 7 + public/dat.gui-master/.gitignore | 5 + public/dat.gui-master/API.md | 487 + public/dat.gui-master/CHANGELOG.md | 64 + public/dat.gui-master/LICENSE | 202 + public/dat.gui-master/README.md | 67 + public/dat.gui-master/bower.json | 24 + public/{ => dat.gui-master}/build/dat.gui.css | 0 public/{ => dat.gui-master}/build/dat.gui.js | 0 .../{ => dat.gui-master}/build/dat.gui.js.map | 0 .../{ => dat.gui-master}/build/dat.gui.min.js | 0 .../build/dat.gui.module.js | 0 .../build/dat.gui.module.js.map | 0 public/dat.gui-master/example.html | 63 + public/dat.gui-master/licenseBanner.txt | 12 + public/dat.gui-master/package.json | 74 + public/dat.gui-master/rollup.config.js | 55 + public/dat.gui-master/rollup.config.min.js | 38 + public/dat.gui-master/src/dat/color/Color.js | 153 + .../dat.gui-master/src/dat/color/interpret.js | 300 + public/dat.gui-master/src/dat/color/math.js | 93 + .../dat.gui-master/src/dat/color/toString.js | 52 + .../src/dat/controllers/BooleanController.js | 70 + .../src/dat/controllers/ColorController.js | 341 + .../src/dat/controllers/Controller.js | 125 + .../src/dat/controllers/ControllerFactory.js | 66 + .../src/dat/controllers/FunctionController.js | 56 + .../src/dat/controllers/NumberController.js | 120 + .../dat/controllers/NumberControllerBox.js | 116 + .../dat/controllers/NumberControllerSlider.js | 118 + .../src/dat/controllers/OptionController.js | 85 + .../src/dat/controllers/StringController.js | 68 + .../dat.gui-master/src/dat/dom/CenteredDiv.js | 104 + public/dat.gui-master/src/dat/dom/dom.js | 292 + public/dat.gui-master/src/dat/gui/GUI.js | 1409 +++ .../src/dat/gui/_structure.scss | 300 + .../src/dat/gui/saveDialogue.html.js | 23 + public/dat.gui-master/src/dat/gui/style.scss | 202 + public/dat.gui-master/src/dat/index.js | 61 + public/dat.gui-master/src/dat/utils/common.js | 157 + public/dat.gui-master/src/dat/utils/css.js | 37 + .../src/dat/utils/requestAnimationFrame.js | 23 + public/dat.gui-master/tests/index.html | 1450 +++ public/dat.gui-master/tests/jquery.js | 9046 +++++++++++++++++ public/dat.gui-master/tests/qunit.css | 226 + public/dat.gui-master/tests/qunit.js | 1587 +++ 46 files changed, 17778 insertions(+) create mode 100644 public/dat.gui-master/.babelrc create mode 100644 public/dat.gui-master/.gitignore create mode 100644 public/dat.gui-master/API.md create mode 100644 public/dat.gui-master/CHANGELOG.md create mode 100644 public/dat.gui-master/LICENSE create mode 100644 public/dat.gui-master/README.md create mode 100644 public/dat.gui-master/bower.json rename public/{ => dat.gui-master}/build/dat.gui.css (100%) rename public/{ => dat.gui-master}/build/dat.gui.js (100%) rename public/{ => dat.gui-master}/build/dat.gui.js.map (100%) rename public/{ => dat.gui-master}/build/dat.gui.min.js (100%) rename public/{ => dat.gui-master}/build/dat.gui.module.js (100%) rename public/{ => dat.gui-master}/build/dat.gui.module.js.map (100%) create mode 100644 public/dat.gui-master/example.html create mode 100644 public/dat.gui-master/licenseBanner.txt create mode 100644 public/dat.gui-master/package.json create mode 100644 public/dat.gui-master/rollup.config.js create mode 100644 public/dat.gui-master/rollup.config.min.js create mode 100644 public/dat.gui-master/src/dat/color/Color.js create mode 100644 public/dat.gui-master/src/dat/color/interpret.js create mode 100644 public/dat.gui-master/src/dat/color/math.js create mode 100644 public/dat.gui-master/src/dat/color/toString.js create mode 100644 public/dat.gui-master/src/dat/controllers/BooleanController.js create mode 100644 public/dat.gui-master/src/dat/controllers/ColorController.js create mode 100644 public/dat.gui-master/src/dat/controllers/Controller.js create mode 100644 public/dat.gui-master/src/dat/controllers/ControllerFactory.js create mode 100644 public/dat.gui-master/src/dat/controllers/FunctionController.js create mode 100644 public/dat.gui-master/src/dat/controllers/NumberController.js create mode 100644 public/dat.gui-master/src/dat/controllers/NumberControllerBox.js create mode 100644 public/dat.gui-master/src/dat/controllers/NumberControllerSlider.js create mode 100644 public/dat.gui-master/src/dat/controllers/OptionController.js create mode 100644 public/dat.gui-master/src/dat/controllers/StringController.js create mode 100644 public/dat.gui-master/src/dat/dom/CenteredDiv.js create mode 100644 public/dat.gui-master/src/dat/dom/dom.js create mode 100644 public/dat.gui-master/src/dat/gui/GUI.js create mode 100644 public/dat.gui-master/src/dat/gui/_structure.scss create mode 100644 public/dat.gui-master/src/dat/gui/saveDialogue.html.js create mode 100644 public/dat.gui-master/src/dat/gui/style.scss create mode 100644 public/dat.gui-master/src/dat/index.js create mode 100644 public/dat.gui-master/src/dat/utils/common.js create mode 100644 public/dat.gui-master/src/dat/utils/css.js create mode 100644 public/dat.gui-master/src/dat/utils/requestAnimationFrame.js create mode 100644 public/dat.gui-master/tests/index.html create mode 100644 public/dat.gui-master/tests/jquery.js create mode 100644 public/dat.gui-master/tests/qunit.css create mode 100644 public/dat.gui-master/tests/qunit.js diff --git a/public/dat.gui-master/.babelrc b/public/dat.gui-master/.babelrc new file mode 100644 index 000000000..16c30ec35 --- /dev/null +++ b/public/dat.gui-master/.babelrc @@ -0,0 +1,7 @@ +{ + "presets": [ + ["env", { + "modules": false + }] + ] +} diff --git a/public/dat.gui-master/.gitignore b/public/dat.gui-master/.gitignore new file mode 100644 index 000000000..516a13dfd --- /dev/null +++ b/public/dat.gui-master/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +.sass-cache +.idea/ +node_modules/ +tmp/ diff --git a/public/dat.gui-master/API.md b/public/dat.gui-master/API.md new file mode 100644 index 000000000..8d18170d1 --- /dev/null +++ b/public/dat.gui-master/API.md @@ -0,0 +1,487 @@ +# dat.GUI API + +Details about the classes, methods, and properties provided by dat.GUI. For more +hands-on examples, see the dat.GUI [tutorial](http://workshop.chromeexperiments.com/examples/gui). + + + +## Classes + +
+
GUI
+

A lightweight controller library for JavaScript. It allows you to easily +manipulate variables and fire functions on the fly.

+
+
Controller
+

An "abstract" class that represents a given property of an object.

+
+
NumberControllerdat.controllers.Controller
+

Represents a given property of an object that is a number.

+
+
+ + + +## GUI +A lightweight controller library for JavaScript. It allows you to easily +manipulate variables and fire functions on the fly. + +**Kind**: global class + +* [GUI](#GUI) + * [new GUI([params])](#new_GUI_new) + * [.domElement](#GUI+domElement) : DOMElement + * [.parent](#GUI+parent) : dat.gui.GUI + * [.autoPlace](#GUI+autoPlace) : Boolean + * [.closeOnTop](#GUI+closeOnTop) : Boolean + * [.preset](#GUI+preset) : String + * [.width](#GUI+width) : Number + * [.name](#GUI+name) : String + * [.closed](#GUI+closed) : Boolean + * [.load](#GUI+load) : Object + * [.useLocalStorage](#GUI+useLocalStorage) : Boolean + * [.add(object, property, [min], [max], [step])](#GUI+add) ⇒ [Controller](#Controller) + * [.addColor(object, property)](#GUI+addColor) ⇒ [Controller](#Controller) + * [.remove(controller)](#GUI+remove) + * [.destroy()](#GUI+destroy) + * [.addFolder(name)](#GUI+addFolder) ⇒ dat.gui.GUI + * [.removeFolder(folder)](#GUI+removeFolder) + * [.open()](#GUI+open) + * [.close()](#GUI+close) + * [.hide()](#GUI+hide) + * [.show()](#GUI+show) + * [.getRoot()](#GUI+getRoot) ⇒ dat.gui.GUI + * [.getSaveObject()](#GUI+getSaveObject) ⇒ Object + + + +### new GUI([params]) + +| Param | Type | Default | Description | +| --- | --- | --- | --- | +| [params] | Object | | | +| [params.name] | String | | The name of this GUI. | +| [params.load] | Object | | JSON object representing the saved state of this GUI. | +| [params.parent] | dat.gui.GUI | | The GUI I'm nested in. | +| [params.autoPlace] | Boolean | true | | +| [params.hideable] | Boolean | true | If true, GUI is shown/hidden by h keypress. | +| [params.closed] | Boolean | false | If true, starts closed | +| [params.closeOnTop] | Boolean | false | If true, close/open button shows on top of the GUI | + +**Example** +```js +// Creating a GUI with options. +var gui = new dat.GUI({name: 'My GUI'}); +``` +**Example** +```js +// Creating a GUI and a subfolder. +var gui = new dat.GUI(); +var folder1 = gui.addFolder('Flow Field'); +``` + + +### gui.domElement : DOMElement +Outermost DOM Element + +**Kind**: instance property of [GUI](#GUI) + + +### gui.parent : dat.gui.GUI +The parent GUI + +**Kind**: instance property of [GUI](#GUI) + + +### gui.autoPlace : Boolean +Handles GUI's element placement for you + +**Kind**: instance property of [GUI](#GUI) + + +### gui.closeOnTop : Boolean +Handles GUI's position of open/close button + +**Kind**: instance property of [GUI](#GUI) + + +### gui.preset : String +The identifier for a set of saved values + +**Kind**: instance property of [GUI](#GUI) + + +### gui.width : Number +The width of GUI element + +**Kind**: instance property of [GUI](#GUI) + + +### gui.name : String +The name of GUI. Used for folders. i.e +a folder's name + +**Kind**: instance property of [GUI](#GUI) + + +### gui.closed : Boolean +Whether the GUI is collapsed or not + +**Kind**: instance property of [GUI](#GUI) + + +### gui.load : Object +Contains all presets + +**Kind**: instance property of [GUI](#GUI) + + +### gui.useLocalStorage : Boolean +Determines whether or not to use localStorage as the means for +remembering + +**Kind**: instance property of [GUI](#GUI) + + +### gui.add(object, property, [min], [max], [step]) ⇒ [Controller](#Controller) +Adds a new [Controller](#Controller) to the GUI. The type of controller created +is inferred from the initial value of object[property]. For +color properties, see [addColor](addColor). + +**Kind**: instance method of [GUI](#GUI) +**Returns**: [Controller](#Controller) - The controller that was added to the GUI. + +| Param | Type | Description | +| --- | --- | --- | +| object | Object | The object to be manipulated | +| property | String | The name of the property to be manipulated | +| [min] | Number | Minimum allowed value | +| [max] | Number | Maximum allowed value | +| [step] | Number | Increment by which to change value | + +**Example** +```js +// Add a string controller. +var person = {name: 'Sam'}; +gui.add(person, 'name'); +``` +**Example** +```js +// Add a number controller slider. +var person = {age: 45}; +gui.add(person, 'age', 0, 100); +``` + + +### gui.addColor(object, property) ⇒ [Controller](#Controller) +Adds a new color controller to the GUI. + +**Kind**: instance method of [GUI](#GUI) +**Returns**: [Controller](#Controller) - The controller that was added to the GUI. + +| Param | +| --- | +| object | +| property | + +**Example** +```js +var palette = { + color1: '#FF0000', // CSS string + color2: [ 0, 128, 255 ], // RGB array + color3: [ 0, 128, 255, 0.3 ], // RGB with alpha + color4: { h: 350, s: 0.9, v: 0.3 } // Hue, saturation, value +}; +gui.addColor(palette, 'color1'); +gui.addColor(palette, 'color2'); +gui.addColor(palette, 'color3'); +gui.addColor(palette, 'color4'); +``` + + +### gui.remove(controller) +Removes the given controller from the GUI. + +**Kind**: instance method of [GUI](#GUI) + +| Param | Type | +| --- | --- | +| controller | [Controller](#Controller) | + + + +### gui.destroy() +Removes the root GUI from the document and unbinds all event listeners. +For subfolders, use `gui.removeFolder(folder)` instead. + +**Kind**: instance method of [GUI](#GUI) + + +### gui.addFolder(name) ⇒ dat.gui.GUI +Creates a new subfolder GUI instance. + +**Kind**: instance method of [GUI](#GUI) +**Returns**: dat.gui.GUI - The new folder. +**Throws**: + +- Error if this GUI already has a folder by the specified +name + + +| Param | +| --- | +| name | + + + +### gui.removeFolder(folder) +Removes a subfolder GUI instance. + +**Kind**: instance method of [GUI](#GUI) + +| Param | Type | Description | +| --- | --- | --- | +| folder | dat.gui.GUI | The folder to remove. | + + + +### gui.open() +Opens the GUI. + +**Kind**: instance method of [GUI](#GUI) + + +### gui.close() +Closes the GUI. + +**Kind**: instance method of [GUI](#GUI) + + +### gui.hide() +Hides the GUI. + +**Kind**: instance method of [GUI](#GUI) + + +### gui.show() +Shows the GUI. + +**Kind**: instance method of [GUI](#GUI) + + +### gui.getRoot() ⇒ dat.gui.GUI +**Kind**: instance method of [GUI](#GUI) +**Returns**: dat.gui.GUI - the topmost parent GUI of a nested GUI. + + +### gui.getSaveObject() ⇒ Object +**Kind**: instance method of [GUI](#GUI) +**Returns**: Object - a JSON object representing the current state of +this GUI as well as its remembered properties. + + +## Controller +An "abstract" class that represents a given property of an object. + +**Kind**: global class + +* [Controller](#Controller) + * [new Controller(object, property)](#new_Controller_new) + * [.domElement](#Controller+domElement) : DOMElement + * [.object](#Controller+object) : Object + * [.property](#Controller+property) : String + * [.options(options)](#Controller+options) ⇒ [Controller](#Controller) + * [.name(name)](#Controller+name) ⇒ [Controller](#Controller) + * [.listen()](#Controller+listen) ⇒ [Controller](#Controller) + * [.remove()](#Controller+remove) ⇒ [Controller](#Controller) + * [.onChange(fnc)](#Controller+onChange) ⇒ [Controller](#Controller) + * [.onFinishChange(fnc)](#Controller+onFinishChange) ⇒ [Controller](#Controller) + * [.setValue(newValue)](#Controller+setValue) + * [.getValue()](#Controller+getValue) ⇒ Object + * [.updateDisplay()](#Controller+updateDisplay) ⇒ [Controller](#Controller) + * [.isModified()](#Controller+isModified) ⇒ Boolean + + + +### new Controller(object, property) + +| Param | Type | Description | +| --- | --- | --- | +| object | Object | The object to be manipulated | +| property | string | The name of the property to be manipulated | + + + +### controller.domElement : DOMElement +Those who extend this class will put their DOM elements in here. + +**Kind**: instance property of [Controller](#Controller) + + +### controller.object : Object +The object to manipulate + +**Kind**: instance property of [Controller](#Controller) + + +### controller.property : String +The name of the property to manipulate + +**Kind**: instance property of [Controller](#Controller) + + +### controller.options(options) ⇒ [Controller](#Controller) +**Kind**: instance method of [Controller](#Controller) + +| Param | Type | +| --- | --- | +| options | Array \| Object | + + + +### controller.name(name) ⇒ [Controller](#Controller) +Sets the name of the controller. + +**Kind**: instance method of [Controller](#Controller) + +| Param | Type | +| --- | --- | +| name | string | + + + +### controller.listen() ⇒ [Controller](#Controller) +Sets controller to listen for changes on its underlying object. + +**Kind**: instance method of [Controller](#Controller) + + +### controller.remove() ⇒ [Controller](#Controller) +Removes the controller from its parent GUI. + +**Kind**: instance method of [Controller](#Controller) + + +### controller.onChange(fnc) ⇒ [Controller](#Controller) +Specify that a function fire every time someone changes the value with +this Controller. + +**Kind**: instance method of [Controller](#Controller) +**Returns**: [Controller](#Controller) - this + +| Param | Type | Description | +| --- | --- | --- | +| fnc | function | This function will be called whenever the value is modified via this Controller. | + + + +### controller.onFinishChange(fnc) ⇒ [Controller](#Controller) +Specify that a function fire every time someone "finishes" changing +the value wih this Controller. Useful for values that change +incrementally like numbers or strings. + +**Kind**: instance method of [Controller](#Controller) +**Returns**: [Controller](#Controller) - this + +| Param | Type | Description | +| --- | --- | --- | +| fnc | function | This function will be called whenever someone "finishes" changing the value via this Controller. | + + + +### controller.setValue(newValue) +Change the value of object[property] + +**Kind**: instance method of [Controller](#Controller) + +| Param | Type | Description | +| --- | --- | --- | +| newValue | Object | The new value of object[property] | + + + +### controller.getValue() ⇒ Object +Gets the value of object[property] + +**Kind**: instance method of [Controller](#Controller) +**Returns**: Object - The current value of object[property] + + +### controller.updateDisplay() ⇒ [Controller](#Controller) +Refreshes the visual display of a Controller in order to keep sync +with the object's current value. + +**Kind**: instance method of [Controller](#Controller) +**Returns**: [Controller](#Controller) - this + + +### controller.isModified() ⇒ Boolean +**Kind**: instance method of [Controller](#Controller) +**Returns**: Boolean - true if the value has deviated from initialValue + + +## NumberController ⇐ dat.controllers.Controller +Represents a given property of an object that is a number. + +**Kind**: global class +**Extends**: dat.controllers.Controller + +* [NumberController](#NumberController) ⇐ dat.controllers.Controller + * [new NumberController(object, property, [params])](#new_NumberController_new) + * [.min(minValue)](#NumberController+min) ⇒ dat.controllers.NumberController + * [.max(maxValue)](#NumberController+max) ⇒ dat.controllers.NumberController + * [.step(stepValue)](#NumberController+step) ⇒ dat.controllers.NumberController + + + +### new NumberController(object, property, [params]) + +| Param | Type | Description | +| --- | --- | --- | +| object | Object | The object to be manipulated | +| property | string | The name of the property to be manipulated | +| [params] | Object | Optional parameters | +| [params.min] | Number | Minimum allowed value | +| [params.max] | Number | Maximum allowed value | +| [params.step] | Number | Increment by which to change value | + + + +### numberController.min(minValue) ⇒ dat.controllers.NumberController +Specify a minimum value for object[property]. + +**Kind**: instance method of [NumberController](#NumberController) +**Returns**: dat.controllers.NumberController - this + +| Param | Type | Description | +| --- | --- | --- | +| minValue | Number | The minimum value for object[property] | + + + +### numberController.max(maxValue) ⇒ dat.controllers.NumberController +Specify a maximum value for object[property]. + +**Kind**: instance method of [NumberController](#NumberController) +**Returns**: dat.controllers.NumberController - this + +| Param | Type | Description | +| --- | --- | --- | +| maxValue | Number | The maximum value for object[property] | + + + +### numberController.step(stepValue) ⇒ dat.controllers.NumberController +Specify a step value that dat.controllers.NumberController +increments by. + +**Kind**: instance method of [NumberController](#NumberController) +**Default**: if minimum and maximum specified increment is 1% of the +difference otherwise stepValue is 1 +**Returns**: dat.controllers.NumberController - this + +| Param | Type | Description | +| --- | --- | --- | +| stepValue | Number | The step value for dat.controllers.NumberController | + + diff --git a/public/dat.gui-master/CHANGELOG.md b/public/dat.gui-master/CHANGELOG.md new file mode 100644 index 000000000..622b94d34 --- /dev/null +++ b/public/dat.gui-master/CHANGELOG.md @@ -0,0 +1,64 @@ +## Changelog + +### 0.7.1 + * Fix listener cleanup in .destroy() and .removeFolder(). #177 + +### 0.7.0 + * Changed build system to Rollup, publishing ES6 and UMD modules. #172 + * Added .removeFolder(). #113 #158 + * Added API documentation. #165 + * Improved touch support. #173 + +### 0.6.5 + * Add browserify support. #137 + +### 0.6.4 + * Fixed formatting issue on Windows. #136 + * Fixed issue with color selector getting chopped off at bottom of gui. #136 + +### 0.6.3 + * Added ability to put close button on top of the menu [ex: var gui = new dat.gui.GUI({closeOnTop:true})]. #106 #122 + * Fixed issue with layout not updating on page resize. + * Fixed color picker showing in wrong position on user scroll (long menu). #105 + * Fixed checkbox weirdness while listening. #40 + * Fixed bower issues. #125 + +### 0.6.2 + * Fixed issue with color picker not returning correct values onFinishChange. #116 #117 + * Fixed issue with color picker not showing the correct label for color format. #117 + * Fixed NumberControllerBox onFinishChange event. #112 + * Fixed issue with GUI not being sized correct at start. #111 + +### 0.6.1 + * Fixed issue with color picker not working on a page that has scrolled. #37 + * Fixed issue with sliders created with min()/max() not remembering their name or to listen. #107 + +### 0.6.0 + * Ported to ES6 + * Exported using Universal Module Definition (UMD) for max compatibility (Commonjs, Requirejs, AMD, global var) + * Now using webpack for build + * Optional external CSS file (dat.gui.css) for use on CSP-enabled servers that block unsafe-inline + * Added updateDisplay() to GUI, to update all controls in all folders - https://github.com/dataarts/dat.gui/pull/97 + * Fixed GUI.destroy() to remove all window eventListeners - https://github.com/dataarts/dat.gui/pull/88 + * Fixed performance issue when rotated on tablet/mobile - https://github.com/dataarts/dat.gui/pull/91 + * Fixed issue that prevented user from changing values of controls that are listening - https://github.com/dataarts/dat.gui/issues/100 + * Fixed issues with onFinishChange callbacks on revert - https://github.com/dataarts/dat.gui/pull/103 + * Fixed issues with color selector formatting - https://github.com/dataarts/dat.gui/issues/73 + * Fixed issues with step parameters in sliders - https://github.com/dataarts/dat.gui/issues/74 + * Fixed an issue with colors based on arrays - https://github.com/dataarts/dat.gui/pull/57 + * Fixed factory.js, Step param was not used - https://github.com/dataarts/dat.gui/pull/45 + +### 0.5 + * Moved to requirejs for dependency management. + * Changed global namespace from *DAT* to *dat* (lowercase). + * Added support for color controllers. See [Color Controllers](http://workshop.chromeexperiments.com/examples/gui/#4--Color-Controllers). + * Added support for folders. See [Folders](http://workshop.chromeexperiments.com/examples/gui/#3--Folders). + * Added support for saving named presets. See [Presets](http://workshop.chromeexperiments.com/examples/gui/examples/gui/#6--Presets). + * Removed `height` parameter from GUI constructor. Scrollbar automatically induced when window is too short. + * `dat.GUI.autoPlace` parameter removed. Use `new dat.GUI( { autoPlace: false } )`. See [Custom Placement](http://workshop.chromeexperiments.com/examples/gui/#9--Custom-Placement). + * `gui.autoListen` and `gui.listenAll()` removed. See [Updating The Display Manually](http://workshop.chromeexperiments.com/examples/gui/#11--Updating-the-Display-Manually). + * `dat.GUI.load` removed. See [Saving Values](http://workshop.chromeexperiments.com/examples/gui/#5--Saving-Values). + * Made Controller code completely agnostic of GUI. Controllers can easily be created independent of a GUI panel. + +### 0.4 + * Migrated from GitHub to Google Code. diff --git a/public/dat.gui-master/LICENSE b/public/dat.gui-master/LICENSE new file mode 100644 index 000000000..011119321 --- /dev/null +++ b/public/dat.gui-master/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2014, Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/public/dat.gui-master/README.md b/public/dat.gui-master/README.md new file mode 100644 index 000000000..eb127a57c --- /dev/null +++ b/public/dat.gui-master/README.md @@ -0,0 +1,67 @@ +# dat.GUI +A lightweight graphical user interface for changing variables in JavaScript. + +Get started with dat.GUI by reading the [tutorial](http://workshop.chromeexperiments.com/examples/gui) +or the [API documentation](API.md). + + + +## Packaged Builds +The easiest way to use dat.GUI in your code is by using the built source at `build/dat.gui.min.js`. These built JavaScript files bundle all the necessary dependencies to run dat.GUI. + +In your `head` tag, include the following code: +```html + +``` + +## Installing from npm + +```bash +$ npm install --save dat.gui +``` + +```js +// CommonJS: +const dat = require('dat.gui'); + +// ES6: +import * as dat from 'dat.gui'; + +const gui = new dat.GUI(); +``` + +## Directory Contents + +``` +├── build - Compiled source code. +├── src - Source files. +└── tests - Tests. +``` + +## Building your own dat.GUI + +In the terminal, enter the following: + +``` +$ npm install +$ npm run build +``` + +## npm scripts + +- npm run build - Build development and production version of scripts. +- npm run dev - Build development version of script and watch for changes. + + +## Working with Content Security Policy +If you're using a server with a Content Security Policy in place that blocks 'unsafe-inline', you will have problems when dat.gui.js tries to inject style information. To get around this, load 'build/dat.gui.css' as an external style sheet. + +## Changes +View the [Change Log](CHANGELOG.md) + +## Thanks +The following libraries / open-source projects were used in the development of dat.GUI: + * [Rollup](https://rollupjs.org) + * [Sass](http://sass-lang.com/) + * [Node.js](http://nodejs.org/) + * [QUnit](https://github.com/jquery/qunit) / [jquery](http://jquery.com/) diff --git a/public/dat.gui-master/bower.json b/public/dat.gui-master/bower.json new file mode 100644 index 000000000..194ad2107 --- /dev/null +++ b/public/dat.gui-master/bower.json @@ -0,0 +1,24 @@ +{ + "name": "dat.gui", + "homepage": "https://github.com/dataarts/dat.gui.git", + "authors": [ + "Google Data Arts Team " + ], + "description": "dat.gui is a lightweight controller library for JavaScript.", + "main": "build/dat.gui.js", + "keywords": [ + "controller", + "javascript", + "gui", + "slider" + ], + "license": "Apache License, Version 2.0", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "app/bower_components", + "test", + "tests" + ] +} diff --git a/public/build/dat.gui.css b/public/dat.gui-master/build/dat.gui.css similarity index 100% rename from public/build/dat.gui.css rename to public/dat.gui-master/build/dat.gui.css diff --git a/public/build/dat.gui.js b/public/dat.gui-master/build/dat.gui.js similarity index 100% rename from public/build/dat.gui.js rename to public/dat.gui-master/build/dat.gui.js diff --git a/public/build/dat.gui.js.map b/public/dat.gui-master/build/dat.gui.js.map similarity index 100% rename from public/build/dat.gui.js.map rename to public/dat.gui-master/build/dat.gui.js.map diff --git a/public/build/dat.gui.min.js b/public/dat.gui-master/build/dat.gui.min.js similarity index 100% rename from public/build/dat.gui.min.js rename to public/dat.gui-master/build/dat.gui.min.js diff --git a/public/build/dat.gui.module.js b/public/dat.gui-master/build/dat.gui.module.js similarity index 100% rename from public/build/dat.gui.module.js rename to public/dat.gui-master/build/dat.gui.module.js diff --git a/public/build/dat.gui.module.js.map b/public/dat.gui-master/build/dat.gui.module.js.map similarity index 100% rename from public/build/dat.gui.module.js.map rename to public/dat.gui-master/build/dat.gui.module.js.map diff --git a/public/dat.gui-master/example.html b/public/dat.gui-master/example.html new file mode 100644 index 000000000..2c3d7c3f7 --- /dev/null +++ b/public/dat.gui-master/example.html @@ -0,0 +1,63 @@ + + + + + + + + + + diff --git a/public/dat.gui-master/licenseBanner.txt b/public/dat.gui-master/licenseBanner.txt new file mode 100644 index 000000000..dd7aa97c1 --- /dev/null +++ b/public/dat.gui-master/licenseBanner.txt @@ -0,0 +1,12 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ diff --git a/public/dat.gui-master/package.json b/public/dat.gui-master/package.json new file mode 100644 index 000000000..295f804e0 --- /dev/null +++ b/public/dat.gui-master/package.json @@ -0,0 +1,74 @@ +{ + "name": "dat.gui", + "version": "0.7.6", + "description": "A lightweight graphical user interface for changing variables in JavaScript.", + "main": "build/dat.gui.js", + "module": "build/dat.gui.module.js", + "directories": { + "test": "tests" + }, + "scripts": { + "dev": "concurrently --names \"ROLLUP,HTTP\" -c \"bgBlue.bold,bgGreen.bold\" \"rollup -c -w -m inline\" \"serve --port 8080\"", + "build": "rollup -c && rollup -c rollup.config.min.js", + "build-docs": "jsdoc2md -f src/dat/gui/GUI.js src/dat/controllers/Controller.js src/dat/controllers/NumberController.js | replace-between --target API.md --token API", + "lint": "eslint src", + "preversion": "npm run lint", + "version": "npm run build && git add -A build", + "postversion": "git push && git push --tags && npm publish" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/dataarts/dat.gui.git" + }, + "author": "Data Arts Team, Google", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/dataarts/dat.gui/issues" + }, + "homepage": "https://github.com/dataarts/dat.gui#readme", + "devDependencies": { + "babel-core": "^6.26.3", + "babel-plugin-external-helpers": "^6.22.0", + "babel-preset-env": "^1.7.0", + "concurrently": "^3.5.1", + "eslint": "^3.5.0", + "eslint-config-airbnb-base": "^7.1.0", + "eslint-loader": "^1.5.0", + "eslint-plugin-import": "^1.15.0", + "extend": "^3.0.0", + "jsdoc-to-markdown": "^4.0.1", + "replace-between": "0.0.8", + "rollup": "^0.54.1", + "rollup-plugin-babel": "^3.0.4", + "rollup-plugin-cleanup": "^2.0.1", + "rollup-plugin-node-resolve": "^3.3.0", + "rollup-plugin-sass": "^0.6.1", + "rollup-plugin-uglify": "^2.0.1", + "serve": "^6.5.8" + }, + "eslintConfig": { + "extends": "airbnb-base", + "rules": { + "comma-dangle": 0, + "func-names": 0, + "no-alert": 0, + "no-console": 1, + "no-use-before-define": 0, + "prefer-rest-params": 0, + "prefer-template": 0, + "no-mixed-operators": 0, + "no-undef": 0, + "no-underscore-dangle": 0, + "prefer-arrow-callback": 0, + "space-before-function-paren": 0, + "global-require": 0, + "object-shorthand": 0, + "max-len": 0, + "no-param-reassign": 0, + "consistent-return": 0, + "no-restricted-syntax": 0, + "no-bitwise": 0, + "no-plusplus": 0 + } + } +} diff --git a/public/dat.gui-master/rollup.config.js b/public/dat.gui-master/rollup.config.js new file mode 100644 index 000000000..b97fea125 --- /dev/null +++ b/public/dat.gui-master/rollup.config.js @@ -0,0 +1,55 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import fs from 'fs'; +import path from 'path'; +import resolve from 'rollup-plugin-node-resolve'; +import cleanup from 'rollup-plugin-cleanup'; +import babel from 'rollup-plugin-babel'; +import sass from 'rollup-plugin-sass'; + +const banner = fs.readFileSync(path.join(__dirname, 'licenseBanner.txt')); + +export default { + input: 'src/dat/index.js', + output: [{ + // TODO: Remove default exports, and this line, in v0.8.0. + exports: 'named', + file: './build/dat.gui.js', + format: 'umd', + name: 'dat', + sourcemap: true, + banner: banner + }, { + file: './build/dat.gui.module.js', + format: 'es', + sourcemap: true, + banner: banner + }], + watch: { + include: 'src/**' + }, + plugins: [ + resolve(), + sass({ + insert: true, + output: 'build/dat.gui.css', + options: {outputStyle: 'compressed'} + }), + babel({ + plugins: ['external-helpers'], + exclude: 'node_modules/**' + }), + cleanup() + ] +}; diff --git a/public/dat.gui-master/rollup.config.min.js b/public/dat.gui-master/rollup.config.min.js new file mode 100644 index 000000000..8edb0051c --- /dev/null +++ b/public/dat.gui-master/rollup.config.min.js @@ -0,0 +1,38 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import fs from 'fs'; +import path from 'path'; +import defaultConfig from './rollup.config'; +import uglify from 'rollup-plugin-uglify'; + +const banner = fs.readFileSync(path.join(__dirname, 'licenseBanner.txt')); + +export default Object.assign({}, defaultConfig, { + output: { + // TODO: Remove default exports, and this line, in v0.8.0. + exports: 'named', + file: './build/dat.gui.min.js', + format: 'umd', + name: 'dat', + banner: banner + }, + plugins: [...defaultConfig.plugins, uglify({ + output: { + // Preserve license commenting in minified build. + comments: function(node, comment) { + return comment.type === 'comment2'; + } + } + })] +}); diff --git a/public/dat.gui-master/src/dat/color/Color.js b/public/dat.gui-master/src/dat/color/Color.js new file mode 100644 index 000000000..758801df8 --- /dev/null +++ b/public/dat.gui-master/src/dat/color/Color.js @@ -0,0 +1,153 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import interpret from './interpret'; +import math from './math'; +import colorToString from './toString'; +import common from '../utils/common'; + +class Color { + constructor() { + this.__state = interpret.apply(this, arguments); + + if (this.__state === false) { + throw new Error('Failed to interpret color arguments'); + } + + this.__state.a = this.__state.a || 1; + } + + toString() { + return colorToString(this); + } + + toHexString() { + return colorToString(this, true); + } + + toOriginal() { + return this.__state.conversion.write(this); + } +} + +function defineRGBComponent(target, component, componentHexIndex) { + Object.defineProperty(target, component, { + get: function() { + if (this.__state.space === 'RGB') { + return this.__state[component]; + } + + Color.recalculateRGB(this, component, componentHexIndex); + + return this.__state[component]; + }, + + set: function(v) { + if (this.__state.space !== 'RGB') { + Color.recalculateRGB(this, component, componentHexIndex); + this.__state.space = 'RGB'; + } + + this.__state[component] = v; + } + }); +} + +function defineHSVComponent(target, component) { + Object.defineProperty(target, component, { + get: function() { + if (this.__state.space === 'HSV') { + return this.__state[component]; + } + + Color.recalculateHSV(this); + + return this.__state[component]; + }, + + set: function(v) { + if (this.__state.space !== 'HSV') { + Color.recalculateHSV(this); + this.__state.space = 'HSV'; + } + + this.__state[component] = v; + } + }); +} + + +Color.recalculateRGB = function(color, component, componentHexIndex) { + if (color.__state.space === 'HEX') { + color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex); + } else if (color.__state.space === 'HSV') { + common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); + } else { + throw new Error('Corrupted color state'); + } +}; + +Color.recalculateHSV = function(color) { + const result = math.rgb_to_hsv(color.r, color.g, color.b); + + common.extend(color.__state, + { + s: result.s, + v: result.v + } + ); + + if (!common.isNaN(result.h)) { + color.__state.h = result.h; + } else if (common.isUndefined(color.__state.h)) { + color.__state.h = 0; + } +}; + +Color.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a']; + +defineRGBComponent(Color.prototype, 'r', 2); +defineRGBComponent(Color.prototype, 'g', 1); +defineRGBComponent(Color.prototype, 'b', 0); + +defineHSVComponent(Color.prototype, 'h'); +defineHSVComponent(Color.prototype, 's'); +defineHSVComponent(Color.prototype, 'v'); + +Object.defineProperty(Color.prototype, 'a', { + get: function() { + return this.__state.a; + }, + + set: function(v) { + this.__state.a = v; + } +}); + +Object.defineProperty(Color.prototype, 'hex', { + get: function() { + if (this.__state.space !== 'HEX') { + this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b); + this.__state.space = 'HEX'; + } + + return this.__state.hex; + }, + + set: function(v) { + this.__state.space = 'HEX'; + this.__state.hex = v; + } +}); + +export default Color; diff --git a/public/dat.gui-master/src/dat/color/interpret.js b/public/dat.gui-master/src/dat/color/interpret.js new file mode 100644 index 000000000..451d0d8f0 --- /dev/null +++ b/public/dat.gui-master/src/dat/color/interpret.js @@ -0,0 +1,300 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import toString from './toString'; +import common from '../utils/common'; + +const INTERPRETATIONS = [ + // Strings + { + litmus: common.isString, + conversions: { + THREE_CHAR_HEX: { + read: function(original) { + const test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); + if (test === null) { + return false; + } + + return { + space: 'HEX', + hex: parseInt( + '0x' + + test[1].toString() + test[1].toString() + + test[2].toString() + test[2].toString() + + test[3].toString() + test[3].toString(), 0) + }; + }, + + write: toString + }, + + SIX_CHAR_HEX: { + read: function(original) { + const test = original.match(/^#([A-F0-9]{6})$/i); + if (test === null) { + return false; + } + + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString(), 0) + }; + }, + + write: toString + }, + + CSS_RGB: { + read: function(original) { + const test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) { + return false; + } + + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]) + }; + }, + + write: toString + }, + + CSS_RGBA: { + read: function(original) { + const test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) { + return false; + } + + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]), + a: parseFloat(test[4]) + }; + }, + + write: toString + } + } + }, + + // Numbers + { + litmus: common.isNumber, + + conversions: { + + HEX: { + read: function(original) { + return { + space: 'HEX', + hex: original, + conversionName: 'HEX' + }; + }, + + write: function(color) { + return color.hex; + } + } + + } + + }, + + // Arrays + { + litmus: common.isArray, + conversions: { + RGB_ARRAY: { + read: function(original) { + if (original.length !== 3) { + return false; + } + + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2] + }; + }, + + write: function(color) { + return [color.r, color.g, color.b]; + } + }, + + RGBA_ARRAY: { + read: function(original) { + if (original.length !== 4) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2], + a: original[3] + }; + }, + + write: function(color) { + return [color.r, color.g, color.b, color.a]; + } + } + } + }, + + // Objects + { + litmus: common.isObject, + conversions: { + + RGBA_OBJ: { + read: function(original) { + if (common.isNumber(original.r) && + common.isNumber(original.g) && + common.isNumber(original.b) && + common.isNumber(original.a)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b, + a: original.a + }; + } + return false; + }, + + write: function(color) { + return { + r: color.r, + g: color.g, + b: color.b, + a: color.a + }; + } + }, + + RGB_OBJ: { + read: function(original) { + if (common.isNumber(original.r) && + common.isNumber(original.g) && + common.isNumber(original.b)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b + }; + } + return false; + }, + + write: function(color) { + return { + r: color.r, + g: color.g, + b: color.b + }; + } + }, + + HSVA_OBJ: { + read: function(original) { + if (common.isNumber(original.h) && + common.isNumber(original.s) && + common.isNumber(original.v) && + common.isNumber(original.a)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v, + a: original.a + }; + } + return false; + }, + + write: function(color) { + return { + h: color.h, + s: color.s, + v: color.v, + a: color.a + }; + } + }, + + HSV_OBJ: { + read: function(original) { + if (common.isNumber(original.h) && + common.isNumber(original.s) && + common.isNumber(original.v)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v + }; + } + return false; + }, + + write: function(color) { + return { + h: color.h, + s: color.s, + v: color.v + }; + } + } + } + } +]; + +let result; +let toReturn; + +const interpret = function() { + toReturn = false; + + const original = arguments.length > 1 ? common.toArray(arguments) : arguments[0]; + common.each(INTERPRETATIONS, function(family) { + if (family.litmus(original)) { + common.each(family.conversions, function(conversion, conversionName) { + result = conversion.read(original); + + if (toReturn === false && result !== false) { + toReturn = result; + result.conversionName = conversionName; + result.conversion = conversion; + return common.BREAK; + } + }); + + return common.BREAK; + } + }); + + return toReturn; +}; + +export default interpret; diff --git a/public/dat.gui-master/src/dat/color/math.js b/public/dat.gui-master/src/dat/color/math.js new file mode 100644 index 000000000..e9f02d5bc --- /dev/null +++ b/public/dat.gui-master/src/dat/color/math.js @@ -0,0 +1,93 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +let tmpComponent; + +const ColorMath = { + hsv_to_rgb: function(h, s, v) { + const hi = Math.floor(h / 60) % 6; + + const f = h / 60 - Math.floor(h / 60); + const p = v * (1.0 - s); + const q = v * (1.0 - (f * s)); + const t = v * (1.0 - ((1.0 - f) * s)); + + const c = [ + [v, t, p], + [q, v, p], + [p, v, t], + [p, q, v], + [t, p, v], + [v, p, q] + ][hi]; + + return { + r: c[0] * 255, + g: c[1] * 255, + b: c[2] * 255 + }; + }, + + rgb_to_hsv: function(r, g, b) { + const min = Math.min(r, g, b); + const max = Math.max(r, g, b); + const delta = max - min; + let h; + let s; + + if (max !== 0) { + s = delta / max; + } else { + return { + h: NaN, + s: 0, + v: 0 + }; + } + + if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else { + h = 4 + (r - g) / delta; + } + h /= 6; + if (h < 0) { + h += 1; + } + + return { + h: h * 360, + s: s, + v: max / 255 + }; + }, + + rgb_to_hex: function(r, g, b) { + let hex = this.hex_with_component(0, 2, r); + hex = this.hex_with_component(hex, 1, g); + hex = this.hex_with_component(hex, 0, b); + return hex; + }, + + component_from_hex: function(hex, componentIndex) { + return (hex >> (componentIndex * 8)) & 0xFF; + }, + + hex_with_component: function(hex, componentIndex, value) { + return value << (tmpComponent = componentIndex * 8) | (hex & ~(0xFF << tmpComponent)); + } +}; + +export default ColorMath; diff --git a/public/dat.gui-master/src/dat/color/toString.js b/public/dat.gui-master/src/dat/color/toString.js new file mode 100644 index 000000000..c2a85d8b3 --- /dev/null +++ b/public/dat.gui-master/src/dat/color/toString.js @@ -0,0 +1,52 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +export default function(color, forceCSSHex) { + const colorFormat = color.__state.conversionName.toString(); + + const r = Math.round(color.r); + const g = Math.round(color.g); + const b = Math.round(color.b); + const a = color.a; + const h = Math.round(color.h); + const s = color.s.toFixed(1); + const v = color.v.toFixed(1); + + if (forceCSSHex || (colorFormat === 'THREE_CHAR_HEX') || (colorFormat === 'SIX_CHAR_HEX')) { + let str = color.hex.toString(16); + while (str.length < 6) { + str = '0' + str; + } + return '#' + str; + } else if (colorFormat === 'CSS_RGB') { + return 'rgb(' + r + ',' + g + ',' + b + ')'; + } else if (colorFormat === 'CSS_RGBA') { + return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; + } else if (colorFormat === 'HEX') { + return '0x' + color.hex.toString(16); + } else if (colorFormat === 'RGB_ARRAY') { + return '[' + r + ',' + g + ',' + b + ']'; + } else if (colorFormat === 'RGBA_ARRAY') { + return '[' + r + ',' + g + ',' + b + ',' + a + ']'; + } else if (colorFormat === 'RGB_OBJ') { + return '{r:' + r + ',g:' + g + ',b:' + b + '}'; + } else if (colorFormat === 'RGBA_OBJ') { + return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}'; + } else if (colorFormat === 'HSV_OBJ') { + return '{h:' + h + ',s:' + s + ',v:' + v + '}'; + } else if (colorFormat === 'HSVA_OBJ') { + return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}'; + } + + return 'unknown format'; +} diff --git a/public/dat.gui-master/src/dat/controllers/BooleanController.js b/public/dat.gui-master/src/dat/controllers/BooleanController.js new file mode 100644 index 000000000..ee1dd2d42 --- /dev/null +++ b/public/dat.gui-master/src/dat/controllers/BooleanController.js @@ -0,0 +1,70 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import Controller from './Controller'; +import dom from '../dom/dom'; + +/** + * @class Provides a checkbox input to alter the boolean property of an object. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + */ +class BooleanController extends Controller { + constructor(object, property) { + super(object, property); + + const _this = this; + this.__prev = this.getValue(); + + this.__checkbox = document.createElement('input'); + this.__checkbox.setAttribute('type', 'checkbox'); + + function onChange() { + _this.setValue(!_this.__prev); + } + + dom.bind(this.__checkbox, 'change', onChange, false); + + this.domElement.appendChild(this.__checkbox); + + // Match original value + this.updateDisplay(); + } + + setValue(v) { + const toReturn = super.setValue(v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + this.__prev = this.getValue(); + return toReturn; + } + + updateDisplay() { + if (this.getValue() === true) { + this.__checkbox.setAttribute('checked', 'checked'); + this.__checkbox.checked = true; + this.__prev = true; + } else { + this.__checkbox.checked = false; + this.__prev = false; + } + + return super.updateDisplay(); + } +} + +export default BooleanController; diff --git a/public/dat.gui-master/src/dat/controllers/ColorController.js b/public/dat.gui-master/src/dat/controllers/ColorController.js new file mode 100644 index 000000000..649edaea3 --- /dev/null +++ b/public/dat.gui-master/src/dat/controllers/ColorController.js @@ -0,0 +1,341 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import Controller from './Controller'; +import dom from '../dom/dom'; +import Color from '../color/Color'; +import interpret from '../color/interpret'; +import common from '../utils/common'; + +/** + * @class Represents a given property of an object that is a color. + * @param {Object} object + * @param {string} property + */ +class ColorController extends Controller { + constructor(object, property) { + super(object, property); + + this.__color = new Color(this.getValue()); + this.__temp = new Color(0); + + const _this = this; + + this.domElement = document.createElement('div'); + + dom.makeSelectable(this.domElement, false); + + this.__selector = document.createElement('div'); + this.__selector.className = 'selector'; + + this.__saturation_field = document.createElement('div'); + this.__saturation_field.className = 'saturation-field'; + + this.__field_knob = document.createElement('div'); + this.__field_knob.className = 'field-knob'; + this.__field_knob_border = '2px solid '; + + this.__hue_knob = document.createElement('div'); + this.__hue_knob.className = 'hue-knob'; + + this.__hue_field = document.createElement('div'); + this.__hue_field.className = 'hue-field'; + + this.__input = document.createElement('input'); + this.__input.type = 'text'; + this.__input_textShadow = '0 1px 1px '; + + dom.bind(this.__input, 'keydown', function(e) { + if (e.keyCode === 13) { // on enter + onBlur.call(this); + } + }); + + dom.bind(this.__input, 'blur', onBlur); + + dom.bind(this.__selector, 'mousedown', function(/* e */) { + dom + .addClass(this, 'drag') + .bind(window, 'mouseup', function(/* e */) { + dom.removeClass(_this.__selector, 'drag'); + }); + }); + + dom.bind(this.__selector, 'touchstart', function(/* e */) { + dom + .addClass(this, 'drag') + .bind(window, 'touchend', function(/* e */) { + dom.removeClass(_this.__selector, 'drag'); + }); + }); + + const valueField = document.createElement('div'); + + common.extend(this.__selector.style, { + width: '122px', + height: '102px', + padding: '3px', + backgroundColor: '#222', + boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' + }); + + common.extend(this.__field_knob.style, { + position: 'absolute', + width: '12px', + height: '12px', + border: this.__field_knob_border + (this.__color.v < 0.5 ? '#fff' : '#000'), + boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', + borderRadius: '12px', + zIndex: 1 + }); + + common.extend(this.__hue_knob.style, { + position: 'absolute', + width: '15px', + height: '2px', + borderRight: '4px solid #fff', + zIndex: 1 + }); + + common.extend(this.__saturation_field.style, { + width: '100px', + height: '100px', + border: '1px solid #555', + marginRight: '3px', + display: 'inline-block', + cursor: 'pointer' + }); + + common.extend(valueField.style, { + width: '100%', + height: '100%', + background: 'none' + }); + + linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000'); + + common.extend(this.__hue_field.style, { + width: '15px', + height: '100px', + border: '1px solid #555', + cursor: 'ns-resize', + position: 'absolute', + top: '3px', + right: '3px' + }); + + hueGradient(this.__hue_field); + + common.extend(this.__input.style, { + outline: 'none', +// width: '120px', + textAlign: 'center', +// padding: '4px', +// marginBottom: '6px', + color: '#fff', + border: 0, + fontWeight: 'bold', + textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)' + }); + + dom.bind(this.__saturation_field, 'mousedown', fieldDown); + dom.bind(this.__saturation_field, 'touchstart', fieldDown); + + dom.bind(this.__field_knob, 'mousedown', fieldDown); + dom.bind(this.__field_knob, 'touchstart', fieldDown); + + dom.bind(this.__hue_field, 'mousedown', fieldDownH); + dom.bind(this.__hue_field, 'touchstart', fieldDownH); + + function fieldDown(e) { + setSV(e); + dom.bind(window, 'mousemove', setSV); + dom.bind(window, 'touchmove', setSV); + dom.bind(window, 'mouseup', fieldUpSV); + dom.bind(window, 'touchend', fieldUpSV); + } + + function fieldDownH(e) { + setH(e); + dom.bind(window, 'mousemove', setH); + dom.bind(window, 'touchmove', setH); + dom.bind(window, 'mouseup', fieldUpH); + dom.bind(window, 'touchend', fieldUpH); + } + + function fieldUpSV() { + dom.unbind(window, 'mousemove', setSV); + dom.unbind(window, 'touchmove', setSV); + dom.unbind(window, 'mouseup', fieldUpSV); + dom.unbind(window, 'touchend', fieldUpSV); + onFinish(); + } + + function fieldUpH() { + dom.unbind(window, 'mousemove', setH); + dom.unbind(window, 'touchmove', setH); + dom.unbind(window, 'mouseup', fieldUpH); + dom.unbind(window, 'touchend', fieldUpH); + onFinish(); + } + + function onBlur() { + const i = interpret(this.value); + if (i !== false) { + _this.__color.__state = i; + _this.setValue(_this.__color.toOriginal()); + } else { + this.value = _this.__color.toString(); + } + } + + function onFinish() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.__color.toOriginal()); + } + } + + this.__saturation_field.appendChild(valueField); + this.__selector.appendChild(this.__field_knob); + this.__selector.appendChild(this.__saturation_field); + this.__selector.appendChild(this.__hue_field); + this.__hue_field.appendChild(this.__hue_knob); + + this.domElement.appendChild(this.__input); + this.domElement.appendChild(this.__selector); + + this.updateDisplay(); + + function setSV(e) { + if (e.type.indexOf('touch') === -1) { e.preventDefault(); } + + const fieldRect = _this.__saturation_field.getBoundingClientRect(); + const { clientX, clientY } = (e.touches && e.touches[0]) || e; + let s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left); + let v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); + + if (v > 1) { + v = 1; + } else if (v < 0) { + v = 0; + } + + if (s > 1) { + s = 1; + } else if (s < 0) { + s = 0; + } + + _this.__color.v = v; + _this.__color.s = s; + + _this.setValue(_this.__color.toOriginal()); + + + return false; + } + + function setH(e) { + if (e.type.indexOf('touch') === -1) { e.preventDefault(); } + + const fieldRect = _this.__hue_field.getBoundingClientRect(); + const { clientY } = (e.touches && e.touches[0]) || e; + let h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); + + if (h > 1) { + h = 1; + } else if (h < 0) { + h = 0; + } + + _this.__color.h = h * 360; + + _this.setValue(_this.__color.toOriginal()); + + return false; + } + } + + updateDisplay() { + const i = interpret(this.getValue()); + + if (i !== false) { + let mismatch = false; + + // Check for mismatch on the interpreted value. + + common.each(Color.COMPONENTS, function(component) { + if (!common.isUndefined(i[component]) && !common.isUndefined(this.__color.__state[component]) && + i[component] !== this.__color.__state[component]) { + mismatch = true; + return {}; // break + } + }, this); + + // If nothing diverges, we keep our previous values + // for statefulness, otherwise we recalculate fresh + if (mismatch) { + common.extend(this.__color.__state, i); + } + } + + common.extend(this.__temp.__state, this.__color.__state); + + this.__temp.a = 1; + + const flip = (this.__color.v < 0.5 || this.__color.s > 0.5) ? 255 : 0; + const _flip = 255 - flip; + + common.extend(this.__field_knob.style, { + marginLeft: 100 * this.__color.s - 7 + 'px', + marginTop: 100 * (1 - this.__color.v) - 7 + 'px', + backgroundColor: this.__temp.toHexString(), + border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')' + }); + + this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'; + + this.__temp.s = 1; + this.__temp.v = 1; + + linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString()); + + this.__input.value = this.__color.toString(); + + common.extend(this.__input.style, { + backgroundColor: this.__color.toHexString(), + color: 'rgb(' + flip + ',' + flip + ',' + flip + ')', + textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)' + }); + } +} + +const vendors = ['-moz-', '-o-', '-webkit-', '-ms-', '']; + +function linearGradient(elem, x, a, b) { + elem.style.background = ''; + common.each(vendors, function(vendor) { + elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); '; + }); +} + +function hueGradient(elem) { + elem.style.background = ''; + elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'; + elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; +} + +export default ColorController; diff --git a/public/dat.gui-master/src/dat/controllers/Controller.js b/public/dat.gui-master/src/dat/controllers/Controller.js new file mode 100644 index 000000000..b65c7747f --- /dev/null +++ b/public/dat.gui-master/src/dat/controllers/Controller.js @@ -0,0 +1,125 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +/** + * @class An "abstract" class that represents a given property of an object. + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + */ +class Controller { + constructor(object, property) { + this.initialValue = object[property]; + + /** + * Those who extend this class will put their DOM elements in here. + * @type {DOMElement} + */ + this.domElement = document.createElement('div'); + + /** + * The object to manipulate + * @type {Object} + */ + this.object = object; + + /** + * The name of the property to manipulate + * @type {String} + */ + this.property = property; + + /** + * The function to be called on change. + * @type {Function} + * @ignore + */ + this.__onChange = undefined; + + /** + * The function to be called on finishing change. + * @type {Function} + * @ignore + */ + this.__onFinishChange = undefined; + } + + /** + * Specify that a function fire every time someone changes the value with + * this Controller. + * + * @param {Function} fnc This function will be called whenever the value + * is modified via this Controller. + * @returns {Controller} this + */ + onChange(fnc) { + this.__onChange = fnc; + return this; + } + + /** + * Specify that a function fire every time someone "finishes" changing + * the value wih this Controller. Useful for values that change + * incrementally like numbers or strings. + * + * @param {Function} fnc This function will be called whenever + * someone "finishes" changing the value via this Controller. + * @returns {Controller} this + */ + onFinishChange(fnc) { + this.__onFinishChange = fnc; + return this; + } + + /** + * Change the value of object[property] + * + * @param {Object} newValue The new value of object[property] + */ + setValue(newValue) { + this.object[this.property] = newValue; + if (this.__onChange) { + this.__onChange.call(this, newValue); + } + + this.updateDisplay(); + return this; + } + + /** + * Gets the value of object[property] + * + * @returns {Object} The current value of object[property] + */ + getValue() { + return this.object[this.property]; + } + + /** + * Refreshes the visual display of a Controller in order to keep sync + * with the object's current value. + * @returns {Controller} this + */ + updateDisplay() { + return this; + } + + /** + * @returns {Boolean} true if the value has deviated from initialValue + */ + isModified() { + return this.initialValue !== this.getValue(); + } +} + +export default Controller; diff --git a/public/dat.gui-master/src/dat/controllers/ControllerFactory.js b/public/dat.gui-master/src/dat/controllers/ControllerFactory.js new file mode 100644 index 000000000..da4802644 --- /dev/null +++ b/public/dat.gui-master/src/dat/controllers/ControllerFactory.js @@ -0,0 +1,66 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import OptionController from './OptionController'; +import NumberControllerBox from './NumberControllerBox'; +import NumberControllerSlider from './NumberControllerSlider'; +import StringController from './StringController'; +import FunctionController from './FunctionController'; +import BooleanController from './BooleanController'; +import common from '../utils/common'; + +const ControllerFactory = function(object, property) { + const initialValue = object[property]; + + // Providing options? + if (common.isArray(arguments[2]) || common.isObject(arguments[2])) { + return new OptionController(object, property, arguments[2]); + } + + // Providing a map? + if (common.isNumber(initialValue)) { + // Has min and max? (slider) + if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) { + // has step? + if (common.isNumber(arguments[4])) { + return new NumberControllerSlider(object, property, + arguments[2], arguments[3], arguments[4]); + } + + return new NumberControllerSlider(object, property, arguments[2], arguments[3]); + } + + // number box + if (common.isNumber(arguments[4])) { // has step + return new NumberControllerBox(object, property, + { min: arguments[2], max: arguments[3], step: arguments[4] }); + } + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); + } + + if (common.isString(initialValue)) { + return new StringController(object, property); + } + + if (common.isFunction(initialValue)) { + return new FunctionController(object, property, ''); + } + + if (common.isBoolean(initialValue)) { + return new BooleanController(object, property); + } + + return null; +}; + +export default ControllerFactory; diff --git a/public/dat.gui-master/src/dat/controllers/FunctionController.js b/public/dat.gui-master/src/dat/controllers/FunctionController.js new file mode 100644 index 000000000..d58d2e057 --- /dev/null +++ b/public/dat.gui-master/src/dat/controllers/FunctionController.js @@ -0,0 +1,56 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import Controller from './Controller'; +import dom from '../dom/dom'; + +/** + * @class Provides a GUI interface to fire a specified method, a property of an object. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + */ +class FunctionController extends Controller { + constructor(object, property, text) { + super(object, property); + + const _this = this; + + this.__button = document.createElement('div'); + this.__button.innerHTML = text === undefined ? 'Fire' : text; + + dom.bind(this.__button, 'click', function(e) { + e.preventDefault(); + _this.fire(); + return false; + }); + + dom.addClass(this.__button, 'button'); + + this.domElement.appendChild(this.__button); + } + + fire() { + if (this.__onChange) { + this.__onChange.call(this); + } + this.getValue().call(this.object); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + } +} + +export default FunctionController; diff --git a/public/dat.gui-master/src/dat/controllers/NumberController.js b/public/dat.gui-master/src/dat/controllers/NumberController.js new file mode 100644 index 000000000..664191aa1 --- /dev/null +++ b/public/dat.gui-master/src/dat/controllers/NumberController.js @@ -0,0 +1,120 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import Controller from './Controller'; +import common from '../utils/common'; + +function numDecimals(x) { + const _x = x.toString(); + if (_x.indexOf('.') > -1) { + return _x.length - _x.indexOf('.') - 1; + } + + return 0; +} + +/** + * @class Represents a given property of an object that is a number. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * @param {Object} [params] Optional parameters + * @param {Number} [params.min] Minimum allowed value + * @param {Number} [params.max] Maximum allowed value + * @param {Number} [params.step] Increment by which to change value + */ +class NumberController extends Controller { + constructor(object, property, params) { + super(object, property); + + const _params = params || {}; + + this.__min = _params.min; + this.__max = _params.max; + this.__step = _params.step; + + if (common.isUndefined(this.__step)) { + if (this.initialValue === 0) { + this.__impliedStep = 1; // What are we, psychics? + } else { + // Hey Doug, check this out. + this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(this.initialValue)) / Math.LN10)) / 10; + } + } else { + this.__impliedStep = this.__step; + } + + this.__precision = numDecimals(this.__impliedStep); + } + + setValue(v) { + let _v = v; + + if (this.__min !== undefined && _v < this.__min) { + _v = this.__min; + } else if (this.__max !== undefined && _v > this.__max) { + _v = this.__max; + } + + if (this.__step !== undefined && _v % this.__step !== 0) { + _v = Math.round(_v / this.__step) * this.__step; + } + + return super.setValue(_v); + } + + /** + * Specify a minimum value for object[property]. + * + * @param {Number} minValue The minimum value for + * object[property] + * @returns {dat.controllers.NumberController} this + */ + min(minValue) { + this.__min = minValue; + return this; + } + + /** + * Specify a maximum value for object[property]. + * + * @param {Number} maxValue The maximum value for + * object[property] + * @returns {dat.controllers.NumberController} this + */ + max(maxValue) { + this.__max = maxValue; + return this; + } + + /** + * Specify a step value that dat.controllers.NumberController + * increments by. + * + * @param {Number} stepValue The step value for + * dat.controllers.NumberController + * @default if minimum and maximum specified increment is 1% of the + * difference otherwise stepValue is 1 + * @returns {dat.controllers.NumberController} this + */ + step(stepValue) { + this.__step = stepValue; + this.__impliedStep = stepValue; + this.__precision = numDecimals(stepValue); + return this; + } +} + +export default NumberController; diff --git a/public/dat.gui-master/src/dat/controllers/NumberControllerBox.js b/public/dat.gui-master/src/dat/controllers/NumberControllerBox.js new file mode 100644 index 000000000..462ebf25a --- /dev/null +++ b/public/dat.gui-master/src/dat/controllers/NumberControllerBox.js @@ -0,0 +1,116 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import NumberController from './NumberController'; +import dom from '../dom/dom'; +import common from '../utils/common'; + +function roundToDecimal(value, decimals) { + const tenTo = Math.pow(10, decimals); + return Math.round(value * tenTo) / tenTo; +} + +/** + * @class Represents a given property of an object that is a number and + * provides an input element with which to manipulate it. + * + * @extends dat.controllers.Controller + * @extends dat.controllers.NumberController + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * @param {Object} [params] Optional parameters + * @param {Number} [params.min] Minimum allowed value + * @param {Number} [params.max] Maximum allowed value + * @param {Number} [params.step] Increment by which to change value + */ +class NumberControllerBox extends NumberController { + constructor(object, property, params) { + super(object, property, params); + + this.__truncationSuspended = false; + + const _this = this; + + /** + * {Number} Previous mouse y position + * @ignore + */ + let prevY; + + function onChange() { + const attempted = parseFloat(_this.__input.value); + if (!common.isNaN(attempted)) { + _this.setValue(attempted); + } + } + + function onFinish() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + + function onBlur() { + onFinish(); + } + + function onMouseDrag(e) { + const diff = prevY - e.clientY; + _this.setValue(_this.getValue() + diff * _this.__impliedStep); + + prevY = e.clientY; + } + + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + onFinish(); + } + + function onMouseDown(e) { + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + prevY = e.clientY; + } + + this.__input = document.createElement('input'); + this.__input.setAttribute('type', 'text'); + + // Makes it so manually specified values are not truncated. + + dom.bind(this.__input, 'change', onChange); + dom.bind(this.__input, 'blur', onBlur); + dom.bind(this.__input, 'mousedown', onMouseDown); + dom.bind(this.__input, 'keydown', function(e) { + // When pressing enter, you can be as precise as you want. + if (e.keyCode === 13) { + _this.__truncationSuspended = true; + this.blur(); + _this.__truncationSuspended = false; + onFinish(); + } + }); + + this.updateDisplay(); + + this.domElement.appendChild(this.__input); + } + + updateDisplay() { + this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); + return super.updateDisplay(); + } +} + +export default NumberControllerBox; diff --git a/public/dat.gui-master/src/dat/controllers/NumberControllerSlider.js b/public/dat.gui-master/src/dat/controllers/NumberControllerSlider.js new file mode 100644 index 000000000..f75bc0e45 --- /dev/null +++ b/public/dat.gui-master/src/dat/controllers/NumberControllerSlider.js @@ -0,0 +1,118 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import NumberController from './NumberController'; +import dom from '../dom/dom'; + +function map(v, i1, i2, o1, o2) { + return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); +} + +/** + * @class Represents a given property of an object that is a number, contains + * a minimum and maximum, and provides a slider element with which to + * manipulate it. It should be noted that the slider element is made up of + * <div> tags, not the html5 + * <slider> element. + * + * @extends dat.controllers.Controller + * @extends dat.controllers.NumberController + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * @param {Number} minValue Minimum allowed value + * @param {Number} maxValue Maximum allowed value + * @param {Number} stepValue Increment by which to change value + */ +class NumberControllerSlider extends NumberController { + constructor(object, property, min, max, step) { + super(object, property, { min: min, max: max, step: step }); + + const _this = this; + + this.__background = document.createElement('div'); + this.__foreground = document.createElement('div'); + + dom.bind(this.__background, 'mousedown', onMouseDown); + dom.bind(this.__background, 'touchstart', onTouchStart); + + dom.addClass(this.__background, 'slider'); + dom.addClass(this.__foreground, 'slider-fg'); + + function onMouseDown(e) { + document.activeElement.blur(); + + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + + onMouseDrag(e); + } + + function onMouseDrag(e) { + e.preventDefault(); + + const bgRect = _this.__background.getBoundingClientRect(); + + _this.setValue( + map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max) + ); + + return false; + } + + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + + function onTouchStart(e) { + if (e.touches.length !== 1) { return; } + dom.bind(window, 'touchmove', onTouchMove); + dom.bind(window, 'touchend', onTouchEnd); + onTouchMove(e); + } + + function onTouchMove(e) { + const clientX = e.touches[0].clientX; + const bgRect = _this.__background.getBoundingClientRect(); + + _this.setValue( + map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max) + ); + } + + function onTouchEnd() { + dom.unbind(window, 'touchmove', onTouchMove); + dom.unbind(window, 'touchend', onTouchEnd); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + + this.updateDisplay(); + + this.__background.appendChild(this.__foreground); + this.domElement.appendChild(this.__background); + } + + updateDisplay() { + const pct = (this.getValue() - this.__min) / (this.__max - this.__min); + this.__foreground.style.width = pct * 100 + '%'; + return super.updateDisplay(); + } +} + +export default NumberControllerSlider; diff --git a/public/dat.gui-master/src/dat/controllers/OptionController.js b/public/dat.gui-master/src/dat/controllers/OptionController.js new file mode 100644 index 000000000..b3490315f --- /dev/null +++ b/public/dat.gui-master/src/dat/controllers/OptionController.js @@ -0,0 +1,85 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import Controller from './Controller'; +import dom from '../dom/dom'; +import common from '../utils/common'; + +/** + * @class Provides a select input to alter the property of an object, using a + * list of accepted values. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * @param {Object|string[]} options A map of labels to acceptable values, or + * a list of acceptable string values. + */ +class OptionController extends Controller { + constructor(object, property, opts) { + super(object, property); + + let options = opts; + + const _this = this; + + /** + * The drop down menu + * @ignore + */ + this.__select = document.createElement('select'); + + if (common.isArray(options)) { + const map = {}; + common.each(options, function(element) { + map[element] = element; + }); + options = map; + } + + common.each(options, function(value, key) { + const opt = document.createElement('option'); + opt.innerHTML = key; + opt.setAttribute('value', value); + _this.__select.appendChild(opt); + }); + + // Acknowledge original value + this.updateDisplay(); + + dom.bind(this.__select, 'change', function() { + const desiredValue = this.options[this.selectedIndex].value; + _this.setValue(desiredValue); + }); + + this.domElement.appendChild(this.__select); + } + + setValue(v) { + const toReturn = super.setValue(v); + + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + return toReturn; + } + + updateDisplay() { + if (dom.isActive(this.__select)) return this; // prevent number from updating if user is trying to manually update + this.__select.value = this.getValue(); + return super.updateDisplay(); + } +} + +export default OptionController; diff --git a/public/dat.gui-master/src/dat/controllers/StringController.js b/public/dat.gui-master/src/dat/controllers/StringController.js new file mode 100644 index 000000000..63cf29a94 --- /dev/null +++ b/public/dat.gui-master/src/dat/controllers/StringController.js @@ -0,0 +1,68 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import Controller from './Controller'; +import dom from '../dom/dom'; + +/** + * @class Provides a text input to alter the string property of an object. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + */ +class StringController extends Controller { + constructor(object, property) { + super(object, property); + + const _this = this; + + function onChange() { + _this.setValue(_this.__input.value); + } + + function onBlur() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + + this.__input = document.createElement('input'); + this.__input.setAttribute('type', 'text'); + + dom.bind(this.__input, 'keyup', onChange); + dom.bind(this.__input, 'change', onChange); + dom.bind(this.__input, 'blur', onBlur); + dom.bind(this.__input, 'keydown', function(e) { + if (e.keyCode === 13) { + this.blur(); + } + }); + + this.updateDisplay(); + + this.domElement.appendChild(this.__input); + } + + updateDisplay() { + // Stops the caret from moving on account of: + // keyup -> setValue -> updateDisplay + if (!dom.isActive(this.__input)) { + this.__input.value = this.getValue(); + } + return super.updateDisplay(); + } +} + +export default StringController; diff --git a/public/dat.gui-master/src/dat/dom/CenteredDiv.js b/public/dat.gui-master/src/dat/dom/CenteredDiv.js new file mode 100644 index 000000000..a422ba50e --- /dev/null +++ b/public/dat.gui-master/src/dat/dom/CenteredDiv.js @@ -0,0 +1,104 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import dom from '../dom/dom'; +import common from '../utils/common'; + +class CenteredDiv { + constructor() { + this.backgroundElement = document.createElement('div'); + common.extend(this.backgroundElement.style, { + backgroundColor: 'rgba(0,0,0,0.8)', + top: 0, + left: 0, + display: 'none', + zIndex: '1000', + opacity: 0, + WebkitTransition: 'opacity 0.2s linear', + transition: 'opacity 0.2s linear' + }); + + dom.makeFullscreen(this.backgroundElement); + this.backgroundElement.style.position = 'fixed'; + + this.domElement = document.createElement('div'); + common.extend(this.domElement.style, { + position: 'fixed', + display: 'none', + zIndex: '1001', + opacity: 0, + WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear', + transition: 'transform 0.2s ease-out, opacity 0.2s linear' + }); + + + document.body.appendChild(this.backgroundElement); + document.body.appendChild(this.domElement); + + const _this = this; + dom.bind(this.backgroundElement, 'click', function() { + _this.hide(); + }); + } + + show() { + const _this = this; + + this.backgroundElement.style.display = 'block'; + + this.domElement.style.display = 'block'; + this.domElement.style.opacity = 0; +// this.domElement.style.top = '52%'; + this.domElement.style.webkitTransform = 'scale(1.1)'; + + this.layout(); + + common.defer(function() { + _this.backgroundElement.style.opacity = 1; + _this.domElement.style.opacity = 1; + _this.domElement.style.webkitTransform = 'scale(1)'; + }); + } + + /** + * Hide centered div + */ + hide() { + const _this = this; + + const hide = function() { + _this.domElement.style.display = 'none'; + _this.backgroundElement.style.display = 'none'; + + dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); + dom.unbind(_this.domElement, 'transitionend', hide); + dom.unbind(_this.domElement, 'oTransitionEnd', hide); + }; + + dom.bind(this.domElement, 'webkitTransitionEnd', hide); + dom.bind(this.domElement, 'transitionend', hide); + dom.bind(this.domElement, 'oTransitionEnd', hide); + + this.backgroundElement.style.opacity = 0; +// this.domElement.style.top = '48%'; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + } + + layout() { + this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px'; + this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px'; + } +} + +export default CenteredDiv; diff --git a/public/dat.gui-master/src/dat/dom/dom.js b/public/dat.gui-master/src/dat/dom/dom.js new file mode 100644 index 000000000..b802fc9c6 --- /dev/null +++ b/public/dat.gui-master/src/dat/dom/dom.js @@ -0,0 +1,292 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import common from '../utils/common'; + +const EVENT_MAP = { + HTMLEvents: ['change'], + MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'], + KeyboardEvents: ['keydown'] +}; + +const EVENT_MAP_INV = {}; +common.each(EVENT_MAP, function(v, k) { + common.each(v, function(e) { + EVENT_MAP_INV[e] = k; + }); +}); + +const CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; + +function cssValueToPixels(val) { + if (val === '0' || common.isUndefined(val)) { + return 0; + } + + const match = val.match(CSS_VALUE_PIXELS); + + if (!common.isNull(match)) { + return parseFloat(match[1]); + } + + // TODO ...ems? %? + + return 0; +} + +/** + * @namespace + * @member dat.dom + */ +const dom = { + + /** + * + * @param elem + * @param selectable + */ + makeSelectable: function(elem, selectable) { + if (elem === undefined || elem.style === undefined) return; + + elem.onselectstart = selectable ? function() { + return false; + } : function() { + }; + + elem.style.MozUserSelect = selectable ? 'auto' : 'none'; + elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; + elem.unselectable = selectable ? 'on' : 'off'; + }, + + /** + * + * @param elem + * @param horizontal + * @param vert + */ + makeFullscreen: function(elem, hor, vert) { + let vertical = vert; + let horizontal = hor; + + if (common.isUndefined(horizontal)) { + horizontal = true; + } + + if (common.isUndefined(vertical)) { + vertical = true; + } + + elem.style.position = 'absolute'; + + if (horizontal) { + elem.style.left = 0; + elem.style.right = 0; + } + if (vertical) { + elem.style.top = 0; + elem.style.bottom = 0; + } + }, + + /** + * + * @param elem + * @param eventType + * @param params + */ + fakeEvent: function(elem, eventType, pars, aux) { + const params = pars || {}; + const className = EVENT_MAP_INV[eventType]; + if (!className) { + throw new Error('Event type ' + eventType + ' not supported.'); + } + const evt = document.createEvent(className); + switch (className) { + case 'MouseEvents': + { + const clientX = params.x || params.clientX || 0; + const clientY = params.y || params.clientY || 0; + evt.initMouseEvent(eventType, params.bubbles || false, + params.cancelable || true, window, params.clickCount || 1, + 0, // screen X + 0, // screen Y + clientX, // client X + clientY, // client Y + false, false, false, false, 0, null); + break; + } + case 'KeyboardEvents': + { + const init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz + common.defaults(params, { + cancelable: true, + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false, + keyCode: undefined, + charCode: undefined + }); + init(eventType, params.bubbles || false, + params.cancelable, window, + params.ctrlKey, params.altKey, + params.shiftKey, params.metaKey, + params.keyCode, params.charCode); + break; + } + default: + { + evt.initEvent(eventType, params.bubbles || false, params.cancelable || true); + break; + } + } + common.defaults(evt, aux); + elem.dispatchEvent(evt); + }, + + /** + * + * @param elem + * @param event + * @param func + * @param bool + */ + bind: function(elem, event, func, newBool) { + const bool = newBool || false; + if (elem.addEventListener) { + elem.addEventListener(event, func, bool); + } else if (elem.attachEvent) { + elem.attachEvent('on' + event, func); + } + return dom; + }, + + /** + * + * @param elem + * @param event + * @param func + * @param bool + */ + unbind: function(elem, event, func, newBool) { + const bool = newBool || false; + if (elem.removeEventListener) { + elem.removeEventListener(event, func, bool); + } else if (elem.detachEvent) { + elem.detachEvent('on' + event, func); + } + return dom; + }, + + /** + * + * @param elem + * @param className + */ + addClass: function(elem, className) { + if (elem.className === undefined) { + elem.className = className; + } else if (elem.className !== className) { + const classes = elem.className.split(/ +/); + if (classes.indexOf(className) === -1) { + classes.push(className); + elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); + } + } + return dom; + }, + + /** + * + * @param elem + * @param className + */ + removeClass: function(elem, className) { + if (className) { + if (elem.className === className) { + elem.removeAttribute('class'); + } else { + const classes = elem.className.split(/ +/); + const index = classes.indexOf(className); + if (index !== -1) { + classes.splice(index, 1); + elem.className = classes.join(' '); + } + } + } else { + elem.className = undefined; + } + return dom; + }, + + hasClass: function(elem, className) { + return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; + }, + + /** + * + * @param elem + */ + getWidth: function(elem) { + const style = getComputedStyle(elem); + + return cssValueToPixels(style['border-left-width']) + + cssValueToPixels(style['border-right-width']) + + cssValueToPixels(style['padding-left']) + + cssValueToPixels(style['padding-right']) + + cssValueToPixels(style.width); + }, + + /** + * + * @param elem + */ + getHeight: function(elem) { + const style = getComputedStyle(elem); + + return cssValueToPixels(style['border-top-width']) + + cssValueToPixels(style['border-bottom-width']) + + cssValueToPixels(style['padding-top']) + + cssValueToPixels(style['padding-bottom']) + + cssValueToPixels(style.height); + }, + + /** + * + * @param el + */ + getOffset: function(el) { + let elem = el; + const offset = { left: 0, top: 0 }; + if (elem.offsetParent) { + do { + offset.left += elem.offsetLeft; + offset.top += elem.offsetTop; + elem = elem.offsetParent; + } while (elem); + } + return offset; + }, + + // http://stackoverflow.com/posts/2684561/revisions + /** + * + * @param elem + */ + isActive: function(elem) { + return elem === document.activeElement && (elem.type || elem.href); + } + +}; + +export default dom; diff --git a/public/dat.gui-master/src/dat/gui/GUI.js b/public/dat.gui-master/src/dat/gui/GUI.js new file mode 100644 index 000000000..972c30731 --- /dev/null +++ b/public/dat.gui-master/src/dat/gui/GUI.js @@ -0,0 +1,1409 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import css from '../utils/css'; +import saveDialogueContents from './saveDialogue.html'; +import ControllerFactory from '../controllers/ControllerFactory'; +import Controller from '../controllers/Controller'; +import BooleanController from '../controllers/BooleanController'; +import FunctionController from '../controllers/FunctionController'; +import NumberControllerBox from '../controllers/NumberControllerBox'; +import NumberControllerSlider from '../controllers/NumberControllerSlider'; +import ColorController from '../controllers/ColorController'; +import requestAnimationFrame from '../utils/requestAnimationFrame'; +import CenteredDiv from '../dom/CenteredDiv'; +import dom from '../dom/dom'; +import common from '../utils/common'; + +import styleSheet from './style.scss'; // CSS to embed in build + +css.inject(styleSheet); + +/** @ignore Outer-most className for GUI's */ +const CSS_NAMESPACE = 'dg'; + +const HIDE_KEY_CODE = 72; + +/** @ignore The only value shared between the JS and SCSS. Use caution. */ +const CLOSE_BUTTON_HEIGHT = 20; + +const DEFAULT_DEFAULT_PRESET_NAME = 'Default'; + +const SUPPORTS_LOCAL_STORAGE = (function() { + try { + return !!window.localStorage; + } catch (e) { + return false; + } +}()); + +let SAVE_DIALOGUE; + +/** @ignore Have we yet to create an autoPlace GUI? */ +let autoPlaceVirgin = true; + +/** @ignore Fixed position div that auto place GUI's go inside */ +let autoPlaceContainer; + +/** @ignore Are we hiding the GUI's ? */ +let hide = false; + +/** @private GUI's which should be hidden */ +const hideableGuis = []; + +/** + * @class A lightweight controller library for JavaScript. It allows you to easily + * manipulate variables and fire functions on the fly. + * + * @typicalname gui + * + * @example + * // Creating a GUI with options. + * var gui = new dat.GUI({name: 'My GUI'}); + * + * @example + * // Creating a GUI and a subfolder. + * var gui = new dat.GUI(); + * var folder1 = gui.addFolder('Flow Field'); + * + * @param {Object} [params] + * @param {String} [params.name] The name of this GUI. + * @param {Object} [params.load] JSON object representing the saved state of + * this GUI. + * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in. + * @param {Boolean} [params.autoPlace=true] + * @param {Boolean} [params.hideable=true] If true, GUI is shown/hidden by h keypress. + * @param {Boolean} [params.closed=false] If true, starts closed + * @param {Boolean} [params.closeOnTop=false] If true, close/open button shows on top of the GUI + */ +const GUI = function(pars) { + const _this = this; + + let params = pars || {}; + + /** + * Outermost DOM Element + * @type {DOMElement} + */ + this.domElement = document.createElement('div'); + this.__ul = document.createElement('ul'); + this.domElement.appendChild(this.__ul); + + dom.addClass(this.domElement, CSS_NAMESPACE); + + /** + * Nested GUI's by name + * @ignore + */ + this.__folders = {}; + + this.__controllers = []; + + /** + * List of objects I'm remembering for save, only used in top level GUI + * @ignore + */ + this.__rememberedObjects = []; + + /** + * Maps the index of remembered objects to a map of controllers, only used + * in top level GUI. + * + * @private + * @ignore + * + * @example + * [ + * { + * propertyName: Controller, + * anotherPropertyName: Controller + * }, + * { + * propertyName: Controller + * } + * ] + */ + this.__rememberedObjectIndecesToControllers = []; + + this.__listening = []; + + // Default parameters + params = common.defaults(params, { + closeOnTop: false, + autoPlace: true, + width: GUI.DEFAULT_WIDTH + }); + + params = common.defaults(params, { + resizable: params.autoPlace, + hideable: params.autoPlace + }); + + if (!common.isUndefined(params.load)) { + // Explicit preset + if (params.preset) { + params.load.preset = params.preset; + } + } else { + params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; + } + + if (common.isUndefined(params.parent) && params.hideable) { + hideableGuis.push(this); + } + + // Only root level GUI's are resizable. + params.resizable = common.isUndefined(params.parent) && params.resizable; + + if (params.autoPlace && common.isUndefined(params.scrollable)) { + params.scrollable = true; + } +// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true; + + // Not part of params because I don't want people passing this in via + // constructor. Should be a 'remembered' value. + let useLocalStorage = + SUPPORTS_LOCAL_STORAGE && + localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; + + let saveToLocalStorage; + let titleRow; + + Object.defineProperties(this, + /** @lends GUI.prototype */ + { + /** + * The parent GUI + * @type dat.gui.GUI + */ + parent: { + get: function() { + return params.parent; + } + }, + + scrollable: { + get: function() { + return params.scrollable; + } + }, + + /** + * Handles GUI's element placement for you + * @type Boolean + */ + autoPlace: { + get: function() { + return params.autoPlace; + } + }, + + /** + * Handles GUI's position of open/close button + * @type Boolean + */ + closeOnTop: { + get: function() { + return params.closeOnTop; + } + }, + + /** + * The identifier for a set of saved values + * @type String + */ + preset: { + get: function() { + if (_this.parent) { + return _this.getRoot().preset; + } + + return params.load.preset; + }, + + set: function(v) { + if (_this.parent) { + _this.getRoot().preset = v; + } else { + params.load.preset = v; + } + setPresetSelectIndex(this); + _this.revert(); + } + }, + + /** + * The width of GUI element + * @type Number + */ + width: { + get: function() { + return params.width; + }, + set: function(v) { + params.width = v; + setWidth(_this, v); + } + }, + + /** + * The name of GUI. Used for folders. i.e + * a folder's name + * @type String + */ + name: { + get: function() { + return params.name; + }, + set: function(v) { + // TODO Check for collisions among sibling folders + params.name = v; + if (titleRow) { + titleRow.innerHTML = params.name; + } + } + }, + + /** + * Whether the GUI is collapsed or not + * @type Boolean + */ + closed: { + get: function() { + return params.closed; + }, + set: function(v) { + params.closed = v; + if (params.closed) { + dom.addClass(_this.__ul, GUI.CLASS_CLOSED); + } else { + dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); + } + // For browsers that aren't going to respect the CSS transition, + // Lets just check our height against the window height right off + // the bat. + this.onResize(); + + if (_this.__closeButton) { + _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; + } + } + }, + + /** + * Contains all presets + * @type Object + */ + load: { + get: function() { + return params.load; + } + }, + + /** + * Determines whether or not to use localStorage as the means for + * remembering + * @type Boolean + */ + useLocalStorage: { + + get: function() { + return useLocalStorage; + }, + set: function(bool) { + if (SUPPORTS_LOCAL_STORAGE) { + useLocalStorage = bool; + if (bool) { + dom.bind(window, 'unload', saveToLocalStorage); + } else { + dom.unbind(window, 'unload', saveToLocalStorage); + } + localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); + } + } + } + }); + + // Are we a root level GUI? + if (common.isUndefined(params.parent)) { + this.closed = params.closed || false; + + dom.addClass(this.domElement, GUI.CLASS_MAIN); + dom.makeSelectable(this.domElement, false); + + // Are we supposed to be loading locally? + if (SUPPORTS_LOCAL_STORAGE) { + if (useLocalStorage) { + _this.useLocalStorage = true; + + const savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui')); + + if (savedGui) { + params.load = JSON.parse(savedGui); + } + } + } + + this.__closeButton = document.createElement('div'); + this.__closeButton.innerHTML = GUI.TEXT_CLOSED; + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); + if (params.closeOnTop) { + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP); + this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]); + } else { + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM); + this.domElement.appendChild(this.__closeButton); + } + + dom.bind(this.__closeButton, 'click', function() { + _this.closed = !_this.closed; + }); + // Oh, you're a nested GUI! + } else { + if (params.closed === undefined) { + params.closed = true; + } + + const titleRowName = document.createTextNode(params.name); + dom.addClass(titleRowName, 'controller-name'); + + titleRow = addRow(_this, titleRowName); + + const onClickTitle = function(e) { + e.preventDefault(); + _this.closed = !_this.closed; + return false; + }; + + dom.addClass(this.__ul, GUI.CLASS_CLOSED); + + dom.addClass(titleRow, 'title'); + dom.bind(titleRow, 'click', onClickTitle); + + if (!params.closed) { + this.closed = false; + } + } + + if (params.autoPlace) { + if (common.isUndefined(params.parent)) { + if (autoPlaceVirgin) { + autoPlaceContainer = document.createElement('div'); + dom.addClass(autoPlaceContainer, CSS_NAMESPACE); + dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER); + document.body.appendChild(autoPlaceContainer); + autoPlaceVirgin = false; + } + + // Put it in the dom for you. + autoPlaceContainer.appendChild(this.domElement); + + // Apply the auto styles + dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); + } + + + // Make it not elastic. + if (!this.parent) { + setWidth(_this, params.width); + } + } + + this.__resizeHandler = function() { + _this.onResizeDebounced(); + }; + + dom.bind(window, 'resize', this.__resizeHandler); + dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler); + dom.bind(this.__ul, 'transitionend', this.__resizeHandler); + dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler); + this.onResize(); + + if (params.resizable) { + addResizeHandle(this); + } + + saveToLocalStorage = function() { + if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') { + localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); + } + }; + + // expose this method publicly + this.saveToLocalStorageIfPossible = saveToLocalStorage; + + function resetWidth() { + const root = _this.getRoot(); + root.width += 1; + common.defer(function() { + root.width -= 1; + }); + } + + if (!params.parent) { + resetWidth(); + } +}; + +GUI.toggleHide = function() { + hide = !hide; + common.each(hideableGuis, function(gui) { + gui.domElement.style.display = hide ? 'none' : ''; + }); +}; + +GUI.CLASS_AUTO_PLACE = 'a'; +GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; +GUI.CLASS_MAIN = 'main'; +GUI.CLASS_CONTROLLER_ROW = 'cr'; +GUI.CLASS_TOO_TALL = 'taller-than-window'; +GUI.CLASS_CLOSED = 'closed'; +GUI.CLASS_CLOSE_BUTTON = 'close-button'; +GUI.CLASS_CLOSE_TOP = 'close-top'; +GUI.CLASS_CLOSE_BOTTOM = 'close-bottom'; +GUI.CLASS_DRAG = 'drag'; + +GUI.DEFAULT_WIDTH = 245; +GUI.TEXT_CLOSED = 'Close Controls'; +GUI.TEXT_OPEN = 'Open Controls'; + +GUI._keydownHandler = function(e) { + if (document.activeElement.type !== 'text' && + (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) { + GUI.toggleHide(); + } +}; +dom.bind(window, 'keydown', GUI._keydownHandler, false); + +common.extend( + GUI.prototype, + + /** @lends GUI.prototype */ + { + + /** + * Adds a new {@link Controller} to the GUI. The type of controller created + * is inferred from the initial value of object[property]. For + * color properties, see {@link addColor}. + * + * @param {Object} object The object to be manipulated + * @param {String} property The name of the property to be manipulated + * @param {Number} [min] Minimum allowed value + * @param {Number} [max] Maximum allowed value + * @param {Number} [step] Increment by which to change value + * @returns {Controller} The controller that was added to the GUI. + * @instance + * + * @example + * // Add a string controller. + * var person = {name: 'Sam'}; + * gui.add(person, 'name'); + * + * @example + * // Add a number controller slider. + * var person = {age: 45}; + * gui.add(person, 'age', 0, 100); + */ + add: function(object, property) { + return add( + this, + object, + property, + { + factoryArgs: Array.prototype.slice.call(arguments, 2) + } + ); + }, + + /** + * Adds a new color controller to the GUI. + * + * @param object + * @param property + * @returns {Controller} The controller that was added to the GUI. + * @instance + * + * @example + * var palette = { + * color1: '#FF0000', // CSS string + * color2: [ 0, 128, 255 ], // RGB array + * color3: [ 0, 128, 255, 0.3 ], // RGB with alpha + * color4: { h: 350, s: 0.9, v: 0.3 } // Hue, saturation, value + * }; + * gui.addColor(palette, 'color1'); + * gui.addColor(palette, 'color2'); + * gui.addColor(palette, 'color3'); + * gui.addColor(palette, 'color4'); + */ + addColor: function(object, property) { + return add( + this, + object, + property, + { + color: true + } + ); + }, + + /** + * Removes the given controller from the GUI. + * @param {Controller} controller + * @instance + */ + remove: function(controller) { + // TODO listening? + this.__ul.removeChild(controller.__li); + this.__controllers.splice(this.__controllers.indexOf(controller), 1); + const _this = this; + common.defer(function() { + _this.onResize(); + }); + }, + + /** + * Removes the root GUI from the document and unbinds all event listeners. + * For subfolders, use `gui.removeFolder(folder)` instead. + * @instance + */ + destroy: function() { + if (this.parent) { + throw new Error( + 'Only the root GUI should be removed with .destroy(). ' + + 'For subfolders, use gui.removeFolder(folder) instead.' + ); + } + + if (this.autoPlace) { + autoPlaceContainer.removeChild(this.domElement); + } + + const _this = this; + common.each(this.__folders, function(subfolder) { + _this.removeFolder(subfolder); + }); + + dom.unbind(window, 'keydown', GUI._keydownHandler, false); + + removeListeners(this); + }, + + /** + * Creates a new subfolder GUI instance. + * @param name + * @returns {dat.gui.GUI} The new folder. + * @throws {Error} if this GUI already has a folder by the specified + * name + * @instance + */ + addFolder: function(name) { + // We have to prevent collisions on names in order to have a key + // by which to remember saved values + if (this.__folders[name] !== undefined) { + throw new Error('You already have a folder in this GUI by the' + + ' name "' + name + '"'); + } + + const newGuiParams = { name: name, parent: this }; + + // We need to pass down the autoPlace trait so that we can + // attach event listeners to open/close folder actions to + // ensure that a scrollbar appears if the window is too short. + newGuiParams.autoPlace = this.autoPlace; + + // Do we have saved appearance data for this folder? + if (this.load && // Anything loaded? + this.load.folders && // Was my parent a dead-end? + this.load.folders[name]) { // Did daddy remember me? + // Start me closed if I was closed + newGuiParams.closed = this.load.folders[name].closed; + + // Pass down the loaded data + newGuiParams.load = this.load.folders[name]; + } + + const gui = new GUI(newGuiParams); + this.__folders[name] = gui; + + const li = addRow(this, gui.domElement); + dom.addClass(li, 'folder'); + return gui; + }, + + /** + * Removes a subfolder GUI instance. + * @param {dat.gui.GUI} folder The folder to remove. + * @instance + */ + removeFolder: function(folder) { + this.__ul.removeChild(folder.domElement.parentElement); + + delete this.__folders[folder.name]; + + // Do we have saved appearance data for this folder? + if (this.load && // Anything loaded? + this.load.folders && // Was my parent a dead-end? + this.load.folders[folder.name]) { + delete this.load.folders[folder.name]; + } + + removeListeners(folder); + + const _this = this; + + common.each(folder.__folders, function(subfolder) { + folder.removeFolder(subfolder); + }); + + common.defer(function() { + _this.onResize(); + }); + }, + + /** + * Opens the GUI. + */ + open: function() { + this.closed = false; + }, + + /** + * Closes the GUI. + */ + close: function() { + this.closed = true; + }, + + /** + * Hides the GUI. + */ + hide: function() { + this.domElement.style.display = 'none'; + }, + + /** + * Shows the GUI. + */ + show: function() { + this.domElement.style.display = ''; + }, + + + onResize: function() { + // we debounce this function to prevent performance issues when rotating on tablet/mobile + const root = this.getRoot(); + if (root.scrollable) { + const top = dom.getOffset(root.__ul).top; + let h = 0; + + common.each(root.__ul.childNodes, function(node) { + if (!(root.autoPlace && node === root.__save_row)) { + h += dom.getHeight(node); + } + }); + + if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { + dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; + } else { + dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = 'auto'; + } + } + + if (root.__resize_handle) { + common.defer(function() { + root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; + }); + } + + if (root.__closeButton) { + root.__closeButton.style.width = root.width + 'px'; + } + }, + + onResizeDebounced: common.debounce(function() { this.onResize(); }, 50), + + /** + * Mark objects for saving. The order of these objects cannot change as + * the GUI grows. When remembering new objects, append them to the end + * of the list. + * + * @param {...Object} objects + * @throws {Error} if not called on a top level GUI. + * @instance + * @ignore + */ + remember: function() { + if (common.isUndefined(SAVE_DIALOGUE)) { + SAVE_DIALOGUE = new CenteredDiv(); + SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents; + } + + if (this.parent) { + throw new Error('You can only call remember on a top level GUI.'); + } + + const _this = this; + + common.each(Array.prototype.slice.call(arguments), function(object) { + if (_this.__rememberedObjects.length === 0) { + addSaveMenu(_this); + } + if (_this.__rememberedObjects.indexOf(object) === -1) { + _this.__rememberedObjects.push(object); + } + }); + + if (this.autoPlace) { + // Set save row width + setWidth(this, this.width); + } + }, + + /** + * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI. + * @instance + */ + getRoot: function() { + let gui = this; + while (gui.parent) { + gui = gui.parent; + } + return gui; + }, + + /** + * @returns {Object} a JSON object representing the current state of + * this GUI as well as its remembered properties. + * @instance + */ + getSaveObject: function() { + const toReturn = this.load; + toReturn.closed = this.closed; + + // Am I remembering any values? + if (this.__rememberedObjects.length > 0) { + toReturn.preset = this.preset; + + if (!toReturn.remembered) { + toReturn.remembered = {}; + } + + toReturn.remembered[this.preset] = getCurrentPreset(this); + } + + toReturn.folders = {}; + common.each(this.__folders, function(element, key) { + toReturn.folders[key] = element.getSaveObject(); + }); + + return toReturn; + }, + + save: function() { + if (!this.load.remembered) { + this.load.remembered = {}; + } + + this.load.remembered[this.preset] = getCurrentPreset(this); + markPresetModified(this, false); + this.saveToLocalStorageIfPossible(); + }, + + saveAs: function(presetName) { + if (!this.load.remembered) { + // Retain default values upon first save + this.load.remembered = {}; + this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); + } + + this.load.remembered[presetName] = getCurrentPreset(this); + this.preset = presetName; + addPresetOption(this, presetName, true); + this.saveToLocalStorageIfPossible(); + }, + + revert: function(gui) { + common.each(this.__controllers, function(controller) { + // Make revert work on Default. + if (!this.getRoot().load.remembered) { + controller.setValue(controller.initialValue); + } else { + recallSavedValue(gui || this.getRoot(), controller); + } + + // fire onFinishChange callback + if (controller.__onFinishChange) { + controller.__onFinishChange.call(controller, controller.getValue()); + } + }, this); + + common.each(this.__folders, function(folder) { + folder.revert(folder); + }); + + if (!gui) { + markPresetModified(this.getRoot(), false); + } + }, + + listen: function(controller) { + const init = this.__listening.length === 0; + this.__listening.push(controller); + if (init) { + updateDisplays(this.__listening); + } + }, + + updateDisplay: function() { + common.each(this.__controllers, function(controller) { + controller.updateDisplay(); + }); + common.each(this.__folders, function(folder) { + folder.updateDisplay(); + }); + } + } +); + +/** + * Add a row to the end of the GUI or before another row. + * + * @param gui + * @param [newDom] If specified, inserts the dom content in the new row + * @param [liBefore] If specified, places the new row before another row + * + * @ignore + */ +function addRow(gui, newDom, liBefore) { + const li = document.createElement('li'); + if (newDom) { + li.appendChild(newDom); + } + + if (liBefore) { + gui.__ul.insertBefore(li, liBefore); + } else { + gui.__ul.appendChild(li); + } + gui.onResize(); + return li; +} + +function removeListeners(gui) { + dom.unbind(window, 'resize', gui.__resizeHandler); + + if (gui.saveToLocalStorageIfPossible) { + dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible); + } +} + +function markPresetModified(gui, modified) { + const opt = gui.__preset_select[gui.__preset_select.selectedIndex]; + + if (modified) { + opt.innerHTML = opt.value + '*'; + } else { + opt.innerHTML = opt.value; + } +} + +function augmentController(gui, li, controller) { + controller.__li = li; + controller.__gui = gui; + + common.extend(controller, /** @lends Controller.prototype */ { + /** + * @param {Array|Object} options + * @return {Controller} + */ + options: function(options) { + if (arguments.length > 1) { + const nextSibling = controller.__li.nextElementSibling; + controller.remove(); + + return add( + gui, + controller.object, + controller.property, + { + before: nextSibling, + factoryArgs: [common.toArray(arguments)] + } + ); + } + + if (common.isArray(options) || common.isObject(options)) { + const nextSibling = controller.__li.nextElementSibling; + controller.remove(); + + return add( + gui, + controller.object, + controller.property, + { + before: nextSibling, + factoryArgs: [options] + } + ); + } + }, + + /** + * Sets the name of the controller. + * @param {string} name + * @return {Controller} + */ + name: function(name) { + controller.__li.firstElementChild.firstElementChild.innerHTML = name; + return controller; + }, + + /** + * Sets controller to listen for changes on its underlying object. + * @return {Controller} + */ + listen: function() { + controller.__gui.listen(controller); + return controller; + }, + + /** + * Removes the controller from its parent GUI. + * @return {Controller} + */ + remove: function() { + controller.__gui.remove(controller); + return controller; + } + }); + + // All sliders should be accompanied by a box. + if (controller instanceof NumberControllerSlider) { + const box = new NumberControllerBox(controller.object, controller.property, + { min: controller.__min, max: controller.__max, step: controller.__step }); + + common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function(method) { + const pc = controller[method]; + const pb = box[method]; + controller[method] = box[method] = function() { + const args = Array.prototype.slice.call(arguments); + pb.apply(box, args); + return pc.apply(controller, args); + }; + }); + + dom.addClass(li, 'has-slider'); + controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); + } else if (controller instanceof NumberControllerBox) { + const r = function(returned) { + // Have we defined both boundaries? + if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) { + // Well, then lets just replace this with a slider. + + // lets remember if the old controller had a specific name or was listening + const oldName = controller.__li.firstElementChild.firstElementChild.innerHTML; + const wasListening = controller.__gui.__listening.indexOf(controller) > -1; + + controller.remove(); + const newController = add( + gui, + controller.object, + controller.property, + { + before: controller.__li.nextElementSibling, + factoryArgs: [controller.__min, controller.__max, controller.__step] + }); + + newController.name(oldName); + if (wasListening) newController.listen(); + + return newController; + } + + return returned; + }; + + controller.min = common.compose(r, controller.min); + controller.max = common.compose(r, controller.max); + } else if (controller instanceof BooleanController) { + dom.bind(li, 'click', function() { + dom.fakeEvent(controller.__checkbox, 'click'); + }); + + dom.bind(controller.__checkbox, 'click', function(e) { + e.stopPropagation(); // Prevents double-toggle + }); + } else if (controller instanceof FunctionController) { + dom.bind(li, 'click', function() { + dom.fakeEvent(controller.__button, 'click'); + }); + + dom.bind(li, 'mouseover', function() { + dom.addClass(controller.__button, 'hover'); + }); + + dom.bind(li, 'mouseout', function() { + dom.removeClass(controller.__button, 'hover'); + }); + } else if (controller instanceof ColorController) { + dom.addClass(li, 'color'); + controller.updateDisplay = common.compose(function(val) { + li.style.borderLeftColor = controller.__color.toString(); + return val; + }, controller.updateDisplay); + + controller.updateDisplay(); + } + + controller.setValue = common.compose(function(val) { + if (gui.getRoot().__preset_select && controller.isModified()) { + markPresetModified(gui.getRoot(), true); + } + + return val; + }, controller.setValue); +} + +function recallSavedValue(gui, controller) { + // Find the topmost GUI, that's where remembered objects live. + const root = gui.getRoot(); + + // Does the object we're controlling match anything we've been told to + // remember? + const matchedIndex = root.__rememberedObjects.indexOf(controller.object); + + // Why yes, it does! + if (matchedIndex !== -1) { + // Let me fetch a map of controllers for thcommon.isObject. + let controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex]; + + // Ohp, I believe this is the first controller we've created for this + // object. Lets make the map fresh. + if (controllerMap === undefined) { + controllerMap = {}; + root.__rememberedObjectIndecesToControllers[matchedIndex] = + controllerMap; + } + + // Keep track of this controller + controllerMap[controller.property] = controller; + + // Okay, now have we saved any values for this controller? + if (root.load && root.load.remembered) { + const presetMap = root.load.remembered; + + // Which preset are we trying to load? + let preset; + + if (presetMap[gui.preset]) { + preset = presetMap[gui.preset]; + } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) { + // Uhh, you can have the default instead? + preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME]; + } else { + // Nada. + return; + } + + // Did the loaded object remember thcommon.isObject? && Did we remember this particular property? + if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) { + // We did remember something for this guy ... + const value = preset[matchedIndex][controller.property]; + + // And that's what it is. + controller.initialValue = value; + controller.setValue(value); + } + } + } +} + +function add(gui, object, property, params) { + if (object[property] === undefined) { + throw new Error(`Object "${object}" has no property "${property}"`); + } + + let controller; + + if (params.color) { + controller = new ColorController(object, property); + } else { + const factoryArgs = [object, property].concat(params.factoryArgs); + controller = ControllerFactory.apply(gui, factoryArgs); + } + + if (params.before instanceof Controller) { + params.before = params.before.__li; + } + + recallSavedValue(gui, controller); + + dom.addClass(controller.domElement, 'c'); + + const name = document.createElement('span'); + dom.addClass(name, 'property-name'); + name.innerHTML = controller.property; + + const container = document.createElement('div'); + container.appendChild(name); + container.appendChild(controller.domElement); + + const li = addRow(gui, container, params.before); + + dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); + if (controller instanceof ColorController) { + dom.addClass(li, 'color'); + } else { + dom.addClass(li, typeof controller.getValue()); + } + + augmentController(gui, li, controller); + + gui.__controllers.push(controller); + + return controller; +} + +function getLocalStorageHash(gui, key) { + // TODO how does this deal with multiple GUI's? + return document.location.href + '.' + key; +} + +function addPresetOption(gui, name, setSelected) { + const opt = document.createElement('option'); + opt.innerHTML = name; + opt.value = name; + gui.__preset_select.appendChild(opt); + if (setSelected) { + gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; + } +} + +function showHideExplain(gui, explain) { + explain.style.display = gui.useLocalStorage ? 'block' : 'none'; +} + +function addSaveMenu(gui) { + const div = gui.__save_row = document.createElement('li'); + + dom.addClass(gui.domElement, 'has-save'); + + gui.__ul.insertBefore(div, gui.__ul.firstChild); + + dom.addClass(div, 'save-row'); + + const gears = document.createElement('span'); + gears.innerHTML = ' '; + dom.addClass(gears, 'button gears'); + + // TODO replace with FunctionController + const button = document.createElement('span'); + button.innerHTML = 'Save'; + dom.addClass(button, 'button'); + dom.addClass(button, 'save'); + + const button2 = document.createElement('span'); + button2.innerHTML = 'New'; + dom.addClass(button2, 'button'); + dom.addClass(button2, 'save-as'); + + const button3 = document.createElement('span'); + button3.innerHTML = 'Revert'; + dom.addClass(button3, 'button'); + dom.addClass(button3, 'revert'); + + const select = gui.__preset_select = document.createElement('select'); + + if (gui.load && gui.load.remembered) { + common.each(gui.load.remembered, function(value, key) { + addPresetOption(gui, key, key === gui.preset); + }); + } else { + addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); + } + + dom.bind(select, 'change', function() { + for (let index = 0; index < gui.__preset_select.length; index++) { + gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; + } + + gui.preset = this.value; + }); + + div.appendChild(select); + div.appendChild(gears); + div.appendChild(button); + div.appendChild(button2); + div.appendChild(button3); + + if (SUPPORTS_LOCAL_STORAGE) { + const explain = document.getElementById('dg-local-explain'); + const localStorageCheckBox = document.getElementById('dg-local-storage'); + const saveLocally = document.getElementById('dg-save-locally'); + + saveLocally.style.display = 'block'; + + if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { + localStorageCheckBox.setAttribute('checked', 'checked'); + } + + showHideExplain(gui, explain); + + // TODO: Use a boolean controller, fool! + dom.bind(localStorageCheckBox, 'change', function() { + gui.useLocalStorage = !gui.useLocalStorage; + showHideExplain(gui, explain); + }); + } + + const newConstructorTextArea = document.getElementById('dg-new-constructor'); + + dom.bind(newConstructorTextArea, 'keydown', function(e) { + if (e.metaKey && (e.which === 67 || e.keyCode === 67)) { + SAVE_DIALOGUE.hide(); + } + }); + + dom.bind(gears, 'click', function() { + newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); + SAVE_DIALOGUE.show(); + newConstructorTextArea.focus(); + newConstructorTextArea.select(); + }); + + dom.bind(button, 'click', function() { + gui.save(); + }); + + dom.bind(button2, 'click', function() { + const presetName = prompt('Enter a new preset name.'); + if (presetName) { + gui.saveAs(presetName); + } + }); + + dom.bind(button3, 'click', function() { + gui.revert(); + }); + + // div.appendChild(button2); +} + +function addResizeHandle(gui) { + let pmouseX; + + gui.__resize_handle = document.createElement('div'); + + common.extend(gui.__resize_handle.style, { + + width: '6px', + marginLeft: '-3px', + height: '200px', + cursor: 'ew-resize', + position: 'absolute' + // border: '1px solid blue' + + }); + + function drag(e) { + e.preventDefault(); + + gui.width += pmouseX - e.clientX; + gui.onResize(); + pmouseX = e.clientX; + + return false; + } + + function dragStop() { + dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.unbind(window, 'mousemove', drag); + dom.unbind(window, 'mouseup', dragStop); + } + + function dragStart(e) { + e.preventDefault(); + + pmouseX = e.clientX; + + dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.bind(window, 'mousemove', drag); + dom.bind(window, 'mouseup', dragStop); + + return false; + } + + dom.bind(gui.__resize_handle, 'mousedown', dragStart); + dom.bind(gui.__closeButton, 'mousedown', dragStart); + + gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); +} + +function setWidth(gui, w) { + gui.domElement.style.width = w + 'px'; + // Auto placed save-rows are position fixed, so we have to + // set the width manually if we want it to bleed to the edge + if (gui.__save_row && gui.autoPlace) { + gui.__save_row.style.width = w + 'px'; + } + if (gui.__closeButton) { + gui.__closeButton.style.width = w + 'px'; + } +} + +function getCurrentPreset(gui, useInitialValues) { + const toReturn = {}; + + // For each object I'm remembering + common.each(gui.__rememberedObjects, function(val, index) { + const savedValues = {}; + + // The controllers I've made for thcommon.isObject by property + const controllerMap = + gui.__rememberedObjectIndecesToControllers[index]; + + // Remember each value for each property + common.each(controllerMap, function(controller, property) { + savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue(); + }); + + // Save the values for thcommon.isObject + toReturn[index] = savedValues; + }); + + return toReturn; +} + +function setPresetSelectIndex(gui) { + for (let index = 0; index < gui.__preset_select.length; index++) { + if (gui.__preset_select[index].value === gui.preset) { + gui.__preset_select.selectedIndex = index; + } + } +} + +function updateDisplays(controllerArray) { + if (controllerArray.length !== 0) { + requestAnimationFrame.call(window, function() { + updateDisplays(controllerArray); + }); + } + + common.each(controllerArray, function(c) { + c.updateDisplay(); + }); +} + +export default GUI; diff --git a/public/dat.gui-master/src/dat/gui/_structure.scss b/public/dat.gui-master/src/dat/gui/_structure.scss new file mode 100644 index 000000000..3193f8e00 --- /dev/null +++ b/public/dat.gui-master/src/dat/gui/_structure.scss @@ -0,0 +1,300 @@ +$nest-margin: 4px; +$row-height: 27px; + +$button-height: 20px; + +.dg { + + /** Clear list styles */ + ul { + list-style: none; + margin: 0; + padding: 0; + width: 100%; + clear: both; + } + + /* Auto-place container */ + &.ac { + position: fixed; + top: 0; + left: 0; + right: 0; + height: 0; + z-index: 0; + } + + &:not(.ac) .main { + /** Exclude mains in ac so that we don't hide close button */ + overflow: hidden; + } + + &.main { + + @include transition(opacity, 0.1s, linear); + + &.taller-than-window { + + overflow-y: auto; + + .close-button { + + opacity: 1; + + /* TODO, these are style notes */ + margin-top: -1px; + border-top: 1px solid $border-color; + + } + + } + + ul.closed .close-button { + opacity: 1 !important; + } + + &:hover .close-button, + .close-button.drag { + opacity: 1; + } + + .close-button { + /*opacity: 0;*/ + @include transition(opacity, 0.1s, linear); + border: 0; + + line-height: $button-height - 1; + height: $button-height; + + /* TODO, these are style notes */ + cursor: pointer; + text-align: center; + background-color: #000; + &.close-top { + position: relative; + } + &.close-bottom { + position: absolute; + } + &:hover { + background-color: #111; + } + + } + + } + + /* Auto-placed GUI's */ + &.a { + + float: right; + margin-right: 15px; + overflow-y:visible; + + &.has-save > ul { + + &.close-top { + margin-top: 0; + } + &.close-bottom { + margin-top: $row-height; + } + + &.closed { + margin-top: 0; + } + } + + .save-row { + top: 0; + z-index: 1002; + + &.close-top { + position: relative; + } + &.close-bottom { + position: fixed; + } + + } + + } + + li { + @include transition(height, 0.1s, ease-out); + @include transition(overflow, 0.1s, linear); + } + + /* Line items that don't contain folders. */ + li:not(.folder) { + cursor: auto; + height: $row-height; + line-height: $row-height; + padding: 0 4px 0 5px; + } + + li.folder { + padding: 0; + border-left: $nest-margin solid rgba(0, 0, 0, 0); + + } + + /** Folder names */ + li.title { + cursor: pointer; + margin-left: -$nest-margin; + } + + /** Hides closed items */ + .closed li:not(.title), + .closed ul li, + .closed ul li > * { + height: 0; + overflow: hidden; + border: 0; + } + + /** Controller row */ + .cr { + clear: both; + padding-left: 3px; + height: $row-height; + overflow: hidden; + } + + /** Name-half (left) */ + .property-name { + cursor: default; + float: left; + clear: left; + width: 40%; + overflow: hidden; + text-overflow: ellipsis; + } + + /** Controller-half (right) */ + .c { + float: left; + width: 60%; + position: relative; + } + + /** Controller placement */ + .c input[type=text] { + border: 0; + margin-top: 4px; + padding: 3px; + width: 100%; + float: right; + } + + /** Shorter number boxes when slider is present. */ + .has-slider input[type=text] { + width: 30%; + /*display: none;*/ + margin-left: 0; + } + + .slider { + float: left; + width: 66%; + margin-left: -5px; + margin-right: 0; + height: 19px; + margin-top: 4px; + } + + .slider-fg { + height: 100%; + } + + .c input[type=checkbox] { + margin-top: 7px; + } + + .c select { + margin-top: 5px; + } + + /** Ensure the entire boolean and function row shows a hand */ + .cr.function, + .cr.function .property-name, /* Don't know why I need to be this explicit */ + .cr.function *, + .cr.boolean, + .cr.boolean * { + cursor: pointer; + } + + /** allow overflow for color selector */ + .cr.color { + overflow: visible; + } + + .selector { + display: none; + position: absolute; + margin-left: -9px; + margin-top: 23px; + z-index: 10; + } + + .c:hover .selector, + .selector.drag { + display: block; + } + + li.save-row { + + padding: 0; + + .button { + display: inline-block; + padding: 0px 6px; + } + + } + + &.dialogue { + background-color: #222; + width: 460px; + padding: 15px; + font-size: 13px; + line-height: 15px; + } + +} + +/* TODO Separate style and structure */ +#dg-new-constructor { + padding: 10px; + color: #222; + font-family: Monaco, monospace; + font-size: 10px; + border: 0; + resize: none; + box-shadow: inset 1px 1px 1px #888; + word-wrap: break-word; + margin: 12px 0; + display: block; + width: 440px; + overflow-y: scroll; + height: 100px; + position: relative; +} + +#dg-local-explain { + display: none; + font-size: 11px; + line-height: 17px; + border-radius: 3px; + background-color: #333; + padding: 8px; + margin-top: 10px; + code { + font-size: 10px; + } +} + +#dat-gui-save-locally { + display: none; +} diff --git a/public/dat.gui-master/src/dat/gui/saveDialogue.html.js b/public/dat.gui-master/src/dat/gui/saveDialogue.html.js new file mode 100644 index 000000000..6a9c3d5ac --- /dev/null +++ b/public/dat.gui-master/src/dat/gui/saveDialogue.html.js @@ -0,0 +1,23 @@ +const saveDialogContents = `
+ + Here's the new load parameter for your GUI's constructor: + + + +
+ + Automatically save + values to localStorage on exit. + +
The values saved to localStorage will + override those passed to dat.GUI's constructor. This makes it + easier to work incrementally, but localStorage is fragile, + and your friends may not see the same values you do. + +
+ +
+ +
`; + +export default saveDialogContents; diff --git a/public/dat.gui-master/src/dat/gui/style.scss b/public/dat.gui-master/src/dat/gui/style.scss new file mode 100644 index 000000000..89705cd45 --- /dev/null +++ b/public/dat.gui-master/src/dat/gui/style.scss @@ -0,0 +1,202 @@ +$background-color: #1a1a1a; + +$hover-lighten: 5%; +$border-lighten: 7%; +$active-lighten: 10%; + +$number-color: #2FA1D6; +$boolean-color: #806787; +$string-color: #1ed36f; +$function-color: #e61d5f; +$save-row-color: #dad5cb; +$button-color: darken($save-row-color, 10%); +$border-color: lighten($background-color, $border-lighten); +$input-color: lighten($background-color, 8.5%); + +@mixin transition($prop, $time, $curve) { + -webkit-transition: $prop $time $curve; + -o-transition: $prop $time $curve; + -moz-transition: $prop $time $curve; + transition: $prop $time $curve; +} + +@mixin gradient($a, $b) { + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from($a), to($b)); + background: -o-gradient(linear, 0% 0%, 0% 100%, from($a), to($b)); + background: -moz-gradient(linear, 0% 0%, 0% 100%, from($a), to($b)); +} + +@mixin button() { + margin-left: 5px; + margin-top: 1px; + border-radius: 2px; + font-size: 9px; + line-height: 7px; + padding: 4px 4px 5px 4px; + background: $button-color; + color: #fff; + text-shadow: 0 1px 0 darken($button-color, 10%); + box-shadow: 0 -1px 0 darken($button-color, 10%); + cursor: pointer; +} + +@mixin gears() { + background: $button-color url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat; + height: 7px; + width: 8px; +} + +@import "structure"; + +/** Main type */ +.dg { + + color: #eee; + font: 11px 'Lucida Grande', sans-serif; + text-shadow: 0 -1px 0 #111; + + /** Auto place */ + &.main { + + /** Scrollbar */ + &::-webkit-scrollbar { + width: 5px; + background: $background-color; + } + &::-webkit-scrollbar-corner { + height: 0; + display: none; + } + &::-webkit-scrollbar-thumb { + border-radius: 5px; + background: lighten($background-color, 30%); + } + + } + + li { + + &:not(.folder) { + background: $background-color; + border-bottom: 1px solid $border-color; + } + + &.save-row { + + line-height: 25px; + background: $save-row-color; + border: 0; + + select { + margin-left: 5px; + width: 108px; + + } + + .button { + + &.gears { + @include gears; + } + + @include button; + + &:hover { + background-color: darken($button-color, 5%); + box-shadow: 0 -1px 0 darken($button-color, 10%); + } + + } + + } + + &.folder { + border-bottom: 0; + } + + &.title { + padding-left: 16px; + background: #000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat; + cursor: pointer; + border-bottom: 1px solid rgba(255, 255, 255, 0.2); + } + + } + + .closed li.title { + background-image: url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==); + } + + /* Controller row,
  • */ + .cr { + + &.boolean { + border-left: 3px solid $boolean-color; + } + + &.color { + border-left: 3px solid; + } + + &.function { + border-left: 3px solid $function-color; + } + + &.number { + border-left: 3px solid $number-color; + input[type=text] { + color: $number-color; + } + } + + &.string { + border-left: 3px solid $string-color; + input[type=text] { + color: $string-color; + } + } + + &.function:hover, + &.boolean:hover { + background: #111; + } + + } + + /** Controllers */ + .c { + + input[type=text] { + + background: $input-color; + outline: none; + &:hover { + background: lighten($input-color, $hover-lighten); + } + &:focus { + background: lighten($input-color, $active-lighten); + color: #fff; + } + + } + + .slider { + background: $input-color; + cursor: ew-resize; + } + + .slider-fg { + background: $number-color; + max-width: 100%; + } + + .slider:hover { + background: lighten($input-color, $hover-lighten); + .slider-fg { + background: lighten($number-color, $hover-lighten); + } + } + + } + +} diff --git a/public/dat.gui-master/src/dat/index.js b/public/dat.gui-master/src/dat/index.js new file mode 100644 index 000000000..87b1a1eca --- /dev/null +++ b/public/dat.gui-master/src/dat/index.js @@ -0,0 +1,61 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +import Color from './color/Color'; +import math from './color/math'; +import interpret from './color/interpret'; + +import Controller from './controllers/Controller'; +import BooleanController from './controllers/BooleanController'; +import OptionController from './controllers/OptionController'; +import StringController from './controllers/StringController'; +import NumberController from './controllers/NumberController'; +import NumberControllerBox from './controllers/NumberControllerBox'; +import NumberControllerSlider from './controllers/NumberControllerSlider'; +import FunctionController from './controllers/FunctionController'; +import ColorController from './controllers/ColorController'; + +import domImport from './dom/dom'; +import GUIImport from './gui/GUI'; + +export const color = { + Color: Color, + math: math, + interpret: interpret +}; + +export const controllers = { + Controller: Controller, + BooleanController: BooleanController, + OptionController: OptionController, + StringController: StringController, + NumberController: NumberController, + NumberControllerBox: NumberControllerBox, + NumberControllerSlider: NumberControllerSlider, + FunctionController: FunctionController, + ColorController: ColorController +}; + +export const dom = { dom: domImport }; + +export const gui = { GUI: GUIImport }; + +export const GUI = GUIImport; + +export default { + color, + controllers, + dom, + gui, + GUI +}; diff --git a/public/dat.gui-master/src/dat/utils/common.js b/public/dat.gui-master/src/dat/utils/common.js new file mode 100644 index 000000000..9ab4288c0 --- /dev/null +++ b/public/dat.gui-master/src/dat/utils/common.js @@ -0,0 +1,157 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +const ARR_EACH = Array.prototype.forEach; +const ARR_SLICE = Array.prototype.slice; + +/** + * Band-aid methods for things that should be a lot easier in JavaScript. + * Implementation and structure inspired by underscore.js + * http://documentcloud.github.com/underscore/ + */ + +const Common = { + BREAK: {}, + + extend: function(target) { + this.each(ARR_SLICE.call(arguments, 1), function(obj) { + const keys = this.isObject(obj) ? Object.keys(obj) : []; + keys.forEach(function(key) { + if (!this.isUndefined(obj[key])) { + target[key] = obj[key]; + } + }.bind(this)); + }, this); + + return target; + }, + + defaults: function(target) { + this.each(ARR_SLICE.call(arguments, 1), function(obj) { + const keys = this.isObject(obj) ? Object.keys(obj) : []; + keys.forEach(function(key) { + if (this.isUndefined(target[key])) { + target[key] = obj[key]; + } + }.bind(this)); + }, this); + + return target; + }, + + compose: function() { + const toCall = ARR_SLICE.call(arguments); + return function() { + let args = ARR_SLICE.call(arguments); + for (let i = toCall.length - 1; i >= 0; i--) { + args = [toCall[i].apply(this, args)]; + } + return args[0]; + }; + }, + + each: function(obj, itr, scope) { + if (!obj) { + return; + } + + if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) { + obj.forEach(itr, scope); + } else if (obj.length === obj.length + 0) { // Is number but not NaN + let key; + let l; + for (key = 0, l = obj.length; key < l; key++) { + if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) { + return; + } + } + } else { + for (const key in obj) { + if (itr.call(scope, obj[key], key) === this.BREAK) { + return; + } + } + } + }, + + defer: function(fnc) { + setTimeout(fnc, 0); + }, + + // if the function is called repeatedly, wait until threshold passes until we execute the function + debounce: function(func, threshold, callImmediately) { + let timeout; + + return function() { + const obj = this; + const args = arguments; + function delayed() { + timeout = null; + if (!callImmediately) func.apply(obj, args); + } + + const callNow = callImmediately || !timeout; + + clearTimeout(timeout); + timeout = setTimeout(delayed, threshold); + + if (callNow) { + func.apply(obj, args); + } + }; + }, + + toArray: function(obj) { + if (obj.toArray) return obj.toArray(); + return ARR_SLICE.call(obj); + }, + + isUndefined: function(obj) { + return obj === undefined; + }, + + isNull: function(obj) { + return obj === null; + }, + + isNaN: function(obj) { + return isNaN(obj); + }, + + isArray: Array.isArray || function(obj) { + return obj.constructor === Array; + }, + + isObject: function(obj) { + return obj === Object(obj); + }, + + isNumber: function(obj) { + return obj === obj + 0; + }, + + isString: function(obj) { + return obj === obj + ''; + }, + + isBoolean: function(obj) { + return obj === false || obj === true; + }, + + isFunction: function(obj) { + return obj instanceof Function; + } + +}; + +export default Common; diff --git a/public/dat.gui-master/src/dat/utils/css.js b/public/dat.gui-master/src/dat/utils/css.js new file mode 100644 index 000000000..fadc82de6 --- /dev/null +++ b/public/dat.gui-master/src/dat/utils/css.js @@ -0,0 +1,37 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +const css = { + load: function(url, indoc) { + const doc = indoc || document; + const link = doc.createElement('link'); + link.type = 'text/css'; + link.rel = 'stylesheet'; + link.href = url; + doc.getElementsByTagName('head')[0].appendChild(link); + }, + + inject: function(cssContent, indoc) { + const doc = indoc || document; + const injected = document.createElement('style'); + injected.type = 'text/css'; + injected.innerHTML = cssContent; + const head = doc.getElementsByTagName('head')[0]; + try { + head.appendChild(injected); + } catch (e) { // Unable to inject CSS, probably because of a Content Security Policy + } + } +}; + +export default css; diff --git a/public/dat.gui-master/src/dat/utils/requestAnimationFrame.js b/public/dat.gui-master/src/dat/utils/requestAnimationFrame.js new file mode 100644 index 000000000..9949e0774 --- /dev/null +++ b/public/dat.gui-master/src/dat/utils/requestAnimationFrame.js @@ -0,0 +1,23 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +function requestAnimationFrame(callback) { + setTimeout(callback, 1000 / 60); +} + +export default window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + requestAnimationFrame; diff --git a/public/dat.gui-master/tests/index.html b/public/dat.gui-master/tests/index.html new file mode 100644 index 000000000..6b146c00a --- /dev/null +++ b/public/dat.gui-master/tests/index.html @@ -0,0 +1,1450 @@ + + + + + + + + + + + + + +

    + +

    + +
    +

    +
      +
      test markup, will be hidden
      + + diff --git a/public/dat.gui-master/tests/jquery.js b/public/dat.gui-master/tests/jquery.js new file mode 100644 index 000000000..11e6d0679 --- /dev/null +++ b/public/dat.gui-master/tests/jquery.js @@ -0,0 +1,9046 @@ +/*! + * jQuery JavaScript Library v1.6.4 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Sep 12 18:54:48 2011 -0400 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Check for digits + rdigit = /\d/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Matches dashed string for camelizing + rdashAlpha = /-([a-z]|[0-9])/ig, + rmsPrefix = /^-ms-/, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = (context ? context.ownerDocument || context : document); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return (context || rootjQuery).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.6.4", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + (this.selector ? " " : "") + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.done( fn ); + + return this; + }, + + eq: function( i ) { + return i === -1 ? + this.slice( i ) : + this.slice( i, +i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).unbind( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery._Deferred(); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNaN: function( obj ) { + return obj == null || !rdigit.test( obj ) || isNaN( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw msg; + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return (new Function( "return " + data ))(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // The extra typeof function check is to prevent crashes + // in Safari 2 (See: #3039) + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array ) { + if ( !array ) { + return -1; + } + + if ( indexOf ) { + return indexOf.call( array, elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can optionally be executed if it's a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return (new Date()).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +return jQuery; + +})(); + + +var // Promise methods + promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ), + // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + // Create a simple deferred (one callbacks list) + _Deferred: function() { + var // callbacks list + callbacks = [], + // stored [ context , args ] + fired, + // to avoid firing when already doing so + firing, + // flag to know if the deferred has been cancelled + cancelled, + // the deferred itself + deferred = { + + // done( f1, f2, ...) + done: function() { + if ( !cancelled ) { + var args = arguments, + i, + length, + elem, + type, + _fired; + if ( fired ) { + _fired = fired; + fired = 0; + } + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + deferred.done.apply( deferred, elem ); + } else if ( type === "function" ) { + callbacks.push( elem ); + } + } + if ( _fired ) { + deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); + } + } + return this; + }, + + // resolve with given context and args + resolveWith: function( context, args ) { + if ( !cancelled && !fired && !firing ) { + // make sure args are available (#8421) + args = args || []; + firing = 1; + try { + while( callbacks[ 0 ] ) { + callbacks.shift().apply( context, args ); + } + } + finally { + fired = [ context, args ]; + firing = 0; + } + } + return this; + }, + + // resolve with this as context and given arguments + resolve: function() { + deferred.resolveWith( this, arguments ); + return this; + }, + + // Has this deferred been resolved? + isResolved: function() { + return !!( firing || fired ); + }, + + // Cancel + cancel: function() { + cancelled = 1; + callbacks = []; + return this; + } + }; + + return deferred; + }, + + // Full fledged deferred (two callbacks list) + Deferred: function( func ) { + var deferred = jQuery._Deferred(), + failDeferred = jQuery._Deferred(), + promise; + // Add errorDeferred methods, then and promise + jQuery.extend( deferred, { + then: function( doneCallbacks, failCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ); + return this; + }, + always: function() { + return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments ); + }, + fail: failDeferred.done, + rejectWith: failDeferred.resolveWith, + reject: failDeferred.resolve, + isRejected: failDeferred.isResolved, + pipe: function( fnDone, fnFail ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + if ( promise ) { + return promise; + } + promise = obj = {}; + } + var i = promiseMethods.length; + while( i-- ) { + obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; + } + return obj; + } + }); + // Make sure only one callback list will be used + deferred.done( failDeferred.cancel ).fail( deferred.cancel ); + // Unexpose cancel + delete deferred.cancel; + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = arguments, + i = 0, + length = args.length, + count = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + // Strange bug in FF4: + // Values changed onto the arguments object sometimes end up as undefined values + // outside the $.when method. Cloning the object into a fresh array solves the issue + deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) ); + } + }; + } + if ( length > 1 ) { + for( ; i < length; i++ ) { + if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return deferred.promise(); + } +}); + + + +jQuery.support = (function() { + + var div = document.createElement( "div" ), + documentElement = document.documentElement, + all, + a, + select, + opt, + input, + marginDiv, + support, + fragment, + body, + testElementParent, + testElement, + testElementStyle, + tds, + events, + eventName, + i, + isSupported; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = "
      a"; + + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName( "tbody" ).length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName( "link" ).length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute( "href" ) === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55$/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains it's value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.firstChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + div.innerHTML = ""; + + // Figure out if the W3C box model works as expected + div.style.width = div.style.paddingLeft = "1px"; + + body = document.getElementsByTagName( "body" )[ 0 ]; + // We use our own, invisible, body unless the body is already present + // in which case we use a div (#9239) + testElement = document.createElement( body ? "div" : "body" ); + testElementStyle = { + visibility: "hidden", + width: 0, + height: 0, + border: 0, + margin: 0, + background: "none" + }; + if ( body ) { + jQuery.extend( testElementStyle, { + position: "absolute", + left: "-1000px", + top: "-1000px" + }); + } + for ( i in testElementStyle ) { + testElement.style[ i ] = testElementStyle[ i ]; + } + testElement.appendChild( div ); + testElementParent = body || documentElement; + testElementParent.insertBefore( testElement, testElementParent.firstChild ); + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + support.boxModel = div.offsetWidth === 2; + + if ( "zoom" in div.style ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
      "; + support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); + } + + div.innerHTML = "
      t
      "; + tds = div.getElementsByTagName( "td" ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE < 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( document.defaultView && document.defaultView.getComputedStyle ) { + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + // Remove the body element we added + testElement.innerHTML = ""; + testElementParent.removeChild( testElement ); + + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for( i in { + submit: 1, + change: 1, + focusin: 1 + } ) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + // Null connected elements to avoid leaks in IE + testElement = fragment = select = opt = body = marginDiv = div = input = null; + + return support; +})(); + +// Keep track of boxModel +jQuery.boxModel = jQuery.support.boxModel; + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || (pvt && id && (cache[ id ] && !cache[ id ][ internalKey ]))) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ jQuery.expando ] = id = ++jQuery.uuid; + } else { + id = jQuery.expando; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); + } else { + cache[ id ] = jQuery.extend(cache[ id ], name); + } + } + + thisCache = cache[ id ]; + + // Internal jQuery data is stored in a separate object inside the object's data + // cache in order to avoid key collisions between internal data and user-defined + // data + if ( pvt ) { + if ( !thisCache[ internalKey ] ) { + thisCache[ internalKey ] = {}; + } + + thisCache = thisCache[ internalKey ]; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should + // not attempt to inspect the internal events object using jQuery.data, as this + // internal data object is undocumented and subject to change. + if ( name === "events" && !thisCache[name] ) { + return thisCache[ internalKey ] && thisCache[ internalKey ].events; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, + + // Reference to internal data cache key + internalKey = jQuery.expando, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; + + if ( thisCache ) { + + // Support interoperable removal of hyphenated or camelcased keys + if ( !thisCache[ name ] ) { + name = jQuery.camelCase( name ); + } + + delete thisCache[ name ]; + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !isEmptyDataObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( pvt ) { + delete cache[ id ][ internalKey ]; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + var internalCache = cache[ id ][ internalKey ]; + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + // Ensure that `cache` is not a window object #10080 + if ( jQuery.support.deleteExpando || !cache.setInterval ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the entire user cache at once because it's faster than + // iterating through each key, but we need to continue to persist internal + // data if it existed + if ( internalCache ) { + cache[ id ] = {}; + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + + cache[ id ][ internalKey ] = internalCache; + + // Otherwise, we need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + } else if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } else { + elem[ jQuery.expando ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 ) { + var attr = this[0].attributes, name; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( this[0], name, data[ name ] ); + } + } + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var $this = jQuery( this ), + args = [ parts[0], value ]; + + $this.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + $this.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + !jQuery.isNaN( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON +// property to be considered empty objects; this property always exists in +// order to make sure JSON.stringify does not expose internal metadata +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery.data( elem, deferDataKey, undefined, true ); + if ( defer && + ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) && + ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery.data( elem, queueDataKey, undefined, true ) && + !jQuery.data( elem, markDataKey, undefined, true ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.resolve(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = (type || "fx") + "mark"; + jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 ); + if ( count ) { + jQuery.data( elem, key, count, true ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + if ( elem ) { + type = (type || "fx") + "queue"; + var q = jQuery.data( elem, type, undefined, true ); + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery.data( elem, type, jQuery.makeArray(data), true ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + defer; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift("inprogress"); + } + + fn.call(elem, function() { + jQuery.dequeue(elem, type); + }); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; + type = type || "fx"; + + return this.queue( type, function() { + var elem = this; + setTimeout(function() { + jQuery.dequeue( elem, type ); + }, time ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) { + count++; + tmp.done( resolve ); + } + } + resolve(); + return defer.promise(); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + nodeHook, boolHook; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.prop ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classNames, i, l, elem, className, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + classNames = (value || "").split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + className = (" " + elem.className + " ").replace( rclass, " " ); + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[ c ] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " "; + for ( var i = 0, l = this.length; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return undefined; + } + + var isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attrFix: { + // Always normalize to ensure hook usage + tabindex: "tabIndex" + }, + + attr: function( elem, name, value, pass ) { + var nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return undefined; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( !("getAttribute" in elem) ) { + return jQuery.prop( elem, name, value ); + } + + var ret, hooks, + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // Normalize the name if needed + if ( notxml ) { + name = jQuery.attrFix[ name ] || name; + + hooks = jQuery.attrHooks[ name ]; + + if ( !hooks ) { + // Use boolHook for boolean attributes + if ( rboolean.test( name ) ) { + hooks = boolHook; + + // Use nodeHook if available( IE6/7 ) + } else if ( nodeHook ) { + hooks = nodeHook; + } + } + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return undefined; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, name ) { + var propName; + if ( elem.nodeType === 1 ) { + name = jQuery.attrFix[ name ] || name; + + jQuery.attr( elem, name, "" ); + elem.removeAttribute( name ); + + // Set corresponding property to false for boolean attributes + if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) { + elem[ propName ] = false; + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return undefined; + } + + var ret, hooks, + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return (elem[ name ] = value); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Add the tabindex propHook to attrHooks for back-compat +jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex; + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode; + return jQuery.prop( elem, name ) === true || ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !jQuery.support.getSetAttribute ) { + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + // Return undefined if nodeValue is empty string + return ret && ret.nodeValue !== "" ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return (ret.nodeValue = value + ""); + } + }; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return (elem.style.cssText = "" + value); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0); + } + } + }); +}); + + + + +var rnamespaces = /\.(.*)$/, + rformElems = /^(?:textarea|input|select)$/i, + rperiod = /\./g, + rspaces = / /g, + rescape = /[^\w\s.|`]/g, + fcleanup = function( nm ) { + return nm.replace(rescape, "\\$&"); + }; + +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code originated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function( elem, types, handler, data ) { + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } else if ( !handler ) { + // Fixes bug #7229. Fix recommended by jdalton + return; + } + + var handleObjIn, handleObj; + + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure + var elemData = jQuery._data( elem ); + + // If no elemData is found then we must be trying to bind to one of the + // banned noData elements + if ( !elemData ) { + return; + } + + var events = elemData.events, + eventHandle = elemData.handle; + + if ( !events ) { + elemData.events = events = {}; + } + + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.handle.apply( eventHandle.elem, arguments ) : + undefined; + }; + } + + // Add elem as a property of the handle function + // This is to prevent a memory leak with non-native events in IE. + eventHandle.elem = elem; + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = types.split(" "); + + var type, i = 0, namespaces; + + while ( (type = types[ i++ ]) ) { + handleObj = handleObjIn ? + jQuery.extend({}, handleObjIn) : + { handler: handler, data: data }; + + // Namespaced event handlers + if ( type.indexOf(".") > -1 ) { + namespaces = type.split("."); + type = namespaces.shift(); + handleObj.namespace = namespaces.slice(0).sort().join("."); + + } else { + namespaces = []; + handleObj.namespace = ""; + } + + handleObj.type = type; + if ( !handleObj.guid ) { + handleObj.guid = handler.guid; + } + + // Get the current list of functions bound to this event + var handlers = events[ type ], + special = jQuery.event.special[ type ] || {}; + + // Init the event handler queue + if ( !handlers ) { + handlers = events[ type ] = []; + + // Check for a special event handler + // Only use addEventListener/attachEvent if the special + // events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add the function to the element's handler list + handlers.push( handleObj ); + + // Keep track of which events have been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, pos ) { + // don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } + + var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + events = elemData && elemData.events; + + if ( !elemData || !events ) { + return; + } + + // types is actually an event object here + if ( types && types.type ) { + handler = types.handler; + types = types.type; + } + + // Unbind all events for the element + if ( !types || typeof types === "string" && types.charAt(0) === "." ) { + types = types || ""; + + for ( type in events ) { + jQuery.event.remove( elem, type + types ); + } + + return; + } + + // Handle multiple events separated by a space + // jQuery(...).unbind("mouseover mouseout", fn); + types = types.split(" "); + + while ( (type = types[ i++ ]) ) { + origType = type; + handleObj = null; + all = type.indexOf(".") < 0; + namespaces = []; + + if ( !all ) { + // Namespaced event handlers + namespaces = type.split("."); + type = namespaces.shift(); + + namespace = new RegExp("(^|\\.)" + + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + eventType = events[ type ]; + + if ( !eventType ) { + continue; + } + + if ( !handler ) { + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( all || namespace.test( handleObj.namespace ) ) { + jQuery.event.remove( elem, origType, handleObj.handler, j ); + eventType.splice( j--, 1 ); + } + } + + continue; + } + + special = jQuery.event.special[ type ] || {}; + + for ( j = pos || 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( handler.guid === handleObj.guid ) { + // remove the given handler for the given type + if ( all || namespace.test( handleObj.namespace ) ) { + if ( pos == null ) { + eventType.splice( j--, 1 ); + } + + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + + if ( pos != null ) { + break; + } + } + } + + // remove generic event handler if no more handlers exist + if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + ret = null; + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + var handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + delete elemData.events; + delete elemData.handle; + + if ( jQuery.isEmptyObject( elemData ) ) { + jQuery.removeData( elem, undefined, true ); + } + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Event object or event type + var type = event.type || event, + namespaces = [], + exclusive; + + if ( type.indexOf("!") >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.exclusive = exclusive; + event.namespace = namespaces.join("."); + event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); + + // triggerHandler() and global events don't bubble or run the default action + if ( onlyHandlers || !elem ) { + event.preventDefault(); + event.stopPropagation(); + } + + // Handle a global trigger + if ( !elem ) { + // TODO: Stop taunting the data cache; remove global events and always attach to document + jQuery.each( jQuery.cache, function() { + // internalKey variable is just used to make it easier to find + // and potentially change this stuff later; currently it just + // points to jQuery.expando + var internalKey = jQuery.expando, + internalCache = this[ internalKey ]; + if ( internalCache && internalCache.events && internalCache.events[ type ] ) { + jQuery.event.trigger( event, data, internalCache.handle.elem ); + } + }); + return; + } + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + event.target = elem; + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + var cur = elem, + // IE doesn't like method names with a colon (#3533, #8272) + ontype = type.indexOf(":") < 0 ? "on" + type : ""; + + // Fire event on the current element, then bubble up the DOM tree + do { + var handle = jQuery._data( cur, "handle" ); + + event.currentTarget = cur; + if ( handle ) { + handle.apply( cur, data ); + } + + // Trigger an inline bound script + if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) { + event.result = false; + event.preventDefault(); + } + + // Bubble up to document, then to window + cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window; + } while ( cur && !event.isPropagationStopped() ); + + // If nobody prevented the default action, do it now + if ( !event.isDefaultPrevented() ) { + var old, + special = jQuery.event.special[ type ] || {}; + + if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction)() check here because IE6/7 fails that test. + // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch. + try { + if ( ontype && elem[ type ] ) { + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + jQuery.event.triggered = type; + elem[ type ](); + } + } catch ( ieError ) {} + + if ( old ) { + elem[ ontype ] = old; + } + + jQuery.event.triggered = undefined; + } + } + + return event.result; + }, + + handle: function( event ) { + event = jQuery.event.fix( event || window.event ); + // Snapshot the handlers list since a called handler may add/remove events. + var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0), + run_all = !event.exclusive && !event.namespace, + args = Array.prototype.slice.call( arguments, 0 ); + + // Use the fix-ed Event rather than the (read-only) native event + args[0] = event; + event.currentTarget = this; + + for ( var j = 0, l = handlers.length; j < l; j++ ) { + var handleObj = handlers[ j ]; + + // Triggered event must 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event. + if ( run_all || event.namespace_re.test( handleObj.namespace ) ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; + + var ret = handleObj.handler.apply( this, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + return event.result; + }, + + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // store a copy of the original event object + // and "clone" to set read-only properties + var originalEvent = event; + event = jQuery.Event( originalEvent ); + + for ( var i = this.props.length, prop; i; ) { + prop = this.props[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary + if ( !event.target ) { + // Fixes #1925 where srcElement might not be defined either + event.target = event.srcElement || document; + } + + // check if target is a textnode (safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) { + event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; + } + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var eventDocument = event.target.ownerDocument || document, + doc = eventDocument.documentElement, + body = eventDocument.body; + + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add which for key events + if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { + event.which = event.charCode != null ? event.charCode : event.keyCode; + } + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) { + event.metaKey = event.ctrlKey; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button !== undefined ) { + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + } + + return event; + }, + + // Deprecated, use jQuery.guid instead + guid: 1E8, + + // Deprecated, use jQuery.proxy instead + proxy: jQuery.proxy, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady, + teardown: jQuery.noop + }, + + live: { + add: function( handleObj ) { + jQuery.event.add( this, + liveConvert( handleObj.origType, handleObj.selector ), + jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); + }, + + remove: function( handleObj ) { + jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); + } + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !this.preventDefault ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // timeStamp is buggy for some events on Firefox(#3843) + // So we won't rely on the native value + this.timeStamp = jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Checks if an event happened on an element within another element +// Used in jQuery.event.special.mouseenter and mouseleave handlers +var withinElement = function( event ) { + + // Check if mouse(over|out) are still within the same parent element + var related = event.relatedTarget, + inside = false, + eventType = event.type; + + event.type = event.data; + + if ( related !== this ) { + + if ( related ) { + inside = jQuery.contains( this, related ); + } + + if ( !inside ) { + + jQuery.event.handle.apply( this, arguments ); + + event.type = eventType; + } + } +}, + +// In case of event delegation, we only need to rename the event.type, +// liveHandler will take care of the rest. +delegate = function( event ) { + event.type = event.data; + jQuery.event.handle.apply( this, arguments ); +}; + +// Create mouseenter and mouseleave events +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + setup: function( data ) { + jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); + }, + teardown: function( data ) { + jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); + } + }; +}); + +// submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function( data, namespaces ) { + if ( !jQuery.nodeName( this, "form" ) ) { + jQuery.event.add(this, "click.specialSubmit", function( e ) { + // Avoid triggering error on non-existent type attribute in IE VML (#7071) + var elem = e.target, + type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : ""; + + if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { + trigger( "submit", this, arguments ); + } + }); + + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { + var elem = e.target, + type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : ""; + + if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { + trigger( "submit", this, arguments ); + } + }); + + } else { + return false; + } + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialSubmit" ); + } + }; + +} + +// change delegation, happens here so we have bind. +if ( !jQuery.support.changeBubbles ) { + + var changeFilters, + + getVal = function( elem ) { + var type = jQuery.nodeName( elem, "input" ) ? elem.type : "", + val = elem.value; + + if ( type === "radio" || type === "checkbox" ) { + val = elem.checked; + + } else if ( type === "select-multiple" ) { + val = elem.selectedIndex > -1 ? + jQuery.map( elem.options, function( elem ) { + return elem.selected; + }).join("-") : + ""; + + } else if ( jQuery.nodeName( elem, "select" ) ) { + val = elem.selectedIndex; + } + + return val; + }, + + testChange = function testChange( e ) { + var elem = e.target, data, val; + + if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { + return; + } + + data = jQuery._data( elem, "_change_data" ); + val = getVal(elem); + + // the current data will be also retrieved by beforeactivate + if ( e.type !== "focusout" || elem.type !== "radio" ) { + jQuery._data( elem, "_change_data", val ); + } + + if ( data === undefined || val === data ) { + return; + } + + if ( data != null || val ) { + e.type = "change"; + e.liveFired = undefined; + jQuery.event.trigger( e, arguments[1], elem ); + } + }; + + jQuery.event.special.change = { + filters: { + focusout: testChange, + + beforedeactivate: testChange, + + click: function( e ) { + var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; + + if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) { + testChange.call( this, e ); + } + }, + + // Change has to be called before submit + // Keydown will be called before keypress, which is used in submit-event delegation + keydown: function( e ) { + var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; + + if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) || + (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || + type === "select-multiple" ) { + testChange.call( this, e ); + } + }, + + // Beforeactivate happens also before the previous element is blurred + // with this event you can't trigger a change event, but you can store + // information + beforeactivate: function( e ) { + var elem = e.target; + jQuery._data( elem, "_change_data", getVal(elem) ); + } + }, + + setup: function( data, namespaces ) { + if ( this.type === "file" ) { + return false; + } + + for ( var type in changeFilters ) { + jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); + } + + return rformElems.test( this.nodeName ); + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialChange" ); + + return rformElems.test( this.nodeName ); + } + }; + + changeFilters = jQuery.event.special.change.filters; + + // Handle when the input is .focus()'d + changeFilters.focus = changeFilters.beforeactivate; +} + +function trigger( type, elem, args ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + // Don't pass args or remember liveFired; they apply to the donor event. + var event = jQuery.extend( {}, args[ 0 ] ); + event.type = type; + event.originalEvent = {}; + event.liveFired = undefined; + jQuery.event.handle.call( elem, event ); + if ( event.isDefaultPrevented() ) { + args[ 0 ].preventDefault(); + } +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + + function handler( donor ) { + // Donor event is always a native one; fix it and switch its type. + // Let focusin/out handler cancel the donor focus/blur event. + var e = jQuery.event.fix( donor ); + e.type = fix; + e.originalEvent = {}; + jQuery.event.trigger( e, null, e.target ); + if ( e.isDefaultPrevented() ) { + donor.preventDefault(); + } + } + }); +} + +jQuery.each(["bind", "one"], function( i, name ) { + jQuery.fn[ name ] = function( type, data, fn ) { + var handler; + + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this[ name ](key, data, type[key], fn); + } + return this; + } + + if ( arguments.length === 2 || data === false ) { + fn = data; + data = undefined; + } + + if ( name === "one" ) { + handler = function( event ) { + jQuery( this ).unbind( event, handler ); + return fn.apply( this, arguments ); + }; + handler.guid = fn.guid || jQuery.guid++; + } else { + handler = fn; + } + + if ( type === "unload" && name !== "one" ) { + this.one( type, data, fn ); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.add( this[i], type, handler, data ); + } + } + + return this; + }; +}); + +jQuery.fn.extend({ + unbind: function( type, fn ) { + // Handle object literals + if ( typeof type === "object" && !type.preventDefault ) { + for ( var key in type ) { + this.unbind(key, type[key]); + } + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.remove( this[i], type, fn ); + } + } + + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.live( types, data, fn, selector ); + }, + + undelegate: function( selector, types, fn ) { + if ( arguments.length === 0 ) { + return this.unbind( "live" ); + + } else { + return this.die( types, null, fn, selector ); + } + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +var liveMap = { + focus: "focusin", + blur: "focusout", + mouseenter: "mouseover", + mouseleave: "mouseout" +}; + +jQuery.each(["live", "die"], function( i, name ) { + jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { + var type, i = 0, match, namespaces, preType, + selector = origSelector || this.selector, + context = origSelector ? this : jQuery( this.context ); + + if ( typeof types === "object" && !types.preventDefault ) { + for ( var key in types ) { + context[ name ]( key, data, types[key], selector ); + } + + return this; + } + + if ( name === "die" && !types && + origSelector && origSelector.charAt(0) === "." ) { + + context.unbind( origSelector ); + + return this; + } + + if ( data === false || jQuery.isFunction( data ) ) { + fn = data || returnFalse; + data = undefined; + } + + types = (types || "").split(" "); + + while ( (type = types[ i++ ]) != null ) { + match = rnamespaces.exec( type ); + namespaces = ""; + + if ( match ) { + namespaces = match[0]; + type = type.replace( rnamespaces, "" ); + } + + if ( type === "hover" ) { + types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); + continue; + } + + preType = type; + + if ( liveMap[ type ] ) { + types.push( liveMap[ type ] + namespaces ); + type = type + namespaces; + + } else { + type = (liveMap[ type ] || type) + namespaces; + } + + if ( name === "live" ) { + // bind live handler + for ( var j = 0, l = context.length; j < l; j++ ) { + jQuery.event.add( context[j], "live." + liveConvert( type, selector ), + { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); + } + + } else { + // unbind live handler + context.unbind( "live." + liveConvert( type, selector ), fn ); + } + } + + return this; + }; +}); + +function liveHandler( event ) { + var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, + elems = [], + selectors = [], + events = jQuery._data( this, "events" ); + + // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) + if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { + return; + } + + if ( event.namespace ) { + namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + event.liveFired = this; + + var live = events.live.slice(0); + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { + selectors.push( handleObj.selector ); + + } else { + live.splice( j--, 1 ); + } + } + + match = jQuery( event.target ).closest( selectors, event.currentTarget ); + + for ( i = 0, l = match.length; i < l; i++ ) { + close = match[i]; + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { + elem = close.elem; + related = null; + + // Those two events require additional checking + if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { + event.type = handleObj.preType; + related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; + + // Make sure not to accidentally match a child element with the same selector + if ( related && jQuery.contains( elem, related ) ) { + related = elem; + } + } + + if ( !related || related !== elem ) { + elems.push({ elem: elem, handleObj: handleObj, level: close.level }); + } + } + } + } + + for ( i = 0, l = elems.length; i < l; i++ ) { + match = elems[i]; + + if ( maxLevel && match.level > maxLevel ) { + break; + } + + event.currentTarget = match.elem; + event.data = match.handleObj.data; + event.handleObj = match.handleObj; + + ret = match.handleObj.origHandler.apply( match.elem, arguments ); + + if ( ret === false || event.isPropagationStopped() ) { + maxLevel = match.level; + + if ( ret === false ) { + stop = false; + } + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + + return stop; +} + +function liveConvert( type, selector ) { + return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&"); +} + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.bind( name, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var match, + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var found, item, + filter = Expr.filter[ type ], + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + var first = match[2], + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Utility function for retreiving the text value of an array of DOM nodes +Sizzle.getText = function( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += Sizzle.getText( elem.childNodes ); + } + } + + return ret; +}; + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

      "; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
      "; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( typeof selector === "string" ? + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array + if ( jQuery.isArray( selectors ) ) { + var match, selector, + matches = {}, + level = 1; + + if ( cur && selectors.length ) { + for ( i = 0, l = selectors.length; i < l; i++ ) { + selector = selectors[i]; + + if ( !matches[ selector ] ) { + matches[ selector ] = POS.test( selector ) ? + jQuery( selector, context || this.context ) : + selector; + } + } + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( selector in matches ) { + match = matches[ selector ]; + + if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) { + ret.push({ selector: selector, elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ), + // The variable 'args' was introduced in + // https://github.com/jquery/jquery/commit/52a0238 + // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. + // http://code.google.com/p/v8/issues/detail?id=1050 + args = slice.call(arguments); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, args.join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return (elem === qualifier) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return (jQuery.inArray( elem, qualifier ) >= 0) === keep; + }); +} + + + + +var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", "" ], + legend: [ 1, "
      ", "
      " ], + thead: [ 1, "", "
      " ], + tr: [ 2, "", "
      " ], + td: [ 3, "", "
      " ], + col: [ 2, "", "
      " ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and creative coding -- a4-hcaouette -- CS4241 Assignment 4 -
      + -
      + + From 4576512bb0f40b87ec94cf92f17e69801ff8e23f Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 14:00:20 -0400 Subject: [PATCH 26/54] removed lib --- public/{dat.gui-master => }/build/dat.gui.css | 0 public/{dat.gui-master => }/build/dat.gui.js | 0 .../{dat.gui-master => }/build/dat.gui.js.map | 0 .../{dat.gui-master => }/build/dat.gui.min.js | 0 .../build/dat.gui.module.js | 0 .../build/dat.gui.module.js.map | 0 public/dat.gui-master/.babelrc | 7 - public/dat.gui-master/.gitignore | 5 - public/dat.gui-master/API.md | 487 - public/dat.gui-master/CHANGELOG.md | 64 - public/dat.gui-master/LICENSE | 202 - public/dat.gui-master/README.md | 67 - public/dat.gui-master/bower.json | 24 - public/dat.gui-master/example.html | 63 - public/dat.gui-master/licenseBanner.txt | 12 - public/dat.gui-master/package.json | 74 - public/dat.gui-master/rollup.config.js | 55 - public/dat.gui-master/rollup.config.min.js | 38 - public/dat.gui-master/src/dat/color/Color.js | 153 - .../dat.gui-master/src/dat/color/interpret.js | 300 - public/dat.gui-master/src/dat/color/math.js | 93 - .../dat.gui-master/src/dat/color/toString.js | 52 - .../src/dat/controllers/BooleanController.js | 70 - .../src/dat/controllers/ColorController.js | 341 - .../src/dat/controllers/Controller.js | 125 - .../src/dat/controllers/ControllerFactory.js | 66 - .../src/dat/controllers/FunctionController.js | 56 - .../src/dat/controllers/NumberController.js | 120 - .../dat/controllers/NumberControllerBox.js | 116 - .../dat/controllers/NumberControllerSlider.js | 118 - .../src/dat/controllers/OptionController.js | 85 - .../src/dat/controllers/StringController.js | 68 - .../dat.gui-master/src/dat/dom/CenteredDiv.js | 104 - public/dat.gui-master/src/dat/dom/dom.js | 292 - public/dat.gui-master/src/dat/gui/GUI.js | 1409 --- .../src/dat/gui/_structure.scss | 300 - .../src/dat/gui/saveDialogue.html.js | 23 - public/dat.gui-master/src/dat/gui/style.scss | 202 - public/dat.gui-master/src/dat/index.js | 61 - public/dat.gui-master/src/dat/utils/common.js | 157 - public/dat.gui-master/src/dat/utils/css.js | 37 - .../src/dat/utils/requestAnimationFrame.js | 23 - public/dat.gui-master/tests/index.html | 1450 --- public/dat.gui-master/tests/jquery.js | 9046 ----------------- public/dat.gui-master/tests/qunit.css | 226 - public/dat.gui-master/tests/qunit.js | 1587 --- 46 files changed, 17778 deletions(-) rename public/{dat.gui-master => }/build/dat.gui.css (100%) rename public/{dat.gui-master => }/build/dat.gui.js (100%) rename public/{dat.gui-master => }/build/dat.gui.js.map (100%) rename public/{dat.gui-master => }/build/dat.gui.min.js (100%) rename public/{dat.gui-master => }/build/dat.gui.module.js (100%) rename public/{dat.gui-master => }/build/dat.gui.module.js.map (100%) delete mode 100644 public/dat.gui-master/.babelrc delete mode 100644 public/dat.gui-master/.gitignore delete mode 100644 public/dat.gui-master/API.md delete mode 100644 public/dat.gui-master/CHANGELOG.md delete mode 100644 public/dat.gui-master/LICENSE delete mode 100644 public/dat.gui-master/README.md delete mode 100644 public/dat.gui-master/bower.json delete mode 100644 public/dat.gui-master/example.html delete mode 100644 public/dat.gui-master/licenseBanner.txt delete mode 100644 public/dat.gui-master/package.json delete mode 100644 public/dat.gui-master/rollup.config.js delete mode 100644 public/dat.gui-master/rollup.config.min.js delete mode 100644 public/dat.gui-master/src/dat/color/Color.js delete mode 100644 public/dat.gui-master/src/dat/color/interpret.js delete mode 100644 public/dat.gui-master/src/dat/color/math.js delete mode 100644 public/dat.gui-master/src/dat/color/toString.js delete mode 100644 public/dat.gui-master/src/dat/controllers/BooleanController.js delete mode 100644 public/dat.gui-master/src/dat/controllers/ColorController.js delete mode 100644 public/dat.gui-master/src/dat/controllers/Controller.js delete mode 100644 public/dat.gui-master/src/dat/controllers/ControllerFactory.js delete mode 100644 public/dat.gui-master/src/dat/controllers/FunctionController.js delete mode 100644 public/dat.gui-master/src/dat/controllers/NumberController.js delete mode 100644 public/dat.gui-master/src/dat/controllers/NumberControllerBox.js delete mode 100644 public/dat.gui-master/src/dat/controllers/NumberControllerSlider.js delete mode 100644 public/dat.gui-master/src/dat/controllers/OptionController.js delete mode 100644 public/dat.gui-master/src/dat/controllers/StringController.js delete mode 100644 public/dat.gui-master/src/dat/dom/CenteredDiv.js delete mode 100644 public/dat.gui-master/src/dat/dom/dom.js delete mode 100644 public/dat.gui-master/src/dat/gui/GUI.js delete mode 100644 public/dat.gui-master/src/dat/gui/_structure.scss delete mode 100644 public/dat.gui-master/src/dat/gui/saveDialogue.html.js delete mode 100644 public/dat.gui-master/src/dat/gui/style.scss delete mode 100644 public/dat.gui-master/src/dat/index.js delete mode 100644 public/dat.gui-master/src/dat/utils/common.js delete mode 100644 public/dat.gui-master/src/dat/utils/css.js delete mode 100644 public/dat.gui-master/src/dat/utils/requestAnimationFrame.js delete mode 100644 public/dat.gui-master/tests/index.html delete mode 100644 public/dat.gui-master/tests/jquery.js delete mode 100644 public/dat.gui-master/tests/qunit.css delete mode 100644 public/dat.gui-master/tests/qunit.js diff --git a/public/dat.gui-master/build/dat.gui.css b/public/build/dat.gui.css similarity index 100% rename from public/dat.gui-master/build/dat.gui.css rename to public/build/dat.gui.css diff --git a/public/dat.gui-master/build/dat.gui.js b/public/build/dat.gui.js similarity index 100% rename from public/dat.gui-master/build/dat.gui.js rename to public/build/dat.gui.js diff --git a/public/dat.gui-master/build/dat.gui.js.map b/public/build/dat.gui.js.map similarity index 100% rename from public/dat.gui-master/build/dat.gui.js.map rename to public/build/dat.gui.js.map diff --git a/public/dat.gui-master/build/dat.gui.min.js b/public/build/dat.gui.min.js similarity index 100% rename from public/dat.gui-master/build/dat.gui.min.js rename to public/build/dat.gui.min.js diff --git a/public/dat.gui-master/build/dat.gui.module.js b/public/build/dat.gui.module.js similarity index 100% rename from public/dat.gui-master/build/dat.gui.module.js rename to public/build/dat.gui.module.js diff --git a/public/dat.gui-master/build/dat.gui.module.js.map b/public/build/dat.gui.module.js.map similarity index 100% rename from public/dat.gui-master/build/dat.gui.module.js.map rename to public/build/dat.gui.module.js.map diff --git a/public/dat.gui-master/.babelrc b/public/dat.gui-master/.babelrc deleted file mode 100644 index 16c30ec35..000000000 --- a/public/dat.gui-master/.babelrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "presets": [ - ["env", { - "modules": false - }] - ] -} diff --git a/public/dat.gui-master/.gitignore b/public/dat.gui-master/.gitignore deleted file mode 100644 index 516a13dfd..000000000 --- a/public/dat.gui-master/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.DS_Store -.sass-cache -.idea/ -node_modules/ -tmp/ diff --git a/public/dat.gui-master/API.md b/public/dat.gui-master/API.md deleted file mode 100644 index 8d18170d1..000000000 --- a/public/dat.gui-master/API.md +++ /dev/null @@ -1,487 +0,0 @@ -# dat.GUI API - -Details about the classes, methods, and properties provided by dat.GUI. For more -hands-on examples, see the dat.GUI [tutorial](http://workshop.chromeexperiments.com/examples/gui). - - - -## Classes - -
      -
      GUI
      -

      A lightweight controller library for JavaScript. It allows you to easily -manipulate variables and fire functions on the fly.

      -
      -
      Controller
      -

      An "abstract" class that represents a given property of an object.

      -
      -
      NumberControllerdat.controllers.Controller
      -

      Represents a given property of an object that is a number.

      -
      -
      - - - -## GUI -A lightweight controller library for JavaScript. It allows you to easily -manipulate variables and fire functions on the fly. - -**Kind**: global class - -* [GUI](#GUI) - * [new GUI([params])](#new_GUI_new) - * [.domElement](#GUI+domElement) : DOMElement - * [.parent](#GUI+parent) : dat.gui.GUI - * [.autoPlace](#GUI+autoPlace) : Boolean - * [.closeOnTop](#GUI+closeOnTop) : Boolean - * [.preset](#GUI+preset) : String - * [.width](#GUI+width) : Number - * [.name](#GUI+name) : String - * [.closed](#GUI+closed) : Boolean - * [.load](#GUI+load) : Object - * [.useLocalStorage](#GUI+useLocalStorage) : Boolean - * [.add(object, property, [min], [max], [step])](#GUI+add) ⇒ [Controller](#Controller) - * [.addColor(object, property)](#GUI+addColor) ⇒ [Controller](#Controller) - * [.remove(controller)](#GUI+remove) - * [.destroy()](#GUI+destroy) - * [.addFolder(name)](#GUI+addFolder) ⇒ dat.gui.GUI - * [.removeFolder(folder)](#GUI+removeFolder) - * [.open()](#GUI+open) - * [.close()](#GUI+close) - * [.hide()](#GUI+hide) - * [.show()](#GUI+show) - * [.getRoot()](#GUI+getRoot) ⇒ dat.gui.GUI - * [.getSaveObject()](#GUI+getSaveObject) ⇒ Object - - - -### new GUI([params]) - -| Param | Type | Default | Description | -| --- | --- | --- | --- | -| [params] | Object | | | -| [params.name] | String | | The name of this GUI. | -| [params.load] | Object | | JSON object representing the saved state of this GUI. | -| [params.parent] | dat.gui.GUI | | The GUI I'm nested in. | -| [params.autoPlace] | Boolean | true | | -| [params.hideable] | Boolean | true | If true, GUI is shown/hidden by h keypress. | -| [params.closed] | Boolean | false | If true, starts closed | -| [params.closeOnTop] | Boolean | false | If true, close/open button shows on top of the GUI | - -**Example** -```js -// Creating a GUI with options. -var gui = new dat.GUI({name: 'My GUI'}); -``` -**Example** -```js -// Creating a GUI and a subfolder. -var gui = new dat.GUI(); -var folder1 = gui.addFolder('Flow Field'); -``` - - -### gui.domElement : DOMElement -Outermost DOM Element - -**Kind**: instance property of [GUI](#GUI) - - -### gui.parent : dat.gui.GUI -The parent GUI - -**Kind**: instance property of [GUI](#GUI) - - -### gui.autoPlace : Boolean -Handles GUI's element placement for you - -**Kind**: instance property of [GUI](#GUI) - - -### gui.closeOnTop : Boolean -Handles GUI's position of open/close button - -**Kind**: instance property of [GUI](#GUI) - - -### gui.preset : String -The identifier for a set of saved values - -**Kind**: instance property of [GUI](#GUI) - - -### gui.width : Number -The width of GUI element - -**Kind**: instance property of [GUI](#GUI) - - -### gui.name : String -The name of GUI. Used for folders. i.e -a folder's name - -**Kind**: instance property of [GUI](#GUI) - - -### gui.closed : Boolean -Whether the GUI is collapsed or not - -**Kind**: instance property of [GUI](#GUI) - - -### gui.load : Object -Contains all presets - -**Kind**: instance property of [GUI](#GUI) - - -### gui.useLocalStorage : Boolean -Determines whether or not to use localStorage as the means for -remembering - -**Kind**: instance property of [GUI](#GUI) - - -### gui.add(object, property, [min], [max], [step]) ⇒ [Controller](#Controller) -Adds a new [Controller](#Controller) to the GUI. The type of controller created -is inferred from the initial value of object[property]. For -color properties, see [addColor](addColor). - -**Kind**: instance method of [GUI](#GUI) -**Returns**: [Controller](#Controller) - The controller that was added to the GUI. - -| Param | Type | Description | -| --- | --- | --- | -| object | Object | The object to be manipulated | -| property | String | The name of the property to be manipulated | -| [min] | Number | Minimum allowed value | -| [max] | Number | Maximum allowed value | -| [step] | Number | Increment by which to change value | - -**Example** -```js -// Add a string controller. -var person = {name: 'Sam'}; -gui.add(person, 'name'); -``` -**Example** -```js -// Add a number controller slider. -var person = {age: 45}; -gui.add(person, 'age', 0, 100); -``` - - -### gui.addColor(object, property) ⇒ [Controller](#Controller) -Adds a new color controller to the GUI. - -**Kind**: instance method of [GUI](#GUI) -**Returns**: [Controller](#Controller) - The controller that was added to the GUI. - -| Param | -| --- | -| object | -| property | - -**Example** -```js -var palette = { - color1: '#FF0000', // CSS string - color2: [ 0, 128, 255 ], // RGB array - color3: [ 0, 128, 255, 0.3 ], // RGB with alpha - color4: { h: 350, s: 0.9, v: 0.3 } // Hue, saturation, value -}; -gui.addColor(palette, 'color1'); -gui.addColor(palette, 'color2'); -gui.addColor(palette, 'color3'); -gui.addColor(palette, 'color4'); -``` - - -### gui.remove(controller) -Removes the given controller from the GUI. - -**Kind**: instance method of [GUI](#GUI) - -| Param | Type | -| --- | --- | -| controller | [Controller](#Controller) | - - - -### gui.destroy() -Removes the root GUI from the document and unbinds all event listeners. -For subfolders, use `gui.removeFolder(folder)` instead. - -**Kind**: instance method of [GUI](#GUI) - - -### gui.addFolder(name) ⇒ dat.gui.GUI -Creates a new subfolder GUI instance. - -**Kind**: instance method of [GUI](#GUI) -**Returns**: dat.gui.GUI - The new folder. -**Throws**: - -- Error if this GUI already has a folder by the specified -name - - -| Param | -| --- | -| name | - - - -### gui.removeFolder(folder) -Removes a subfolder GUI instance. - -**Kind**: instance method of [GUI](#GUI) - -| Param | Type | Description | -| --- | --- | --- | -| folder | dat.gui.GUI | The folder to remove. | - - - -### gui.open() -Opens the GUI. - -**Kind**: instance method of [GUI](#GUI) - - -### gui.close() -Closes the GUI. - -**Kind**: instance method of [GUI](#GUI) - - -### gui.hide() -Hides the GUI. - -**Kind**: instance method of [GUI](#GUI) - - -### gui.show() -Shows the GUI. - -**Kind**: instance method of [GUI](#GUI) - - -### gui.getRoot() ⇒ dat.gui.GUI -**Kind**: instance method of [GUI](#GUI) -**Returns**: dat.gui.GUI - the topmost parent GUI of a nested GUI. - - -### gui.getSaveObject() ⇒ Object -**Kind**: instance method of [GUI](#GUI) -**Returns**: Object - a JSON object representing the current state of -this GUI as well as its remembered properties. - - -## Controller -An "abstract" class that represents a given property of an object. - -**Kind**: global class - -* [Controller](#Controller) - * [new Controller(object, property)](#new_Controller_new) - * [.domElement](#Controller+domElement) : DOMElement - * [.object](#Controller+object) : Object - * [.property](#Controller+property) : String - * [.options(options)](#Controller+options) ⇒ [Controller](#Controller) - * [.name(name)](#Controller+name) ⇒ [Controller](#Controller) - * [.listen()](#Controller+listen) ⇒ [Controller](#Controller) - * [.remove()](#Controller+remove) ⇒ [Controller](#Controller) - * [.onChange(fnc)](#Controller+onChange) ⇒ [Controller](#Controller) - * [.onFinishChange(fnc)](#Controller+onFinishChange) ⇒ [Controller](#Controller) - * [.setValue(newValue)](#Controller+setValue) - * [.getValue()](#Controller+getValue) ⇒ Object - * [.updateDisplay()](#Controller+updateDisplay) ⇒ [Controller](#Controller) - * [.isModified()](#Controller+isModified) ⇒ Boolean - - - -### new Controller(object, property) - -| Param | Type | Description | -| --- | --- | --- | -| object | Object | The object to be manipulated | -| property | string | The name of the property to be manipulated | - - - -### controller.domElement : DOMElement -Those who extend this class will put their DOM elements in here. - -**Kind**: instance property of [Controller](#Controller) - - -### controller.object : Object -The object to manipulate - -**Kind**: instance property of [Controller](#Controller) - - -### controller.property : String -The name of the property to manipulate - -**Kind**: instance property of [Controller](#Controller) - - -### controller.options(options) ⇒ [Controller](#Controller) -**Kind**: instance method of [Controller](#Controller) - -| Param | Type | -| --- | --- | -| options | Array \| Object | - - - -### controller.name(name) ⇒ [Controller](#Controller) -Sets the name of the controller. - -**Kind**: instance method of [Controller](#Controller) - -| Param | Type | -| --- | --- | -| name | string | - - - -### controller.listen() ⇒ [Controller](#Controller) -Sets controller to listen for changes on its underlying object. - -**Kind**: instance method of [Controller](#Controller) - - -### controller.remove() ⇒ [Controller](#Controller) -Removes the controller from its parent GUI. - -**Kind**: instance method of [Controller](#Controller) - - -### controller.onChange(fnc) ⇒ [Controller](#Controller) -Specify that a function fire every time someone changes the value with -this Controller. - -**Kind**: instance method of [Controller](#Controller) -**Returns**: [Controller](#Controller) - this - -| Param | Type | Description | -| --- | --- | --- | -| fnc | function | This function will be called whenever the value is modified via this Controller. | - - - -### controller.onFinishChange(fnc) ⇒ [Controller](#Controller) -Specify that a function fire every time someone "finishes" changing -the value wih this Controller. Useful for values that change -incrementally like numbers or strings. - -**Kind**: instance method of [Controller](#Controller) -**Returns**: [Controller](#Controller) - this - -| Param | Type | Description | -| --- | --- | --- | -| fnc | function | This function will be called whenever someone "finishes" changing the value via this Controller. | - - - -### controller.setValue(newValue) -Change the value of object[property] - -**Kind**: instance method of [Controller](#Controller) - -| Param | Type | Description | -| --- | --- | --- | -| newValue | Object | The new value of object[property] | - - - -### controller.getValue() ⇒ Object -Gets the value of object[property] - -**Kind**: instance method of [Controller](#Controller) -**Returns**: Object - The current value of object[property] - - -### controller.updateDisplay() ⇒ [Controller](#Controller) -Refreshes the visual display of a Controller in order to keep sync -with the object's current value. - -**Kind**: instance method of [Controller](#Controller) -**Returns**: [Controller](#Controller) - this - - -### controller.isModified() ⇒ Boolean -**Kind**: instance method of [Controller](#Controller) -**Returns**: Boolean - true if the value has deviated from initialValue - - -## NumberController ⇐ dat.controllers.Controller -Represents a given property of an object that is a number. - -**Kind**: global class -**Extends**: dat.controllers.Controller - -* [NumberController](#NumberController) ⇐ dat.controllers.Controller - * [new NumberController(object, property, [params])](#new_NumberController_new) - * [.min(minValue)](#NumberController+min) ⇒ dat.controllers.NumberController - * [.max(maxValue)](#NumberController+max) ⇒ dat.controllers.NumberController - * [.step(stepValue)](#NumberController+step) ⇒ dat.controllers.NumberController - - - -### new NumberController(object, property, [params]) - -| Param | Type | Description | -| --- | --- | --- | -| object | Object | The object to be manipulated | -| property | string | The name of the property to be manipulated | -| [params] | Object | Optional parameters | -| [params.min] | Number | Minimum allowed value | -| [params.max] | Number | Maximum allowed value | -| [params.step] | Number | Increment by which to change value | - - - -### numberController.min(minValue) ⇒ dat.controllers.NumberController -Specify a minimum value for object[property]. - -**Kind**: instance method of [NumberController](#NumberController) -**Returns**: dat.controllers.NumberController - this - -| Param | Type | Description | -| --- | --- | --- | -| minValue | Number | The minimum value for object[property] | - - - -### numberController.max(maxValue) ⇒ dat.controllers.NumberController -Specify a maximum value for object[property]. - -**Kind**: instance method of [NumberController](#NumberController) -**Returns**: dat.controllers.NumberController - this - -| Param | Type | Description | -| --- | --- | --- | -| maxValue | Number | The maximum value for object[property] | - - - -### numberController.step(stepValue) ⇒ dat.controllers.NumberController -Specify a step value that dat.controllers.NumberController -increments by. - -**Kind**: instance method of [NumberController](#NumberController) -**Default**: if minimum and maximum specified increment is 1% of the -difference otherwise stepValue is 1 -**Returns**: dat.controllers.NumberController - this - -| Param | Type | Description | -| --- | --- | --- | -| stepValue | Number | The step value for dat.controllers.NumberController | - - diff --git a/public/dat.gui-master/CHANGELOG.md b/public/dat.gui-master/CHANGELOG.md deleted file mode 100644 index 622b94d34..000000000 --- a/public/dat.gui-master/CHANGELOG.md +++ /dev/null @@ -1,64 +0,0 @@ -## Changelog - -### 0.7.1 - * Fix listener cleanup in .destroy() and .removeFolder(). #177 - -### 0.7.0 - * Changed build system to Rollup, publishing ES6 and UMD modules. #172 - * Added .removeFolder(). #113 #158 - * Added API documentation. #165 - * Improved touch support. #173 - -### 0.6.5 - * Add browserify support. #137 - -### 0.6.4 - * Fixed formatting issue on Windows. #136 - * Fixed issue with color selector getting chopped off at bottom of gui. #136 - -### 0.6.3 - * Added ability to put close button on top of the menu [ex: var gui = new dat.gui.GUI({closeOnTop:true})]. #106 #122 - * Fixed issue with layout not updating on page resize. - * Fixed color picker showing in wrong position on user scroll (long menu). #105 - * Fixed checkbox weirdness while listening. #40 - * Fixed bower issues. #125 - -### 0.6.2 - * Fixed issue with color picker not returning correct values onFinishChange. #116 #117 - * Fixed issue with color picker not showing the correct label for color format. #117 - * Fixed NumberControllerBox onFinishChange event. #112 - * Fixed issue with GUI not being sized correct at start. #111 - -### 0.6.1 - * Fixed issue with color picker not working on a page that has scrolled. #37 - * Fixed issue with sliders created with min()/max() not remembering their name or to listen. #107 - -### 0.6.0 - * Ported to ES6 - * Exported using Universal Module Definition (UMD) for max compatibility (Commonjs, Requirejs, AMD, global var) - * Now using webpack for build - * Optional external CSS file (dat.gui.css) for use on CSP-enabled servers that block unsafe-inline - * Added updateDisplay() to GUI, to update all controls in all folders - https://github.com/dataarts/dat.gui/pull/97 - * Fixed GUI.destroy() to remove all window eventListeners - https://github.com/dataarts/dat.gui/pull/88 - * Fixed performance issue when rotated on tablet/mobile - https://github.com/dataarts/dat.gui/pull/91 - * Fixed issue that prevented user from changing values of controls that are listening - https://github.com/dataarts/dat.gui/issues/100 - * Fixed issues with onFinishChange callbacks on revert - https://github.com/dataarts/dat.gui/pull/103 - * Fixed issues with color selector formatting - https://github.com/dataarts/dat.gui/issues/73 - * Fixed issues with step parameters in sliders - https://github.com/dataarts/dat.gui/issues/74 - * Fixed an issue with colors based on arrays - https://github.com/dataarts/dat.gui/pull/57 - * Fixed factory.js, Step param was not used - https://github.com/dataarts/dat.gui/pull/45 - -### 0.5 - * Moved to requirejs for dependency management. - * Changed global namespace from *DAT* to *dat* (lowercase). - * Added support for color controllers. See [Color Controllers](http://workshop.chromeexperiments.com/examples/gui/#4--Color-Controllers). - * Added support for folders. See [Folders](http://workshop.chromeexperiments.com/examples/gui/#3--Folders). - * Added support for saving named presets. See [Presets](http://workshop.chromeexperiments.com/examples/gui/examples/gui/#6--Presets). - * Removed `height` parameter from GUI constructor. Scrollbar automatically induced when window is too short. - * `dat.GUI.autoPlace` parameter removed. Use `new dat.GUI( { autoPlace: false } )`. See [Custom Placement](http://workshop.chromeexperiments.com/examples/gui/#9--Custom-Placement). - * `gui.autoListen` and `gui.listenAll()` removed. See [Updating The Display Manually](http://workshop.chromeexperiments.com/examples/gui/#11--Updating-the-Display-Manually). - * `dat.GUI.load` removed. See [Saving Values](http://workshop.chromeexperiments.com/examples/gui/#5--Saving-Values). - * Made Controller code completely agnostic of GUI. Controllers can easily be created independent of a GUI panel. - -### 0.4 - * Migrated from GitHub to Google Code. diff --git a/public/dat.gui-master/LICENSE b/public/dat.gui-master/LICENSE deleted file mode 100644 index 011119321..000000000 --- a/public/dat.gui-master/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2014, Google Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/public/dat.gui-master/README.md b/public/dat.gui-master/README.md deleted file mode 100644 index eb127a57c..000000000 --- a/public/dat.gui-master/README.md +++ /dev/null @@ -1,67 +0,0 @@ -# dat.GUI -A lightweight graphical user interface for changing variables in JavaScript. - -Get started with dat.GUI by reading the [tutorial](http://workshop.chromeexperiments.com/examples/gui) -or the [API documentation](API.md). - - - -## Packaged Builds -The easiest way to use dat.GUI in your code is by using the built source at `build/dat.gui.min.js`. These built JavaScript files bundle all the necessary dependencies to run dat.GUI. - -In your `head` tag, include the following code: -```html - -``` - -## Installing from npm - -```bash -$ npm install --save dat.gui -``` - -```js -// CommonJS: -const dat = require('dat.gui'); - -// ES6: -import * as dat from 'dat.gui'; - -const gui = new dat.GUI(); -``` - -## Directory Contents - -``` -├── build - Compiled source code. -├── src - Source files. -└── tests - Tests. -``` - -## Building your own dat.GUI - -In the terminal, enter the following: - -``` -$ npm install -$ npm run build -``` - -## npm scripts - -- npm run build - Build development and production version of scripts. -- npm run dev - Build development version of script and watch for changes. - - -## Working with Content Security Policy -If you're using a server with a Content Security Policy in place that blocks 'unsafe-inline', you will have problems when dat.gui.js tries to inject style information. To get around this, load 'build/dat.gui.css' as an external style sheet. - -## Changes -View the [Change Log](CHANGELOG.md) - -## Thanks -The following libraries / open-source projects were used in the development of dat.GUI: - * [Rollup](https://rollupjs.org) - * [Sass](http://sass-lang.com/) - * [Node.js](http://nodejs.org/) - * [QUnit](https://github.com/jquery/qunit) / [jquery](http://jquery.com/) diff --git a/public/dat.gui-master/bower.json b/public/dat.gui-master/bower.json deleted file mode 100644 index 194ad2107..000000000 --- a/public/dat.gui-master/bower.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "dat.gui", - "homepage": "https://github.com/dataarts/dat.gui.git", - "authors": [ - "Google Data Arts Team " - ], - "description": "dat.gui is a lightweight controller library for JavaScript.", - "main": "build/dat.gui.js", - "keywords": [ - "controller", - "javascript", - "gui", - "slider" - ], - "license": "Apache License, Version 2.0", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "app/bower_components", - "test", - "tests" - ] -} diff --git a/public/dat.gui-master/example.html b/public/dat.gui-master/example.html deleted file mode 100644 index 2c3d7c3f7..000000000 --- a/public/dat.gui-master/example.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - diff --git a/public/dat.gui-master/licenseBanner.txt b/public/dat.gui-master/licenseBanner.txt deleted file mode 100644 index dd7aa97c1..000000000 --- a/public/dat.gui-master/licenseBanner.txt +++ /dev/null @@ -1,12 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ diff --git a/public/dat.gui-master/package.json b/public/dat.gui-master/package.json deleted file mode 100644 index 295f804e0..000000000 --- a/public/dat.gui-master/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "dat.gui", - "version": "0.7.6", - "description": "A lightweight graphical user interface for changing variables in JavaScript.", - "main": "build/dat.gui.js", - "module": "build/dat.gui.module.js", - "directories": { - "test": "tests" - }, - "scripts": { - "dev": "concurrently --names \"ROLLUP,HTTP\" -c \"bgBlue.bold,bgGreen.bold\" \"rollup -c -w -m inline\" \"serve --port 8080\"", - "build": "rollup -c && rollup -c rollup.config.min.js", - "build-docs": "jsdoc2md -f src/dat/gui/GUI.js src/dat/controllers/Controller.js src/dat/controllers/NumberController.js | replace-between --target API.md --token API", - "lint": "eslint src", - "preversion": "npm run lint", - "version": "npm run build && git add -A build", - "postversion": "git push && git push --tags && npm publish" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/dataarts/dat.gui.git" - }, - "author": "Data Arts Team, Google", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/dataarts/dat.gui/issues" - }, - "homepage": "https://github.com/dataarts/dat.gui#readme", - "devDependencies": { - "babel-core": "^6.26.3", - "babel-plugin-external-helpers": "^6.22.0", - "babel-preset-env": "^1.7.0", - "concurrently": "^3.5.1", - "eslint": "^3.5.0", - "eslint-config-airbnb-base": "^7.1.0", - "eslint-loader": "^1.5.0", - "eslint-plugin-import": "^1.15.0", - "extend": "^3.0.0", - "jsdoc-to-markdown": "^4.0.1", - "replace-between": "0.0.8", - "rollup": "^0.54.1", - "rollup-plugin-babel": "^3.0.4", - "rollup-plugin-cleanup": "^2.0.1", - "rollup-plugin-node-resolve": "^3.3.0", - "rollup-plugin-sass": "^0.6.1", - "rollup-plugin-uglify": "^2.0.1", - "serve": "^6.5.8" - }, - "eslintConfig": { - "extends": "airbnb-base", - "rules": { - "comma-dangle": 0, - "func-names": 0, - "no-alert": 0, - "no-console": 1, - "no-use-before-define": 0, - "prefer-rest-params": 0, - "prefer-template": 0, - "no-mixed-operators": 0, - "no-undef": 0, - "no-underscore-dangle": 0, - "prefer-arrow-callback": 0, - "space-before-function-paren": 0, - "global-require": 0, - "object-shorthand": 0, - "max-len": 0, - "no-param-reassign": 0, - "consistent-return": 0, - "no-restricted-syntax": 0, - "no-bitwise": 0, - "no-plusplus": 0 - } - } -} diff --git a/public/dat.gui-master/rollup.config.js b/public/dat.gui-master/rollup.config.js deleted file mode 100644 index b97fea125..000000000 --- a/public/dat.gui-master/rollup.config.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import fs from 'fs'; -import path from 'path'; -import resolve from 'rollup-plugin-node-resolve'; -import cleanup from 'rollup-plugin-cleanup'; -import babel from 'rollup-plugin-babel'; -import sass from 'rollup-plugin-sass'; - -const banner = fs.readFileSync(path.join(__dirname, 'licenseBanner.txt')); - -export default { - input: 'src/dat/index.js', - output: [{ - // TODO: Remove default exports, and this line, in v0.8.0. - exports: 'named', - file: './build/dat.gui.js', - format: 'umd', - name: 'dat', - sourcemap: true, - banner: banner - }, { - file: './build/dat.gui.module.js', - format: 'es', - sourcemap: true, - banner: banner - }], - watch: { - include: 'src/**' - }, - plugins: [ - resolve(), - sass({ - insert: true, - output: 'build/dat.gui.css', - options: {outputStyle: 'compressed'} - }), - babel({ - plugins: ['external-helpers'], - exclude: 'node_modules/**' - }), - cleanup() - ] -}; diff --git a/public/dat.gui-master/rollup.config.min.js b/public/dat.gui-master/rollup.config.min.js deleted file mode 100644 index 8edb0051c..000000000 --- a/public/dat.gui-master/rollup.config.min.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import fs from 'fs'; -import path from 'path'; -import defaultConfig from './rollup.config'; -import uglify from 'rollup-plugin-uglify'; - -const banner = fs.readFileSync(path.join(__dirname, 'licenseBanner.txt')); - -export default Object.assign({}, defaultConfig, { - output: { - // TODO: Remove default exports, and this line, in v0.8.0. - exports: 'named', - file: './build/dat.gui.min.js', - format: 'umd', - name: 'dat', - banner: banner - }, - plugins: [...defaultConfig.plugins, uglify({ - output: { - // Preserve license commenting in minified build. - comments: function(node, comment) { - return comment.type === 'comment2'; - } - } - })] -}); diff --git a/public/dat.gui-master/src/dat/color/Color.js b/public/dat.gui-master/src/dat/color/Color.js deleted file mode 100644 index 758801df8..000000000 --- a/public/dat.gui-master/src/dat/color/Color.js +++ /dev/null @@ -1,153 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import interpret from './interpret'; -import math from './math'; -import colorToString from './toString'; -import common from '../utils/common'; - -class Color { - constructor() { - this.__state = interpret.apply(this, arguments); - - if (this.__state === false) { - throw new Error('Failed to interpret color arguments'); - } - - this.__state.a = this.__state.a || 1; - } - - toString() { - return colorToString(this); - } - - toHexString() { - return colorToString(this, true); - } - - toOriginal() { - return this.__state.conversion.write(this); - } -} - -function defineRGBComponent(target, component, componentHexIndex) { - Object.defineProperty(target, component, { - get: function() { - if (this.__state.space === 'RGB') { - return this.__state[component]; - } - - Color.recalculateRGB(this, component, componentHexIndex); - - return this.__state[component]; - }, - - set: function(v) { - if (this.__state.space !== 'RGB') { - Color.recalculateRGB(this, component, componentHexIndex); - this.__state.space = 'RGB'; - } - - this.__state[component] = v; - } - }); -} - -function defineHSVComponent(target, component) { - Object.defineProperty(target, component, { - get: function() { - if (this.__state.space === 'HSV') { - return this.__state[component]; - } - - Color.recalculateHSV(this); - - return this.__state[component]; - }, - - set: function(v) { - if (this.__state.space !== 'HSV') { - Color.recalculateHSV(this); - this.__state.space = 'HSV'; - } - - this.__state[component] = v; - } - }); -} - - -Color.recalculateRGB = function(color, component, componentHexIndex) { - if (color.__state.space === 'HEX') { - color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex); - } else if (color.__state.space === 'HSV') { - common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); - } else { - throw new Error('Corrupted color state'); - } -}; - -Color.recalculateHSV = function(color) { - const result = math.rgb_to_hsv(color.r, color.g, color.b); - - common.extend(color.__state, - { - s: result.s, - v: result.v - } - ); - - if (!common.isNaN(result.h)) { - color.__state.h = result.h; - } else if (common.isUndefined(color.__state.h)) { - color.__state.h = 0; - } -}; - -Color.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a']; - -defineRGBComponent(Color.prototype, 'r', 2); -defineRGBComponent(Color.prototype, 'g', 1); -defineRGBComponent(Color.prototype, 'b', 0); - -defineHSVComponent(Color.prototype, 'h'); -defineHSVComponent(Color.prototype, 's'); -defineHSVComponent(Color.prototype, 'v'); - -Object.defineProperty(Color.prototype, 'a', { - get: function() { - return this.__state.a; - }, - - set: function(v) { - this.__state.a = v; - } -}); - -Object.defineProperty(Color.prototype, 'hex', { - get: function() { - if (this.__state.space !== 'HEX') { - this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b); - this.__state.space = 'HEX'; - } - - return this.__state.hex; - }, - - set: function(v) { - this.__state.space = 'HEX'; - this.__state.hex = v; - } -}); - -export default Color; diff --git a/public/dat.gui-master/src/dat/color/interpret.js b/public/dat.gui-master/src/dat/color/interpret.js deleted file mode 100644 index 451d0d8f0..000000000 --- a/public/dat.gui-master/src/dat/color/interpret.js +++ /dev/null @@ -1,300 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import toString from './toString'; -import common from '../utils/common'; - -const INTERPRETATIONS = [ - // Strings - { - litmus: common.isString, - conversions: { - THREE_CHAR_HEX: { - read: function(original) { - const test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); - if (test === null) { - return false; - } - - return { - space: 'HEX', - hex: parseInt( - '0x' + - test[1].toString() + test[1].toString() + - test[2].toString() + test[2].toString() + - test[3].toString() + test[3].toString(), 0) - }; - }, - - write: toString - }, - - SIX_CHAR_HEX: { - read: function(original) { - const test = original.match(/^#([A-F0-9]{6})$/i); - if (test === null) { - return false; - } - - return { - space: 'HEX', - hex: parseInt('0x' + test[1].toString(), 0) - }; - }, - - write: toString - }, - - CSS_RGB: { - read: function(original) { - const test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); - if (test === null) { - return false; - } - - return { - space: 'RGB', - r: parseFloat(test[1]), - g: parseFloat(test[2]), - b: parseFloat(test[3]) - }; - }, - - write: toString - }, - - CSS_RGBA: { - read: function(original) { - const test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); - if (test === null) { - return false; - } - - return { - space: 'RGB', - r: parseFloat(test[1]), - g: parseFloat(test[2]), - b: parseFloat(test[3]), - a: parseFloat(test[4]) - }; - }, - - write: toString - } - } - }, - - // Numbers - { - litmus: common.isNumber, - - conversions: { - - HEX: { - read: function(original) { - return { - space: 'HEX', - hex: original, - conversionName: 'HEX' - }; - }, - - write: function(color) { - return color.hex; - } - } - - } - - }, - - // Arrays - { - litmus: common.isArray, - conversions: { - RGB_ARRAY: { - read: function(original) { - if (original.length !== 3) { - return false; - } - - return { - space: 'RGB', - r: original[0], - g: original[1], - b: original[2] - }; - }, - - write: function(color) { - return [color.r, color.g, color.b]; - } - }, - - RGBA_ARRAY: { - read: function(original) { - if (original.length !== 4) return false; - return { - space: 'RGB', - r: original[0], - g: original[1], - b: original[2], - a: original[3] - }; - }, - - write: function(color) { - return [color.r, color.g, color.b, color.a]; - } - } - } - }, - - // Objects - { - litmus: common.isObject, - conversions: { - - RGBA_OBJ: { - read: function(original) { - if (common.isNumber(original.r) && - common.isNumber(original.g) && - common.isNumber(original.b) && - common.isNumber(original.a)) { - return { - space: 'RGB', - r: original.r, - g: original.g, - b: original.b, - a: original.a - }; - } - return false; - }, - - write: function(color) { - return { - r: color.r, - g: color.g, - b: color.b, - a: color.a - }; - } - }, - - RGB_OBJ: { - read: function(original) { - if (common.isNumber(original.r) && - common.isNumber(original.g) && - common.isNumber(original.b)) { - return { - space: 'RGB', - r: original.r, - g: original.g, - b: original.b - }; - } - return false; - }, - - write: function(color) { - return { - r: color.r, - g: color.g, - b: color.b - }; - } - }, - - HSVA_OBJ: { - read: function(original) { - if (common.isNumber(original.h) && - common.isNumber(original.s) && - common.isNumber(original.v) && - common.isNumber(original.a)) { - return { - space: 'HSV', - h: original.h, - s: original.s, - v: original.v, - a: original.a - }; - } - return false; - }, - - write: function(color) { - return { - h: color.h, - s: color.s, - v: color.v, - a: color.a - }; - } - }, - - HSV_OBJ: { - read: function(original) { - if (common.isNumber(original.h) && - common.isNumber(original.s) && - common.isNumber(original.v)) { - return { - space: 'HSV', - h: original.h, - s: original.s, - v: original.v - }; - } - return false; - }, - - write: function(color) { - return { - h: color.h, - s: color.s, - v: color.v - }; - } - } - } - } -]; - -let result; -let toReturn; - -const interpret = function() { - toReturn = false; - - const original = arguments.length > 1 ? common.toArray(arguments) : arguments[0]; - common.each(INTERPRETATIONS, function(family) { - if (family.litmus(original)) { - common.each(family.conversions, function(conversion, conversionName) { - result = conversion.read(original); - - if (toReturn === false && result !== false) { - toReturn = result; - result.conversionName = conversionName; - result.conversion = conversion; - return common.BREAK; - } - }); - - return common.BREAK; - } - }); - - return toReturn; -}; - -export default interpret; diff --git a/public/dat.gui-master/src/dat/color/math.js b/public/dat.gui-master/src/dat/color/math.js deleted file mode 100644 index e9f02d5bc..000000000 --- a/public/dat.gui-master/src/dat/color/math.js +++ /dev/null @@ -1,93 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -let tmpComponent; - -const ColorMath = { - hsv_to_rgb: function(h, s, v) { - const hi = Math.floor(h / 60) % 6; - - const f = h / 60 - Math.floor(h / 60); - const p = v * (1.0 - s); - const q = v * (1.0 - (f * s)); - const t = v * (1.0 - ((1.0 - f) * s)); - - const c = [ - [v, t, p], - [q, v, p], - [p, v, t], - [p, q, v], - [t, p, v], - [v, p, q] - ][hi]; - - return { - r: c[0] * 255, - g: c[1] * 255, - b: c[2] * 255 - }; - }, - - rgb_to_hsv: function(r, g, b) { - const min = Math.min(r, g, b); - const max = Math.max(r, g, b); - const delta = max - min; - let h; - let s; - - if (max !== 0) { - s = delta / max; - } else { - return { - h: NaN, - s: 0, - v: 0 - }; - } - - if (r === max) { - h = (g - b) / delta; - } else if (g === max) { - h = 2 + (b - r) / delta; - } else { - h = 4 + (r - g) / delta; - } - h /= 6; - if (h < 0) { - h += 1; - } - - return { - h: h * 360, - s: s, - v: max / 255 - }; - }, - - rgb_to_hex: function(r, g, b) { - let hex = this.hex_with_component(0, 2, r); - hex = this.hex_with_component(hex, 1, g); - hex = this.hex_with_component(hex, 0, b); - return hex; - }, - - component_from_hex: function(hex, componentIndex) { - return (hex >> (componentIndex * 8)) & 0xFF; - }, - - hex_with_component: function(hex, componentIndex, value) { - return value << (tmpComponent = componentIndex * 8) | (hex & ~(0xFF << tmpComponent)); - } -}; - -export default ColorMath; diff --git a/public/dat.gui-master/src/dat/color/toString.js b/public/dat.gui-master/src/dat/color/toString.js deleted file mode 100644 index c2a85d8b3..000000000 --- a/public/dat.gui-master/src/dat/color/toString.js +++ /dev/null @@ -1,52 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -export default function(color, forceCSSHex) { - const colorFormat = color.__state.conversionName.toString(); - - const r = Math.round(color.r); - const g = Math.round(color.g); - const b = Math.round(color.b); - const a = color.a; - const h = Math.round(color.h); - const s = color.s.toFixed(1); - const v = color.v.toFixed(1); - - if (forceCSSHex || (colorFormat === 'THREE_CHAR_HEX') || (colorFormat === 'SIX_CHAR_HEX')) { - let str = color.hex.toString(16); - while (str.length < 6) { - str = '0' + str; - } - return '#' + str; - } else if (colorFormat === 'CSS_RGB') { - return 'rgb(' + r + ',' + g + ',' + b + ')'; - } else if (colorFormat === 'CSS_RGBA') { - return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; - } else if (colorFormat === 'HEX') { - return '0x' + color.hex.toString(16); - } else if (colorFormat === 'RGB_ARRAY') { - return '[' + r + ',' + g + ',' + b + ']'; - } else if (colorFormat === 'RGBA_ARRAY') { - return '[' + r + ',' + g + ',' + b + ',' + a + ']'; - } else if (colorFormat === 'RGB_OBJ') { - return '{r:' + r + ',g:' + g + ',b:' + b + '}'; - } else if (colorFormat === 'RGBA_OBJ') { - return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}'; - } else if (colorFormat === 'HSV_OBJ') { - return '{h:' + h + ',s:' + s + ',v:' + v + '}'; - } else if (colorFormat === 'HSVA_OBJ') { - return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}'; - } - - return 'unknown format'; -} diff --git a/public/dat.gui-master/src/dat/controllers/BooleanController.js b/public/dat.gui-master/src/dat/controllers/BooleanController.js deleted file mode 100644 index ee1dd2d42..000000000 --- a/public/dat.gui-master/src/dat/controllers/BooleanController.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import Controller from './Controller'; -import dom from '../dom/dom'; - -/** - * @class Provides a checkbox input to alter the boolean property of an object. - * - * @extends dat.controllers.Controller - * - * @param {Object} object The object to be manipulated - * @param {string} property The name of the property to be manipulated - */ -class BooleanController extends Controller { - constructor(object, property) { - super(object, property); - - const _this = this; - this.__prev = this.getValue(); - - this.__checkbox = document.createElement('input'); - this.__checkbox.setAttribute('type', 'checkbox'); - - function onChange() { - _this.setValue(!_this.__prev); - } - - dom.bind(this.__checkbox, 'change', onChange, false); - - this.domElement.appendChild(this.__checkbox); - - // Match original value - this.updateDisplay(); - } - - setValue(v) { - const toReturn = super.setValue(v); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - this.__prev = this.getValue(); - return toReturn; - } - - updateDisplay() { - if (this.getValue() === true) { - this.__checkbox.setAttribute('checked', 'checked'); - this.__checkbox.checked = true; - this.__prev = true; - } else { - this.__checkbox.checked = false; - this.__prev = false; - } - - return super.updateDisplay(); - } -} - -export default BooleanController; diff --git a/public/dat.gui-master/src/dat/controllers/ColorController.js b/public/dat.gui-master/src/dat/controllers/ColorController.js deleted file mode 100644 index 649edaea3..000000000 --- a/public/dat.gui-master/src/dat/controllers/ColorController.js +++ /dev/null @@ -1,341 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import Controller from './Controller'; -import dom from '../dom/dom'; -import Color from '../color/Color'; -import interpret from '../color/interpret'; -import common from '../utils/common'; - -/** - * @class Represents a given property of an object that is a color. - * @param {Object} object - * @param {string} property - */ -class ColorController extends Controller { - constructor(object, property) { - super(object, property); - - this.__color = new Color(this.getValue()); - this.__temp = new Color(0); - - const _this = this; - - this.domElement = document.createElement('div'); - - dom.makeSelectable(this.domElement, false); - - this.__selector = document.createElement('div'); - this.__selector.className = 'selector'; - - this.__saturation_field = document.createElement('div'); - this.__saturation_field.className = 'saturation-field'; - - this.__field_knob = document.createElement('div'); - this.__field_knob.className = 'field-knob'; - this.__field_knob_border = '2px solid '; - - this.__hue_knob = document.createElement('div'); - this.__hue_knob.className = 'hue-knob'; - - this.__hue_field = document.createElement('div'); - this.__hue_field.className = 'hue-field'; - - this.__input = document.createElement('input'); - this.__input.type = 'text'; - this.__input_textShadow = '0 1px 1px '; - - dom.bind(this.__input, 'keydown', function(e) { - if (e.keyCode === 13) { // on enter - onBlur.call(this); - } - }); - - dom.bind(this.__input, 'blur', onBlur); - - dom.bind(this.__selector, 'mousedown', function(/* e */) { - dom - .addClass(this, 'drag') - .bind(window, 'mouseup', function(/* e */) { - dom.removeClass(_this.__selector, 'drag'); - }); - }); - - dom.bind(this.__selector, 'touchstart', function(/* e */) { - dom - .addClass(this, 'drag') - .bind(window, 'touchend', function(/* e */) { - dom.removeClass(_this.__selector, 'drag'); - }); - }); - - const valueField = document.createElement('div'); - - common.extend(this.__selector.style, { - width: '122px', - height: '102px', - padding: '3px', - backgroundColor: '#222', - boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' - }); - - common.extend(this.__field_knob.style, { - position: 'absolute', - width: '12px', - height: '12px', - border: this.__field_knob_border + (this.__color.v < 0.5 ? '#fff' : '#000'), - boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', - borderRadius: '12px', - zIndex: 1 - }); - - common.extend(this.__hue_knob.style, { - position: 'absolute', - width: '15px', - height: '2px', - borderRight: '4px solid #fff', - zIndex: 1 - }); - - common.extend(this.__saturation_field.style, { - width: '100px', - height: '100px', - border: '1px solid #555', - marginRight: '3px', - display: 'inline-block', - cursor: 'pointer' - }); - - common.extend(valueField.style, { - width: '100%', - height: '100%', - background: 'none' - }); - - linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000'); - - common.extend(this.__hue_field.style, { - width: '15px', - height: '100px', - border: '1px solid #555', - cursor: 'ns-resize', - position: 'absolute', - top: '3px', - right: '3px' - }); - - hueGradient(this.__hue_field); - - common.extend(this.__input.style, { - outline: 'none', -// width: '120px', - textAlign: 'center', -// padding: '4px', -// marginBottom: '6px', - color: '#fff', - border: 0, - fontWeight: 'bold', - textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)' - }); - - dom.bind(this.__saturation_field, 'mousedown', fieldDown); - dom.bind(this.__saturation_field, 'touchstart', fieldDown); - - dom.bind(this.__field_knob, 'mousedown', fieldDown); - dom.bind(this.__field_knob, 'touchstart', fieldDown); - - dom.bind(this.__hue_field, 'mousedown', fieldDownH); - dom.bind(this.__hue_field, 'touchstart', fieldDownH); - - function fieldDown(e) { - setSV(e); - dom.bind(window, 'mousemove', setSV); - dom.bind(window, 'touchmove', setSV); - dom.bind(window, 'mouseup', fieldUpSV); - dom.bind(window, 'touchend', fieldUpSV); - } - - function fieldDownH(e) { - setH(e); - dom.bind(window, 'mousemove', setH); - dom.bind(window, 'touchmove', setH); - dom.bind(window, 'mouseup', fieldUpH); - dom.bind(window, 'touchend', fieldUpH); - } - - function fieldUpSV() { - dom.unbind(window, 'mousemove', setSV); - dom.unbind(window, 'touchmove', setSV); - dom.unbind(window, 'mouseup', fieldUpSV); - dom.unbind(window, 'touchend', fieldUpSV); - onFinish(); - } - - function fieldUpH() { - dom.unbind(window, 'mousemove', setH); - dom.unbind(window, 'touchmove', setH); - dom.unbind(window, 'mouseup', fieldUpH); - dom.unbind(window, 'touchend', fieldUpH); - onFinish(); - } - - function onBlur() { - const i = interpret(this.value); - if (i !== false) { - _this.__color.__state = i; - _this.setValue(_this.__color.toOriginal()); - } else { - this.value = _this.__color.toString(); - } - } - - function onFinish() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.__color.toOriginal()); - } - } - - this.__saturation_field.appendChild(valueField); - this.__selector.appendChild(this.__field_knob); - this.__selector.appendChild(this.__saturation_field); - this.__selector.appendChild(this.__hue_field); - this.__hue_field.appendChild(this.__hue_knob); - - this.domElement.appendChild(this.__input); - this.domElement.appendChild(this.__selector); - - this.updateDisplay(); - - function setSV(e) { - if (e.type.indexOf('touch') === -1) { e.preventDefault(); } - - const fieldRect = _this.__saturation_field.getBoundingClientRect(); - const { clientX, clientY } = (e.touches && e.touches[0]) || e; - let s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left); - let v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); - - if (v > 1) { - v = 1; - } else if (v < 0) { - v = 0; - } - - if (s > 1) { - s = 1; - } else if (s < 0) { - s = 0; - } - - _this.__color.v = v; - _this.__color.s = s; - - _this.setValue(_this.__color.toOriginal()); - - - return false; - } - - function setH(e) { - if (e.type.indexOf('touch') === -1) { e.preventDefault(); } - - const fieldRect = _this.__hue_field.getBoundingClientRect(); - const { clientY } = (e.touches && e.touches[0]) || e; - let h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); - - if (h > 1) { - h = 1; - } else if (h < 0) { - h = 0; - } - - _this.__color.h = h * 360; - - _this.setValue(_this.__color.toOriginal()); - - return false; - } - } - - updateDisplay() { - const i = interpret(this.getValue()); - - if (i !== false) { - let mismatch = false; - - // Check for mismatch on the interpreted value. - - common.each(Color.COMPONENTS, function(component) { - if (!common.isUndefined(i[component]) && !common.isUndefined(this.__color.__state[component]) && - i[component] !== this.__color.__state[component]) { - mismatch = true; - return {}; // break - } - }, this); - - // If nothing diverges, we keep our previous values - // for statefulness, otherwise we recalculate fresh - if (mismatch) { - common.extend(this.__color.__state, i); - } - } - - common.extend(this.__temp.__state, this.__color.__state); - - this.__temp.a = 1; - - const flip = (this.__color.v < 0.5 || this.__color.s > 0.5) ? 255 : 0; - const _flip = 255 - flip; - - common.extend(this.__field_knob.style, { - marginLeft: 100 * this.__color.s - 7 + 'px', - marginTop: 100 * (1 - this.__color.v) - 7 + 'px', - backgroundColor: this.__temp.toHexString(), - border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')' - }); - - this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'; - - this.__temp.s = 1; - this.__temp.v = 1; - - linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString()); - - this.__input.value = this.__color.toString(); - - common.extend(this.__input.style, { - backgroundColor: this.__color.toHexString(), - color: 'rgb(' + flip + ',' + flip + ',' + flip + ')', - textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)' - }); - } -} - -const vendors = ['-moz-', '-o-', '-webkit-', '-ms-', '']; - -function linearGradient(elem, x, a, b) { - elem.style.background = ''; - common.each(vendors, function(vendor) { - elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); '; - }); -} - -function hueGradient(elem) { - elem.style.background = ''; - elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'; - elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; -} - -export default ColorController; diff --git a/public/dat.gui-master/src/dat/controllers/Controller.js b/public/dat.gui-master/src/dat/controllers/Controller.js deleted file mode 100644 index b65c7747f..000000000 --- a/public/dat.gui-master/src/dat/controllers/Controller.js +++ /dev/null @@ -1,125 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -/** - * @class An "abstract" class that represents a given property of an object. - * - * @param {Object} object The object to be manipulated - * @param {string} property The name of the property to be manipulated - */ -class Controller { - constructor(object, property) { - this.initialValue = object[property]; - - /** - * Those who extend this class will put their DOM elements in here. - * @type {DOMElement} - */ - this.domElement = document.createElement('div'); - - /** - * The object to manipulate - * @type {Object} - */ - this.object = object; - - /** - * The name of the property to manipulate - * @type {String} - */ - this.property = property; - - /** - * The function to be called on change. - * @type {Function} - * @ignore - */ - this.__onChange = undefined; - - /** - * The function to be called on finishing change. - * @type {Function} - * @ignore - */ - this.__onFinishChange = undefined; - } - - /** - * Specify that a function fire every time someone changes the value with - * this Controller. - * - * @param {Function} fnc This function will be called whenever the value - * is modified via this Controller. - * @returns {Controller} this - */ - onChange(fnc) { - this.__onChange = fnc; - return this; - } - - /** - * Specify that a function fire every time someone "finishes" changing - * the value wih this Controller. Useful for values that change - * incrementally like numbers or strings. - * - * @param {Function} fnc This function will be called whenever - * someone "finishes" changing the value via this Controller. - * @returns {Controller} this - */ - onFinishChange(fnc) { - this.__onFinishChange = fnc; - return this; - } - - /** - * Change the value of object[property] - * - * @param {Object} newValue The new value of object[property] - */ - setValue(newValue) { - this.object[this.property] = newValue; - if (this.__onChange) { - this.__onChange.call(this, newValue); - } - - this.updateDisplay(); - return this; - } - - /** - * Gets the value of object[property] - * - * @returns {Object} The current value of object[property] - */ - getValue() { - return this.object[this.property]; - } - - /** - * Refreshes the visual display of a Controller in order to keep sync - * with the object's current value. - * @returns {Controller} this - */ - updateDisplay() { - return this; - } - - /** - * @returns {Boolean} true if the value has deviated from initialValue - */ - isModified() { - return this.initialValue !== this.getValue(); - } -} - -export default Controller; diff --git a/public/dat.gui-master/src/dat/controllers/ControllerFactory.js b/public/dat.gui-master/src/dat/controllers/ControllerFactory.js deleted file mode 100644 index da4802644..000000000 --- a/public/dat.gui-master/src/dat/controllers/ControllerFactory.js +++ /dev/null @@ -1,66 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import OptionController from './OptionController'; -import NumberControllerBox from './NumberControllerBox'; -import NumberControllerSlider from './NumberControllerSlider'; -import StringController from './StringController'; -import FunctionController from './FunctionController'; -import BooleanController from './BooleanController'; -import common from '../utils/common'; - -const ControllerFactory = function(object, property) { - const initialValue = object[property]; - - // Providing options? - if (common.isArray(arguments[2]) || common.isObject(arguments[2])) { - return new OptionController(object, property, arguments[2]); - } - - // Providing a map? - if (common.isNumber(initialValue)) { - // Has min and max? (slider) - if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) { - // has step? - if (common.isNumber(arguments[4])) { - return new NumberControllerSlider(object, property, - arguments[2], arguments[3], arguments[4]); - } - - return new NumberControllerSlider(object, property, arguments[2], arguments[3]); - } - - // number box - if (common.isNumber(arguments[4])) { // has step - return new NumberControllerBox(object, property, - { min: arguments[2], max: arguments[3], step: arguments[4] }); - } - return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); - } - - if (common.isString(initialValue)) { - return new StringController(object, property); - } - - if (common.isFunction(initialValue)) { - return new FunctionController(object, property, ''); - } - - if (common.isBoolean(initialValue)) { - return new BooleanController(object, property); - } - - return null; -}; - -export default ControllerFactory; diff --git a/public/dat.gui-master/src/dat/controllers/FunctionController.js b/public/dat.gui-master/src/dat/controllers/FunctionController.js deleted file mode 100644 index d58d2e057..000000000 --- a/public/dat.gui-master/src/dat/controllers/FunctionController.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import Controller from './Controller'; -import dom from '../dom/dom'; - -/** - * @class Provides a GUI interface to fire a specified method, a property of an object. - * - * @extends dat.controllers.Controller - * - * @param {Object} object The object to be manipulated - * @param {string} property The name of the property to be manipulated - */ -class FunctionController extends Controller { - constructor(object, property, text) { - super(object, property); - - const _this = this; - - this.__button = document.createElement('div'); - this.__button.innerHTML = text === undefined ? 'Fire' : text; - - dom.bind(this.__button, 'click', function(e) { - e.preventDefault(); - _this.fire(); - return false; - }); - - dom.addClass(this.__button, 'button'); - - this.domElement.appendChild(this.__button); - } - - fire() { - if (this.__onChange) { - this.__onChange.call(this); - } - this.getValue().call(this.object); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - } -} - -export default FunctionController; diff --git a/public/dat.gui-master/src/dat/controllers/NumberController.js b/public/dat.gui-master/src/dat/controllers/NumberController.js deleted file mode 100644 index 664191aa1..000000000 --- a/public/dat.gui-master/src/dat/controllers/NumberController.js +++ /dev/null @@ -1,120 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import Controller from './Controller'; -import common from '../utils/common'; - -function numDecimals(x) { - const _x = x.toString(); - if (_x.indexOf('.') > -1) { - return _x.length - _x.indexOf('.') - 1; - } - - return 0; -} - -/** - * @class Represents a given property of an object that is a number. - * - * @extends dat.controllers.Controller - * - * @param {Object} object The object to be manipulated - * @param {string} property The name of the property to be manipulated - * @param {Object} [params] Optional parameters - * @param {Number} [params.min] Minimum allowed value - * @param {Number} [params.max] Maximum allowed value - * @param {Number} [params.step] Increment by which to change value - */ -class NumberController extends Controller { - constructor(object, property, params) { - super(object, property); - - const _params = params || {}; - - this.__min = _params.min; - this.__max = _params.max; - this.__step = _params.step; - - if (common.isUndefined(this.__step)) { - if (this.initialValue === 0) { - this.__impliedStep = 1; // What are we, psychics? - } else { - // Hey Doug, check this out. - this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(this.initialValue)) / Math.LN10)) / 10; - } - } else { - this.__impliedStep = this.__step; - } - - this.__precision = numDecimals(this.__impliedStep); - } - - setValue(v) { - let _v = v; - - if (this.__min !== undefined && _v < this.__min) { - _v = this.__min; - } else if (this.__max !== undefined && _v > this.__max) { - _v = this.__max; - } - - if (this.__step !== undefined && _v % this.__step !== 0) { - _v = Math.round(_v / this.__step) * this.__step; - } - - return super.setValue(_v); - } - - /** - * Specify a minimum value for object[property]. - * - * @param {Number} minValue The minimum value for - * object[property] - * @returns {dat.controllers.NumberController} this - */ - min(minValue) { - this.__min = minValue; - return this; - } - - /** - * Specify a maximum value for object[property]. - * - * @param {Number} maxValue The maximum value for - * object[property] - * @returns {dat.controllers.NumberController} this - */ - max(maxValue) { - this.__max = maxValue; - return this; - } - - /** - * Specify a step value that dat.controllers.NumberController - * increments by. - * - * @param {Number} stepValue The step value for - * dat.controllers.NumberController - * @default if minimum and maximum specified increment is 1% of the - * difference otherwise stepValue is 1 - * @returns {dat.controllers.NumberController} this - */ - step(stepValue) { - this.__step = stepValue; - this.__impliedStep = stepValue; - this.__precision = numDecimals(stepValue); - return this; - } -} - -export default NumberController; diff --git a/public/dat.gui-master/src/dat/controllers/NumberControllerBox.js b/public/dat.gui-master/src/dat/controllers/NumberControllerBox.js deleted file mode 100644 index 462ebf25a..000000000 --- a/public/dat.gui-master/src/dat/controllers/NumberControllerBox.js +++ /dev/null @@ -1,116 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import NumberController from './NumberController'; -import dom from '../dom/dom'; -import common from '../utils/common'; - -function roundToDecimal(value, decimals) { - const tenTo = Math.pow(10, decimals); - return Math.round(value * tenTo) / tenTo; -} - -/** - * @class Represents a given property of an object that is a number and - * provides an input element with which to manipulate it. - * - * @extends dat.controllers.Controller - * @extends dat.controllers.NumberController - * - * @param {Object} object The object to be manipulated - * @param {string} property The name of the property to be manipulated - * @param {Object} [params] Optional parameters - * @param {Number} [params.min] Minimum allowed value - * @param {Number} [params.max] Maximum allowed value - * @param {Number} [params.step] Increment by which to change value - */ -class NumberControllerBox extends NumberController { - constructor(object, property, params) { - super(object, property, params); - - this.__truncationSuspended = false; - - const _this = this; - - /** - * {Number} Previous mouse y position - * @ignore - */ - let prevY; - - function onChange() { - const attempted = parseFloat(_this.__input.value); - if (!common.isNaN(attempted)) { - _this.setValue(attempted); - } - } - - function onFinish() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - - function onBlur() { - onFinish(); - } - - function onMouseDrag(e) { - const diff = prevY - e.clientY; - _this.setValue(_this.getValue() + diff * _this.__impliedStep); - - prevY = e.clientY; - } - - function onMouseUp() { - dom.unbind(window, 'mousemove', onMouseDrag); - dom.unbind(window, 'mouseup', onMouseUp); - onFinish(); - } - - function onMouseDown(e) { - dom.bind(window, 'mousemove', onMouseDrag); - dom.bind(window, 'mouseup', onMouseUp); - prevY = e.clientY; - } - - this.__input = document.createElement('input'); - this.__input.setAttribute('type', 'text'); - - // Makes it so manually specified values are not truncated. - - dom.bind(this.__input, 'change', onChange); - dom.bind(this.__input, 'blur', onBlur); - dom.bind(this.__input, 'mousedown', onMouseDown); - dom.bind(this.__input, 'keydown', function(e) { - // When pressing enter, you can be as precise as you want. - if (e.keyCode === 13) { - _this.__truncationSuspended = true; - this.blur(); - _this.__truncationSuspended = false; - onFinish(); - } - }); - - this.updateDisplay(); - - this.domElement.appendChild(this.__input); - } - - updateDisplay() { - this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); - return super.updateDisplay(); - } -} - -export default NumberControllerBox; diff --git a/public/dat.gui-master/src/dat/controllers/NumberControllerSlider.js b/public/dat.gui-master/src/dat/controllers/NumberControllerSlider.js deleted file mode 100644 index f75bc0e45..000000000 --- a/public/dat.gui-master/src/dat/controllers/NumberControllerSlider.js +++ /dev/null @@ -1,118 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import NumberController from './NumberController'; -import dom from '../dom/dom'; - -function map(v, i1, i2, o1, o2) { - return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); -} - -/** - * @class Represents a given property of an object that is a number, contains - * a minimum and maximum, and provides a slider element with which to - * manipulate it. It should be noted that the slider element is made up of - * <div> tags, not the html5 - * <slider> element. - * - * @extends dat.controllers.Controller - * @extends dat.controllers.NumberController - * - * @param {Object} object The object to be manipulated - * @param {string} property The name of the property to be manipulated - * @param {Number} minValue Minimum allowed value - * @param {Number} maxValue Maximum allowed value - * @param {Number} stepValue Increment by which to change value - */ -class NumberControllerSlider extends NumberController { - constructor(object, property, min, max, step) { - super(object, property, { min: min, max: max, step: step }); - - const _this = this; - - this.__background = document.createElement('div'); - this.__foreground = document.createElement('div'); - - dom.bind(this.__background, 'mousedown', onMouseDown); - dom.bind(this.__background, 'touchstart', onTouchStart); - - dom.addClass(this.__background, 'slider'); - dom.addClass(this.__foreground, 'slider-fg'); - - function onMouseDown(e) { - document.activeElement.blur(); - - dom.bind(window, 'mousemove', onMouseDrag); - dom.bind(window, 'mouseup', onMouseUp); - - onMouseDrag(e); - } - - function onMouseDrag(e) { - e.preventDefault(); - - const bgRect = _this.__background.getBoundingClientRect(); - - _this.setValue( - map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max) - ); - - return false; - } - - function onMouseUp() { - dom.unbind(window, 'mousemove', onMouseDrag); - dom.unbind(window, 'mouseup', onMouseUp); - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - - function onTouchStart(e) { - if (e.touches.length !== 1) { return; } - dom.bind(window, 'touchmove', onTouchMove); - dom.bind(window, 'touchend', onTouchEnd); - onTouchMove(e); - } - - function onTouchMove(e) { - const clientX = e.touches[0].clientX; - const bgRect = _this.__background.getBoundingClientRect(); - - _this.setValue( - map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max) - ); - } - - function onTouchEnd() { - dom.unbind(window, 'touchmove', onTouchMove); - dom.unbind(window, 'touchend', onTouchEnd); - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - - this.updateDisplay(); - - this.__background.appendChild(this.__foreground); - this.domElement.appendChild(this.__background); - } - - updateDisplay() { - const pct = (this.getValue() - this.__min) / (this.__max - this.__min); - this.__foreground.style.width = pct * 100 + '%'; - return super.updateDisplay(); - } -} - -export default NumberControllerSlider; diff --git a/public/dat.gui-master/src/dat/controllers/OptionController.js b/public/dat.gui-master/src/dat/controllers/OptionController.js deleted file mode 100644 index b3490315f..000000000 --- a/public/dat.gui-master/src/dat/controllers/OptionController.js +++ /dev/null @@ -1,85 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import Controller from './Controller'; -import dom from '../dom/dom'; -import common from '../utils/common'; - -/** - * @class Provides a select input to alter the property of an object, using a - * list of accepted values. - * - * @extends dat.controllers.Controller - * - * @param {Object} object The object to be manipulated - * @param {string} property The name of the property to be manipulated - * @param {Object|string[]} options A map of labels to acceptable values, or - * a list of acceptable string values. - */ -class OptionController extends Controller { - constructor(object, property, opts) { - super(object, property); - - let options = opts; - - const _this = this; - - /** - * The drop down menu - * @ignore - */ - this.__select = document.createElement('select'); - - if (common.isArray(options)) { - const map = {}; - common.each(options, function(element) { - map[element] = element; - }); - options = map; - } - - common.each(options, function(value, key) { - const opt = document.createElement('option'); - opt.innerHTML = key; - opt.setAttribute('value', value); - _this.__select.appendChild(opt); - }); - - // Acknowledge original value - this.updateDisplay(); - - dom.bind(this.__select, 'change', function() { - const desiredValue = this.options[this.selectedIndex].value; - _this.setValue(desiredValue); - }); - - this.domElement.appendChild(this.__select); - } - - setValue(v) { - const toReturn = super.setValue(v); - - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - return toReturn; - } - - updateDisplay() { - if (dom.isActive(this.__select)) return this; // prevent number from updating if user is trying to manually update - this.__select.value = this.getValue(); - return super.updateDisplay(); - } -} - -export default OptionController; diff --git a/public/dat.gui-master/src/dat/controllers/StringController.js b/public/dat.gui-master/src/dat/controllers/StringController.js deleted file mode 100644 index 63cf29a94..000000000 --- a/public/dat.gui-master/src/dat/controllers/StringController.js +++ /dev/null @@ -1,68 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import Controller from './Controller'; -import dom from '../dom/dom'; - -/** - * @class Provides a text input to alter the string property of an object. - * - * @extends dat.controllers.Controller - * - * @param {Object} object The object to be manipulated - * @param {string} property The name of the property to be manipulated - */ -class StringController extends Controller { - constructor(object, property) { - super(object, property); - - const _this = this; - - function onChange() { - _this.setValue(_this.__input.value); - } - - function onBlur() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - - this.__input = document.createElement('input'); - this.__input.setAttribute('type', 'text'); - - dom.bind(this.__input, 'keyup', onChange); - dom.bind(this.__input, 'change', onChange); - dom.bind(this.__input, 'blur', onBlur); - dom.bind(this.__input, 'keydown', function(e) { - if (e.keyCode === 13) { - this.blur(); - } - }); - - this.updateDisplay(); - - this.domElement.appendChild(this.__input); - } - - updateDisplay() { - // Stops the caret from moving on account of: - // keyup -> setValue -> updateDisplay - if (!dom.isActive(this.__input)) { - this.__input.value = this.getValue(); - } - return super.updateDisplay(); - } -} - -export default StringController; diff --git a/public/dat.gui-master/src/dat/dom/CenteredDiv.js b/public/dat.gui-master/src/dat/dom/CenteredDiv.js deleted file mode 100644 index a422ba50e..000000000 --- a/public/dat.gui-master/src/dat/dom/CenteredDiv.js +++ /dev/null @@ -1,104 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import dom from '../dom/dom'; -import common from '../utils/common'; - -class CenteredDiv { - constructor() { - this.backgroundElement = document.createElement('div'); - common.extend(this.backgroundElement.style, { - backgroundColor: 'rgba(0,0,0,0.8)', - top: 0, - left: 0, - display: 'none', - zIndex: '1000', - opacity: 0, - WebkitTransition: 'opacity 0.2s linear', - transition: 'opacity 0.2s linear' - }); - - dom.makeFullscreen(this.backgroundElement); - this.backgroundElement.style.position = 'fixed'; - - this.domElement = document.createElement('div'); - common.extend(this.domElement.style, { - position: 'fixed', - display: 'none', - zIndex: '1001', - opacity: 0, - WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear', - transition: 'transform 0.2s ease-out, opacity 0.2s linear' - }); - - - document.body.appendChild(this.backgroundElement); - document.body.appendChild(this.domElement); - - const _this = this; - dom.bind(this.backgroundElement, 'click', function() { - _this.hide(); - }); - } - - show() { - const _this = this; - - this.backgroundElement.style.display = 'block'; - - this.domElement.style.display = 'block'; - this.domElement.style.opacity = 0; -// this.domElement.style.top = '52%'; - this.domElement.style.webkitTransform = 'scale(1.1)'; - - this.layout(); - - common.defer(function() { - _this.backgroundElement.style.opacity = 1; - _this.domElement.style.opacity = 1; - _this.domElement.style.webkitTransform = 'scale(1)'; - }); - } - - /** - * Hide centered div - */ - hide() { - const _this = this; - - const hide = function() { - _this.domElement.style.display = 'none'; - _this.backgroundElement.style.display = 'none'; - - dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); - dom.unbind(_this.domElement, 'transitionend', hide); - dom.unbind(_this.domElement, 'oTransitionEnd', hide); - }; - - dom.bind(this.domElement, 'webkitTransitionEnd', hide); - dom.bind(this.domElement, 'transitionend', hide); - dom.bind(this.domElement, 'oTransitionEnd', hide); - - this.backgroundElement.style.opacity = 0; -// this.domElement.style.top = '48%'; - this.domElement.style.opacity = 0; - this.domElement.style.webkitTransform = 'scale(1.1)'; - } - - layout() { - this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px'; - this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px'; - } -} - -export default CenteredDiv; diff --git a/public/dat.gui-master/src/dat/dom/dom.js b/public/dat.gui-master/src/dat/dom/dom.js deleted file mode 100644 index b802fc9c6..000000000 --- a/public/dat.gui-master/src/dat/dom/dom.js +++ /dev/null @@ -1,292 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import common from '../utils/common'; - -const EVENT_MAP = { - HTMLEvents: ['change'], - MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'], - KeyboardEvents: ['keydown'] -}; - -const EVENT_MAP_INV = {}; -common.each(EVENT_MAP, function(v, k) { - common.each(v, function(e) { - EVENT_MAP_INV[e] = k; - }); -}); - -const CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; - -function cssValueToPixels(val) { - if (val === '0' || common.isUndefined(val)) { - return 0; - } - - const match = val.match(CSS_VALUE_PIXELS); - - if (!common.isNull(match)) { - return parseFloat(match[1]); - } - - // TODO ...ems? %? - - return 0; -} - -/** - * @namespace - * @member dat.dom - */ -const dom = { - - /** - * - * @param elem - * @param selectable - */ - makeSelectable: function(elem, selectable) { - if (elem === undefined || elem.style === undefined) return; - - elem.onselectstart = selectable ? function() { - return false; - } : function() { - }; - - elem.style.MozUserSelect = selectable ? 'auto' : 'none'; - elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; - elem.unselectable = selectable ? 'on' : 'off'; - }, - - /** - * - * @param elem - * @param horizontal - * @param vert - */ - makeFullscreen: function(elem, hor, vert) { - let vertical = vert; - let horizontal = hor; - - if (common.isUndefined(horizontal)) { - horizontal = true; - } - - if (common.isUndefined(vertical)) { - vertical = true; - } - - elem.style.position = 'absolute'; - - if (horizontal) { - elem.style.left = 0; - elem.style.right = 0; - } - if (vertical) { - elem.style.top = 0; - elem.style.bottom = 0; - } - }, - - /** - * - * @param elem - * @param eventType - * @param params - */ - fakeEvent: function(elem, eventType, pars, aux) { - const params = pars || {}; - const className = EVENT_MAP_INV[eventType]; - if (!className) { - throw new Error('Event type ' + eventType + ' not supported.'); - } - const evt = document.createEvent(className); - switch (className) { - case 'MouseEvents': - { - const clientX = params.x || params.clientX || 0; - const clientY = params.y || params.clientY || 0; - evt.initMouseEvent(eventType, params.bubbles || false, - params.cancelable || true, window, params.clickCount || 1, - 0, // screen X - 0, // screen Y - clientX, // client X - clientY, // client Y - false, false, false, false, 0, null); - break; - } - case 'KeyboardEvents': - { - const init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz - common.defaults(params, { - cancelable: true, - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false, - keyCode: undefined, - charCode: undefined - }); - init(eventType, params.bubbles || false, - params.cancelable, window, - params.ctrlKey, params.altKey, - params.shiftKey, params.metaKey, - params.keyCode, params.charCode); - break; - } - default: - { - evt.initEvent(eventType, params.bubbles || false, params.cancelable || true); - break; - } - } - common.defaults(evt, aux); - elem.dispatchEvent(evt); - }, - - /** - * - * @param elem - * @param event - * @param func - * @param bool - */ - bind: function(elem, event, func, newBool) { - const bool = newBool || false; - if (elem.addEventListener) { - elem.addEventListener(event, func, bool); - } else if (elem.attachEvent) { - elem.attachEvent('on' + event, func); - } - return dom; - }, - - /** - * - * @param elem - * @param event - * @param func - * @param bool - */ - unbind: function(elem, event, func, newBool) { - const bool = newBool || false; - if (elem.removeEventListener) { - elem.removeEventListener(event, func, bool); - } else if (elem.detachEvent) { - elem.detachEvent('on' + event, func); - } - return dom; - }, - - /** - * - * @param elem - * @param className - */ - addClass: function(elem, className) { - if (elem.className === undefined) { - elem.className = className; - } else if (elem.className !== className) { - const classes = elem.className.split(/ +/); - if (classes.indexOf(className) === -1) { - classes.push(className); - elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); - } - } - return dom; - }, - - /** - * - * @param elem - * @param className - */ - removeClass: function(elem, className) { - if (className) { - if (elem.className === className) { - elem.removeAttribute('class'); - } else { - const classes = elem.className.split(/ +/); - const index = classes.indexOf(className); - if (index !== -1) { - classes.splice(index, 1); - elem.className = classes.join(' '); - } - } - } else { - elem.className = undefined; - } - return dom; - }, - - hasClass: function(elem, className) { - return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; - }, - - /** - * - * @param elem - */ - getWidth: function(elem) { - const style = getComputedStyle(elem); - - return cssValueToPixels(style['border-left-width']) + - cssValueToPixels(style['border-right-width']) + - cssValueToPixels(style['padding-left']) + - cssValueToPixels(style['padding-right']) + - cssValueToPixels(style.width); - }, - - /** - * - * @param elem - */ - getHeight: function(elem) { - const style = getComputedStyle(elem); - - return cssValueToPixels(style['border-top-width']) + - cssValueToPixels(style['border-bottom-width']) + - cssValueToPixels(style['padding-top']) + - cssValueToPixels(style['padding-bottom']) + - cssValueToPixels(style.height); - }, - - /** - * - * @param el - */ - getOffset: function(el) { - let elem = el; - const offset = { left: 0, top: 0 }; - if (elem.offsetParent) { - do { - offset.left += elem.offsetLeft; - offset.top += elem.offsetTop; - elem = elem.offsetParent; - } while (elem); - } - return offset; - }, - - // http://stackoverflow.com/posts/2684561/revisions - /** - * - * @param elem - */ - isActive: function(elem) { - return elem === document.activeElement && (elem.type || elem.href); - } - -}; - -export default dom; diff --git a/public/dat.gui-master/src/dat/gui/GUI.js b/public/dat.gui-master/src/dat/gui/GUI.js deleted file mode 100644 index 972c30731..000000000 --- a/public/dat.gui-master/src/dat/gui/GUI.js +++ /dev/null @@ -1,1409 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import css from '../utils/css'; -import saveDialogueContents from './saveDialogue.html'; -import ControllerFactory from '../controllers/ControllerFactory'; -import Controller from '../controllers/Controller'; -import BooleanController from '../controllers/BooleanController'; -import FunctionController from '../controllers/FunctionController'; -import NumberControllerBox from '../controllers/NumberControllerBox'; -import NumberControllerSlider from '../controllers/NumberControllerSlider'; -import ColorController from '../controllers/ColorController'; -import requestAnimationFrame from '../utils/requestAnimationFrame'; -import CenteredDiv from '../dom/CenteredDiv'; -import dom from '../dom/dom'; -import common from '../utils/common'; - -import styleSheet from './style.scss'; // CSS to embed in build - -css.inject(styleSheet); - -/** @ignore Outer-most className for GUI's */ -const CSS_NAMESPACE = 'dg'; - -const HIDE_KEY_CODE = 72; - -/** @ignore The only value shared between the JS and SCSS. Use caution. */ -const CLOSE_BUTTON_HEIGHT = 20; - -const DEFAULT_DEFAULT_PRESET_NAME = 'Default'; - -const SUPPORTS_LOCAL_STORAGE = (function() { - try { - return !!window.localStorage; - } catch (e) { - return false; - } -}()); - -let SAVE_DIALOGUE; - -/** @ignore Have we yet to create an autoPlace GUI? */ -let autoPlaceVirgin = true; - -/** @ignore Fixed position div that auto place GUI's go inside */ -let autoPlaceContainer; - -/** @ignore Are we hiding the GUI's ? */ -let hide = false; - -/** @private GUI's which should be hidden */ -const hideableGuis = []; - -/** - * @class A lightweight controller library for JavaScript. It allows you to easily - * manipulate variables and fire functions on the fly. - * - * @typicalname gui - * - * @example - * // Creating a GUI with options. - * var gui = new dat.GUI({name: 'My GUI'}); - * - * @example - * // Creating a GUI and a subfolder. - * var gui = new dat.GUI(); - * var folder1 = gui.addFolder('Flow Field'); - * - * @param {Object} [params] - * @param {String} [params.name] The name of this GUI. - * @param {Object} [params.load] JSON object representing the saved state of - * this GUI. - * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in. - * @param {Boolean} [params.autoPlace=true] - * @param {Boolean} [params.hideable=true] If true, GUI is shown/hidden by h keypress. - * @param {Boolean} [params.closed=false] If true, starts closed - * @param {Boolean} [params.closeOnTop=false] If true, close/open button shows on top of the GUI - */ -const GUI = function(pars) { - const _this = this; - - let params = pars || {}; - - /** - * Outermost DOM Element - * @type {DOMElement} - */ - this.domElement = document.createElement('div'); - this.__ul = document.createElement('ul'); - this.domElement.appendChild(this.__ul); - - dom.addClass(this.domElement, CSS_NAMESPACE); - - /** - * Nested GUI's by name - * @ignore - */ - this.__folders = {}; - - this.__controllers = []; - - /** - * List of objects I'm remembering for save, only used in top level GUI - * @ignore - */ - this.__rememberedObjects = []; - - /** - * Maps the index of remembered objects to a map of controllers, only used - * in top level GUI. - * - * @private - * @ignore - * - * @example - * [ - * { - * propertyName: Controller, - * anotherPropertyName: Controller - * }, - * { - * propertyName: Controller - * } - * ] - */ - this.__rememberedObjectIndecesToControllers = []; - - this.__listening = []; - - // Default parameters - params = common.defaults(params, { - closeOnTop: false, - autoPlace: true, - width: GUI.DEFAULT_WIDTH - }); - - params = common.defaults(params, { - resizable: params.autoPlace, - hideable: params.autoPlace - }); - - if (!common.isUndefined(params.load)) { - // Explicit preset - if (params.preset) { - params.load.preset = params.preset; - } - } else { - params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; - } - - if (common.isUndefined(params.parent) && params.hideable) { - hideableGuis.push(this); - } - - // Only root level GUI's are resizable. - params.resizable = common.isUndefined(params.parent) && params.resizable; - - if (params.autoPlace && common.isUndefined(params.scrollable)) { - params.scrollable = true; - } -// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true; - - // Not part of params because I don't want people passing this in via - // constructor. Should be a 'remembered' value. - let useLocalStorage = - SUPPORTS_LOCAL_STORAGE && - localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; - - let saveToLocalStorage; - let titleRow; - - Object.defineProperties(this, - /** @lends GUI.prototype */ - { - /** - * The parent GUI - * @type dat.gui.GUI - */ - parent: { - get: function() { - return params.parent; - } - }, - - scrollable: { - get: function() { - return params.scrollable; - } - }, - - /** - * Handles GUI's element placement for you - * @type Boolean - */ - autoPlace: { - get: function() { - return params.autoPlace; - } - }, - - /** - * Handles GUI's position of open/close button - * @type Boolean - */ - closeOnTop: { - get: function() { - return params.closeOnTop; - } - }, - - /** - * The identifier for a set of saved values - * @type String - */ - preset: { - get: function() { - if (_this.parent) { - return _this.getRoot().preset; - } - - return params.load.preset; - }, - - set: function(v) { - if (_this.parent) { - _this.getRoot().preset = v; - } else { - params.load.preset = v; - } - setPresetSelectIndex(this); - _this.revert(); - } - }, - - /** - * The width of GUI element - * @type Number - */ - width: { - get: function() { - return params.width; - }, - set: function(v) { - params.width = v; - setWidth(_this, v); - } - }, - - /** - * The name of GUI. Used for folders. i.e - * a folder's name - * @type String - */ - name: { - get: function() { - return params.name; - }, - set: function(v) { - // TODO Check for collisions among sibling folders - params.name = v; - if (titleRow) { - titleRow.innerHTML = params.name; - } - } - }, - - /** - * Whether the GUI is collapsed or not - * @type Boolean - */ - closed: { - get: function() { - return params.closed; - }, - set: function(v) { - params.closed = v; - if (params.closed) { - dom.addClass(_this.__ul, GUI.CLASS_CLOSED); - } else { - dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); - } - // For browsers that aren't going to respect the CSS transition, - // Lets just check our height against the window height right off - // the bat. - this.onResize(); - - if (_this.__closeButton) { - _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; - } - } - }, - - /** - * Contains all presets - * @type Object - */ - load: { - get: function() { - return params.load; - } - }, - - /** - * Determines whether or not to use localStorage as the means for - * remembering - * @type Boolean - */ - useLocalStorage: { - - get: function() { - return useLocalStorage; - }, - set: function(bool) { - if (SUPPORTS_LOCAL_STORAGE) { - useLocalStorage = bool; - if (bool) { - dom.bind(window, 'unload', saveToLocalStorage); - } else { - dom.unbind(window, 'unload', saveToLocalStorage); - } - localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); - } - } - } - }); - - // Are we a root level GUI? - if (common.isUndefined(params.parent)) { - this.closed = params.closed || false; - - dom.addClass(this.domElement, GUI.CLASS_MAIN); - dom.makeSelectable(this.domElement, false); - - // Are we supposed to be loading locally? - if (SUPPORTS_LOCAL_STORAGE) { - if (useLocalStorage) { - _this.useLocalStorage = true; - - const savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui')); - - if (savedGui) { - params.load = JSON.parse(savedGui); - } - } - } - - this.__closeButton = document.createElement('div'); - this.__closeButton.innerHTML = GUI.TEXT_CLOSED; - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); - if (params.closeOnTop) { - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP); - this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]); - } else { - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM); - this.domElement.appendChild(this.__closeButton); - } - - dom.bind(this.__closeButton, 'click', function() { - _this.closed = !_this.closed; - }); - // Oh, you're a nested GUI! - } else { - if (params.closed === undefined) { - params.closed = true; - } - - const titleRowName = document.createTextNode(params.name); - dom.addClass(titleRowName, 'controller-name'); - - titleRow = addRow(_this, titleRowName); - - const onClickTitle = function(e) { - e.preventDefault(); - _this.closed = !_this.closed; - return false; - }; - - dom.addClass(this.__ul, GUI.CLASS_CLOSED); - - dom.addClass(titleRow, 'title'); - dom.bind(titleRow, 'click', onClickTitle); - - if (!params.closed) { - this.closed = false; - } - } - - if (params.autoPlace) { - if (common.isUndefined(params.parent)) { - if (autoPlaceVirgin) { - autoPlaceContainer = document.createElement('div'); - dom.addClass(autoPlaceContainer, CSS_NAMESPACE); - dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER); - document.body.appendChild(autoPlaceContainer); - autoPlaceVirgin = false; - } - - // Put it in the dom for you. - autoPlaceContainer.appendChild(this.domElement); - - // Apply the auto styles - dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); - } - - - // Make it not elastic. - if (!this.parent) { - setWidth(_this, params.width); - } - } - - this.__resizeHandler = function() { - _this.onResizeDebounced(); - }; - - dom.bind(window, 'resize', this.__resizeHandler); - dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler); - dom.bind(this.__ul, 'transitionend', this.__resizeHandler); - dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler); - this.onResize(); - - if (params.resizable) { - addResizeHandle(this); - } - - saveToLocalStorage = function() { - if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') { - localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); - } - }; - - // expose this method publicly - this.saveToLocalStorageIfPossible = saveToLocalStorage; - - function resetWidth() { - const root = _this.getRoot(); - root.width += 1; - common.defer(function() { - root.width -= 1; - }); - } - - if (!params.parent) { - resetWidth(); - } -}; - -GUI.toggleHide = function() { - hide = !hide; - common.each(hideableGuis, function(gui) { - gui.domElement.style.display = hide ? 'none' : ''; - }); -}; - -GUI.CLASS_AUTO_PLACE = 'a'; -GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; -GUI.CLASS_MAIN = 'main'; -GUI.CLASS_CONTROLLER_ROW = 'cr'; -GUI.CLASS_TOO_TALL = 'taller-than-window'; -GUI.CLASS_CLOSED = 'closed'; -GUI.CLASS_CLOSE_BUTTON = 'close-button'; -GUI.CLASS_CLOSE_TOP = 'close-top'; -GUI.CLASS_CLOSE_BOTTOM = 'close-bottom'; -GUI.CLASS_DRAG = 'drag'; - -GUI.DEFAULT_WIDTH = 245; -GUI.TEXT_CLOSED = 'Close Controls'; -GUI.TEXT_OPEN = 'Open Controls'; - -GUI._keydownHandler = function(e) { - if (document.activeElement.type !== 'text' && - (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) { - GUI.toggleHide(); - } -}; -dom.bind(window, 'keydown', GUI._keydownHandler, false); - -common.extend( - GUI.prototype, - - /** @lends GUI.prototype */ - { - - /** - * Adds a new {@link Controller} to the GUI. The type of controller created - * is inferred from the initial value of object[property]. For - * color properties, see {@link addColor}. - * - * @param {Object} object The object to be manipulated - * @param {String} property The name of the property to be manipulated - * @param {Number} [min] Minimum allowed value - * @param {Number} [max] Maximum allowed value - * @param {Number} [step] Increment by which to change value - * @returns {Controller} The controller that was added to the GUI. - * @instance - * - * @example - * // Add a string controller. - * var person = {name: 'Sam'}; - * gui.add(person, 'name'); - * - * @example - * // Add a number controller slider. - * var person = {age: 45}; - * gui.add(person, 'age', 0, 100); - */ - add: function(object, property) { - return add( - this, - object, - property, - { - factoryArgs: Array.prototype.slice.call(arguments, 2) - } - ); - }, - - /** - * Adds a new color controller to the GUI. - * - * @param object - * @param property - * @returns {Controller} The controller that was added to the GUI. - * @instance - * - * @example - * var palette = { - * color1: '#FF0000', // CSS string - * color2: [ 0, 128, 255 ], // RGB array - * color3: [ 0, 128, 255, 0.3 ], // RGB with alpha - * color4: { h: 350, s: 0.9, v: 0.3 } // Hue, saturation, value - * }; - * gui.addColor(palette, 'color1'); - * gui.addColor(palette, 'color2'); - * gui.addColor(palette, 'color3'); - * gui.addColor(palette, 'color4'); - */ - addColor: function(object, property) { - return add( - this, - object, - property, - { - color: true - } - ); - }, - - /** - * Removes the given controller from the GUI. - * @param {Controller} controller - * @instance - */ - remove: function(controller) { - // TODO listening? - this.__ul.removeChild(controller.__li); - this.__controllers.splice(this.__controllers.indexOf(controller), 1); - const _this = this; - common.defer(function() { - _this.onResize(); - }); - }, - - /** - * Removes the root GUI from the document and unbinds all event listeners. - * For subfolders, use `gui.removeFolder(folder)` instead. - * @instance - */ - destroy: function() { - if (this.parent) { - throw new Error( - 'Only the root GUI should be removed with .destroy(). ' + - 'For subfolders, use gui.removeFolder(folder) instead.' - ); - } - - if (this.autoPlace) { - autoPlaceContainer.removeChild(this.domElement); - } - - const _this = this; - common.each(this.__folders, function(subfolder) { - _this.removeFolder(subfolder); - }); - - dom.unbind(window, 'keydown', GUI._keydownHandler, false); - - removeListeners(this); - }, - - /** - * Creates a new subfolder GUI instance. - * @param name - * @returns {dat.gui.GUI} The new folder. - * @throws {Error} if this GUI already has a folder by the specified - * name - * @instance - */ - addFolder: function(name) { - // We have to prevent collisions on names in order to have a key - // by which to remember saved values - if (this.__folders[name] !== undefined) { - throw new Error('You already have a folder in this GUI by the' + - ' name "' + name + '"'); - } - - const newGuiParams = { name: name, parent: this }; - - // We need to pass down the autoPlace trait so that we can - // attach event listeners to open/close folder actions to - // ensure that a scrollbar appears if the window is too short. - newGuiParams.autoPlace = this.autoPlace; - - // Do we have saved appearance data for this folder? - if (this.load && // Anything loaded? - this.load.folders && // Was my parent a dead-end? - this.load.folders[name]) { // Did daddy remember me? - // Start me closed if I was closed - newGuiParams.closed = this.load.folders[name].closed; - - // Pass down the loaded data - newGuiParams.load = this.load.folders[name]; - } - - const gui = new GUI(newGuiParams); - this.__folders[name] = gui; - - const li = addRow(this, gui.domElement); - dom.addClass(li, 'folder'); - return gui; - }, - - /** - * Removes a subfolder GUI instance. - * @param {dat.gui.GUI} folder The folder to remove. - * @instance - */ - removeFolder: function(folder) { - this.__ul.removeChild(folder.domElement.parentElement); - - delete this.__folders[folder.name]; - - // Do we have saved appearance data for this folder? - if (this.load && // Anything loaded? - this.load.folders && // Was my parent a dead-end? - this.load.folders[folder.name]) { - delete this.load.folders[folder.name]; - } - - removeListeners(folder); - - const _this = this; - - common.each(folder.__folders, function(subfolder) { - folder.removeFolder(subfolder); - }); - - common.defer(function() { - _this.onResize(); - }); - }, - - /** - * Opens the GUI. - */ - open: function() { - this.closed = false; - }, - - /** - * Closes the GUI. - */ - close: function() { - this.closed = true; - }, - - /** - * Hides the GUI. - */ - hide: function() { - this.domElement.style.display = 'none'; - }, - - /** - * Shows the GUI. - */ - show: function() { - this.domElement.style.display = ''; - }, - - - onResize: function() { - // we debounce this function to prevent performance issues when rotating on tablet/mobile - const root = this.getRoot(); - if (root.scrollable) { - const top = dom.getOffset(root.__ul).top; - let h = 0; - - common.each(root.__ul.childNodes, function(node) { - if (!(root.autoPlace && node === root.__save_row)) { - h += dom.getHeight(node); - } - }); - - if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { - dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); - root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; - } else { - dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); - root.__ul.style.height = 'auto'; - } - } - - if (root.__resize_handle) { - common.defer(function() { - root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; - }); - } - - if (root.__closeButton) { - root.__closeButton.style.width = root.width + 'px'; - } - }, - - onResizeDebounced: common.debounce(function() { this.onResize(); }, 50), - - /** - * Mark objects for saving. The order of these objects cannot change as - * the GUI grows. When remembering new objects, append them to the end - * of the list. - * - * @param {...Object} objects - * @throws {Error} if not called on a top level GUI. - * @instance - * @ignore - */ - remember: function() { - if (common.isUndefined(SAVE_DIALOGUE)) { - SAVE_DIALOGUE = new CenteredDiv(); - SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents; - } - - if (this.parent) { - throw new Error('You can only call remember on a top level GUI.'); - } - - const _this = this; - - common.each(Array.prototype.slice.call(arguments), function(object) { - if (_this.__rememberedObjects.length === 0) { - addSaveMenu(_this); - } - if (_this.__rememberedObjects.indexOf(object) === -1) { - _this.__rememberedObjects.push(object); - } - }); - - if (this.autoPlace) { - // Set save row width - setWidth(this, this.width); - } - }, - - /** - * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI. - * @instance - */ - getRoot: function() { - let gui = this; - while (gui.parent) { - gui = gui.parent; - } - return gui; - }, - - /** - * @returns {Object} a JSON object representing the current state of - * this GUI as well as its remembered properties. - * @instance - */ - getSaveObject: function() { - const toReturn = this.load; - toReturn.closed = this.closed; - - // Am I remembering any values? - if (this.__rememberedObjects.length > 0) { - toReturn.preset = this.preset; - - if (!toReturn.remembered) { - toReturn.remembered = {}; - } - - toReturn.remembered[this.preset] = getCurrentPreset(this); - } - - toReturn.folders = {}; - common.each(this.__folders, function(element, key) { - toReturn.folders[key] = element.getSaveObject(); - }); - - return toReturn; - }, - - save: function() { - if (!this.load.remembered) { - this.load.remembered = {}; - } - - this.load.remembered[this.preset] = getCurrentPreset(this); - markPresetModified(this, false); - this.saveToLocalStorageIfPossible(); - }, - - saveAs: function(presetName) { - if (!this.load.remembered) { - // Retain default values upon first save - this.load.remembered = {}; - this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); - } - - this.load.remembered[presetName] = getCurrentPreset(this); - this.preset = presetName; - addPresetOption(this, presetName, true); - this.saveToLocalStorageIfPossible(); - }, - - revert: function(gui) { - common.each(this.__controllers, function(controller) { - // Make revert work on Default. - if (!this.getRoot().load.remembered) { - controller.setValue(controller.initialValue); - } else { - recallSavedValue(gui || this.getRoot(), controller); - } - - // fire onFinishChange callback - if (controller.__onFinishChange) { - controller.__onFinishChange.call(controller, controller.getValue()); - } - }, this); - - common.each(this.__folders, function(folder) { - folder.revert(folder); - }); - - if (!gui) { - markPresetModified(this.getRoot(), false); - } - }, - - listen: function(controller) { - const init = this.__listening.length === 0; - this.__listening.push(controller); - if (init) { - updateDisplays(this.__listening); - } - }, - - updateDisplay: function() { - common.each(this.__controllers, function(controller) { - controller.updateDisplay(); - }); - common.each(this.__folders, function(folder) { - folder.updateDisplay(); - }); - } - } -); - -/** - * Add a row to the end of the GUI or before another row. - * - * @param gui - * @param [newDom] If specified, inserts the dom content in the new row - * @param [liBefore] If specified, places the new row before another row - * - * @ignore - */ -function addRow(gui, newDom, liBefore) { - const li = document.createElement('li'); - if (newDom) { - li.appendChild(newDom); - } - - if (liBefore) { - gui.__ul.insertBefore(li, liBefore); - } else { - gui.__ul.appendChild(li); - } - gui.onResize(); - return li; -} - -function removeListeners(gui) { - dom.unbind(window, 'resize', gui.__resizeHandler); - - if (gui.saveToLocalStorageIfPossible) { - dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible); - } -} - -function markPresetModified(gui, modified) { - const opt = gui.__preset_select[gui.__preset_select.selectedIndex]; - - if (modified) { - opt.innerHTML = opt.value + '*'; - } else { - opt.innerHTML = opt.value; - } -} - -function augmentController(gui, li, controller) { - controller.__li = li; - controller.__gui = gui; - - common.extend(controller, /** @lends Controller.prototype */ { - /** - * @param {Array|Object} options - * @return {Controller} - */ - options: function(options) { - if (arguments.length > 1) { - const nextSibling = controller.__li.nextElementSibling; - controller.remove(); - - return add( - gui, - controller.object, - controller.property, - { - before: nextSibling, - factoryArgs: [common.toArray(arguments)] - } - ); - } - - if (common.isArray(options) || common.isObject(options)) { - const nextSibling = controller.__li.nextElementSibling; - controller.remove(); - - return add( - gui, - controller.object, - controller.property, - { - before: nextSibling, - factoryArgs: [options] - } - ); - } - }, - - /** - * Sets the name of the controller. - * @param {string} name - * @return {Controller} - */ - name: function(name) { - controller.__li.firstElementChild.firstElementChild.innerHTML = name; - return controller; - }, - - /** - * Sets controller to listen for changes on its underlying object. - * @return {Controller} - */ - listen: function() { - controller.__gui.listen(controller); - return controller; - }, - - /** - * Removes the controller from its parent GUI. - * @return {Controller} - */ - remove: function() { - controller.__gui.remove(controller); - return controller; - } - }); - - // All sliders should be accompanied by a box. - if (controller instanceof NumberControllerSlider) { - const box = new NumberControllerBox(controller.object, controller.property, - { min: controller.__min, max: controller.__max, step: controller.__step }); - - common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function(method) { - const pc = controller[method]; - const pb = box[method]; - controller[method] = box[method] = function() { - const args = Array.prototype.slice.call(arguments); - pb.apply(box, args); - return pc.apply(controller, args); - }; - }); - - dom.addClass(li, 'has-slider'); - controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); - } else if (controller instanceof NumberControllerBox) { - const r = function(returned) { - // Have we defined both boundaries? - if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) { - // Well, then lets just replace this with a slider. - - // lets remember if the old controller had a specific name or was listening - const oldName = controller.__li.firstElementChild.firstElementChild.innerHTML; - const wasListening = controller.__gui.__listening.indexOf(controller) > -1; - - controller.remove(); - const newController = add( - gui, - controller.object, - controller.property, - { - before: controller.__li.nextElementSibling, - factoryArgs: [controller.__min, controller.__max, controller.__step] - }); - - newController.name(oldName); - if (wasListening) newController.listen(); - - return newController; - } - - return returned; - }; - - controller.min = common.compose(r, controller.min); - controller.max = common.compose(r, controller.max); - } else if (controller instanceof BooleanController) { - dom.bind(li, 'click', function() { - dom.fakeEvent(controller.__checkbox, 'click'); - }); - - dom.bind(controller.__checkbox, 'click', function(e) { - e.stopPropagation(); // Prevents double-toggle - }); - } else if (controller instanceof FunctionController) { - dom.bind(li, 'click', function() { - dom.fakeEvent(controller.__button, 'click'); - }); - - dom.bind(li, 'mouseover', function() { - dom.addClass(controller.__button, 'hover'); - }); - - dom.bind(li, 'mouseout', function() { - dom.removeClass(controller.__button, 'hover'); - }); - } else if (controller instanceof ColorController) { - dom.addClass(li, 'color'); - controller.updateDisplay = common.compose(function(val) { - li.style.borderLeftColor = controller.__color.toString(); - return val; - }, controller.updateDisplay); - - controller.updateDisplay(); - } - - controller.setValue = common.compose(function(val) { - if (gui.getRoot().__preset_select && controller.isModified()) { - markPresetModified(gui.getRoot(), true); - } - - return val; - }, controller.setValue); -} - -function recallSavedValue(gui, controller) { - // Find the topmost GUI, that's where remembered objects live. - const root = gui.getRoot(); - - // Does the object we're controlling match anything we've been told to - // remember? - const matchedIndex = root.__rememberedObjects.indexOf(controller.object); - - // Why yes, it does! - if (matchedIndex !== -1) { - // Let me fetch a map of controllers for thcommon.isObject. - let controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex]; - - // Ohp, I believe this is the first controller we've created for this - // object. Lets make the map fresh. - if (controllerMap === undefined) { - controllerMap = {}; - root.__rememberedObjectIndecesToControllers[matchedIndex] = - controllerMap; - } - - // Keep track of this controller - controllerMap[controller.property] = controller; - - // Okay, now have we saved any values for this controller? - if (root.load && root.load.remembered) { - const presetMap = root.load.remembered; - - // Which preset are we trying to load? - let preset; - - if (presetMap[gui.preset]) { - preset = presetMap[gui.preset]; - } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) { - // Uhh, you can have the default instead? - preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME]; - } else { - // Nada. - return; - } - - // Did the loaded object remember thcommon.isObject? && Did we remember this particular property? - if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) { - // We did remember something for this guy ... - const value = preset[matchedIndex][controller.property]; - - // And that's what it is. - controller.initialValue = value; - controller.setValue(value); - } - } - } -} - -function add(gui, object, property, params) { - if (object[property] === undefined) { - throw new Error(`Object "${object}" has no property "${property}"`); - } - - let controller; - - if (params.color) { - controller = new ColorController(object, property); - } else { - const factoryArgs = [object, property].concat(params.factoryArgs); - controller = ControllerFactory.apply(gui, factoryArgs); - } - - if (params.before instanceof Controller) { - params.before = params.before.__li; - } - - recallSavedValue(gui, controller); - - dom.addClass(controller.domElement, 'c'); - - const name = document.createElement('span'); - dom.addClass(name, 'property-name'); - name.innerHTML = controller.property; - - const container = document.createElement('div'); - container.appendChild(name); - container.appendChild(controller.domElement); - - const li = addRow(gui, container, params.before); - - dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); - if (controller instanceof ColorController) { - dom.addClass(li, 'color'); - } else { - dom.addClass(li, typeof controller.getValue()); - } - - augmentController(gui, li, controller); - - gui.__controllers.push(controller); - - return controller; -} - -function getLocalStorageHash(gui, key) { - // TODO how does this deal with multiple GUI's? - return document.location.href + '.' + key; -} - -function addPresetOption(gui, name, setSelected) { - const opt = document.createElement('option'); - opt.innerHTML = name; - opt.value = name; - gui.__preset_select.appendChild(opt); - if (setSelected) { - gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; - } -} - -function showHideExplain(gui, explain) { - explain.style.display = gui.useLocalStorage ? 'block' : 'none'; -} - -function addSaveMenu(gui) { - const div = gui.__save_row = document.createElement('li'); - - dom.addClass(gui.domElement, 'has-save'); - - gui.__ul.insertBefore(div, gui.__ul.firstChild); - - dom.addClass(div, 'save-row'); - - const gears = document.createElement('span'); - gears.innerHTML = ' '; - dom.addClass(gears, 'button gears'); - - // TODO replace with FunctionController - const button = document.createElement('span'); - button.innerHTML = 'Save'; - dom.addClass(button, 'button'); - dom.addClass(button, 'save'); - - const button2 = document.createElement('span'); - button2.innerHTML = 'New'; - dom.addClass(button2, 'button'); - dom.addClass(button2, 'save-as'); - - const button3 = document.createElement('span'); - button3.innerHTML = 'Revert'; - dom.addClass(button3, 'button'); - dom.addClass(button3, 'revert'); - - const select = gui.__preset_select = document.createElement('select'); - - if (gui.load && gui.load.remembered) { - common.each(gui.load.remembered, function(value, key) { - addPresetOption(gui, key, key === gui.preset); - }); - } else { - addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); - } - - dom.bind(select, 'change', function() { - for (let index = 0; index < gui.__preset_select.length; index++) { - gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; - } - - gui.preset = this.value; - }); - - div.appendChild(select); - div.appendChild(gears); - div.appendChild(button); - div.appendChild(button2); - div.appendChild(button3); - - if (SUPPORTS_LOCAL_STORAGE) { - const explain = document.getElementById('dg-local-explain'); - const localStorageCheckBox = document.getElementById('dg-local-storage'); - const saveLocally = document.getElementById('dg-save-locally'); - - saveLocally.style.display = 'block'; - - if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { - localStorageCheckBox.setAttribute('checked', 'checked'); - } - - showHideExplain(gui, explain); - - // TODO: Use a boolean controller, fool! - dom.bind(localStorageCheckBox, 'change', function() { - gui.useLocalStorage = !gui.useLocalStorage; - showHideExplain(gui, explain); - }); - } - - const newConstructorTextArea = document.getElementById('dg-new-constructor'); - - dom.bind(newConstructorTextArea, 'keydown', function(e) { - if (e.metaKey && (e.which === 67 || e.keyCode === 67)) { - SAVE_DIALOGUE.hide(); - } - }); - - dom.bind(gears, 'click', function() { - newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); - SAVE_DIALOGUE.show(); - newConstructorTextArea.focus(); - newConstructorTextArea.select(); - }); - - dom.bind(button, 'click', function() { - gui.save(); - }); - - dom.bind(button2, 'click', function() { - const presetName = prompt('Enter a new preset name.'); - if (presetName) { - gui.saveAs(presetName); - } - }); - - dom.bind(button3, 'click', function() { - gui.revert(); - }); - - // div.appendChild(button2); -} - -function addResizeHandle(gui) { - let pmouseX; - - gui.__resize_handle = document.createElement('div'); - - common.extend(gui.__resize_handle.style, { - - width: '6px', - marginLeft: '-3px', - height: '200px', - cursor: 'ew-resize', - position: 'absolute' - // border: '1px solid blue' - - }); - - function drag(e) { - e.preventDefault(); - - gui.width += pmouseX - e.clientX; - gui.onResize(); - pmouseX = e.clientX; - - return false; - } - - function dragStop() { - dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); - dom.unbind(window, 'mousemove', drag); - dom.unbind(window, 'mouseup', dragStop); - } - - function dragStart(e) { - e.preventDefault(); - - pmouseX = e.clientX; - - dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); - dom.bind(window, 'mousemove', drag); - dom.bind(window, 'mouseup', dragStop); - - return false; - } - - dom.bind(gui.__resize_handle, 'mousedown', dragStart); - dom.bind(gui.__closeButton, 'mousedown', dragStart); - - gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); -} - -function setWidth(gui, w) { - gui.domElement.style.width = w + 'px'; - // Auto placed save-rows are position fixed, so we have to - // set the width manually if we want it to bleed to the edge - if (gui.__save_row && gui.autoPlace) { - gui.__save_row.style.width = w + 'px'; - } - if (gui.__closeButton) { - gui.__closeButton.style.width = w + 'px'; - } -} - -function getCurrentPreset(gui, useInitialValues) { - const toReturn = {}; - - // For each object I'm remembering - common.each(gui.__rememberedObjects, function(val, index) { - const savedValues = {}; - - // The controllers I've made for thcommon.isObject by property - const controllerMap = - gui.__rememberedObjectIndecesToControllers[index]; - - // Remember each value for each property - common.each(controllerMap, function(controller, property) { - savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue(); - }); - - // Save the values for thcommon.isObject - toReturn[index] = savedValues; - }); - - return toReturn; -} - -function setPresetSelectIndex(gui) { - for (let index = 0; index < gui.__preset_select.length; index++) { - if (gui.__preset_select[index].value === gui.preset) { - gui.__preset_select.selectedIndex = index; - } - } -} - -function updateDisplays(controllerArray) { - if (controllerArray.length !== 0) { - requestAnimationFrame.call(window, function() { - updateDisplays(controllerArray); - }); - } - - common.each(controllerArray, function(c) { - c.updateDisplay(); - }); -} - -export default GUI; diff --git a/public/dat.gui-master/src/dat/gui/_structure.scss b/public/dat.gui-master/src/dat/gui/_structure.scss deleted file mode 100644 index 3193f8e00..000000000 --- a/public/dat.gui-master/src/dat/gui/_structure.scss +++ /dev/null @@ -1,300 +0,0 @@ -$nest-margin: 4px; -$row-height: 27px; - -$button-height: 20px; - -.dg { - - /** Clear list styles */ - ul { - list-style: none; - margin: 0; - padding: 0; - width: 100%; - clear: both; - } - - /* Auto-place container */ - &.ac { - position: fixed; - top: 0; - left: 0; - right: 0; - height: 0; - z-index: 0; - } - - &:not(.ac) .main { - /** Exclude mains in ac so that we don't hide close button */ - overflow: hidden; - } - - &.main { - - @include transition(opacity, 0.1s, linear); - - &.taller-than-window { - - overflow-y: auto; - - .close-button { - - opacity: 1; - - /* TODO, these are style notes */ - margin-top: -1px; - border-top: 1px solid $border-color; - - } - - } - - ul.closed .close-button { - opacity: 1 !important; - } - - &:hover .close-button, - .close-button.drag { - opacity: 1; - } - - .close-button { - /*opacity: 0;*/ - @include transition(opacity, 0.1s, linear); - border: 0; - - line-height: $button-height - 1; - height: $button-height; - - /* TODO, these are style notes */ - cursor: pointer; - text-align: center; - background-color: #000; - &.close-top { - position: relative; - } - &.close-bottom { - position: absolute; - } - &:hover { - background-color: #111; - } - - } - - } - - /* Auto-placed GUI's */ - &.a { - - float: right; - margin-right: 15px; - overflow-y:visible; - - &.has-save > ul { - - &.close-top { - margin-top: 0; - } - &.close-bottom { - margin-top: $row-height; - } - - &.closed { - margin-top: 0; - } - } - - .save-row { - top: 0; - z-index: 1002; - - &.close-top { - position: relative; - } - &.close-bottom { - position: fixed; - } - - } - - } - - li { - @include transition(height, 0.1s, ease-out); - @include transition(overflow, 0.1s, linear); - } - - /* Line items that don't contain folders. */ - li:not(.folder) { - cursor: auto; - height: $row-height; - line-height: $row-height; - padding: 0 4px 0 5px; - } - - li.folder { - padding: 0; - border-left: $nest-margin solid rgba(0, 0, 0, 0); - - } - - /** Folder names */ - li.title { - cursor: pointer; - margin-left: -$nest-margin; - } - - /** Hides closed items */ - .closed li:not(.title), - .closed ul li, - .closed ul li > * { - height: 0; - overflow: hidden; - border: 0; - } - - /** Controller row */ - .cr { - clear: both; - padding-left: 3px; - height: $row-height; - overflow: hidden; - } - - /** Name-half (left) */ - .property-name { - cursor: default; - float: left; - clear: left; - width: 40%; - overflow: hidden; - text-overflow: ellipsis; - } - - /** Controller-half (right) */ - .c { - float: left; - width: 60%; - position: relative; - } - - /** Controller placement */ - .c input[type=text] { - border: 0; - margin-top: 4px; - padding: 3px; - width: 100%; - float: right; - } - - /** Shorter number boxes when slider is present. */ - .has-slider input[type=text] { - width: 30%; - /*display: none;*/ - margin-left: 0; - } - - .slider { - float: left; - width: 66%; - margin-left: -5px; - margin-right: 0; - height: 19px; - margin-top: 4px; - } - - .slider-fg { - height: 100%; - } - - .c input[type=checkbox] { - margin-top: 7px; - } - - .c select { - margin-top: 5px; - } - - /** Ensure the entire boolean and function row shows a hand */ - .cr.function, - .cr.function .property-name, /* Don't know why I need to be this explicit */ - .cr.function *, - .cr.boolean, - .cr.boolean * { - cursor: pointer; - } - - /** allow overflow for color selector */ - .cr.color { - overflow: visible; - } - - .selector { - display: none; - position: absolute; - margin-left: -9px; - margin-top: 23px; - z-index: 10; - } - - .c:hover .selector, - .selector.drag { - display: block; - } - - li.save-row { - - padding: 0; - - .button { - display: inline-block; - padding: 0px 6px; - } - - } - - &.dialogue { - background-color: #222; - width: 460px; - padding: 15px; - font-size: 13px; - line-height: 15px; - } - -} - -/* TODO Separate style and structure */ -#dg-new-constructor { - padding: 10px; - color: #222; - font-family: Monaco, monospace; - font-size: 10px; - border: 0; - resize: none; - box-shadow: inset 1px 1px 1px #888; - word-wrap: break-word; - margin: 12px 0; - display: block; - width: 440px; - overflow-y: scroll; - height: 100px; - position: relative; -} - -#dg-local-explain { - display: none; - font-size: 11px; - line-height: 17px; - border-radius: 3px; - background-color: #333; - padding: 8px; - margin-top: 10px; - code { - font-size: 10px; - } -} - -#dat-gui-save-locally { - display: none; -} diff --git a/public/dat.gui-master/src/dat/gui/saveDialogue.html.js b/public/dat.gui-master/src/dat/gui/saveDialogue.html.js deleted file mode 100644 index 6a9c3d5ac..000000000 --- a/public/dat.gui-master/src/dat/gui/saveDialogue.html.js +++ /dev/null @@ -1,23 +0,0 @@ -const saveDialogContents = `
      - - Here's the new load parameter for your GUI's constructor: - - - -
      - - Automatically save - values to localStorage on exit. - -
      The values saved to localStorage will - override those passed to dat.GUI's constructor. This makes it - easier to work incrementally, but localStorage is fragile, - and your friends may not see the same values you do. - -
      - -
      - -
      `; - -export default saveDialogContents; diff --git a/public/dat.gui-master/src/dat/gui/style.scss b/public/dat.gui-master/src/dat/gui/style.scss deleted file mode 100644 index 89705cd45..000000000 --- a/public/dat.gui-master/src/dat/gui/style.scss +++ /dev/null @@ -1,202 +0,0 @@ -$background-color: #1a1a1a; - -$hover-lighten: 5%; -$border-lighten: 7%; -$active-lighten: 10%; - -$number-color: #2FA1D6; -$boolean-color: #806787; -$string-color: #1ed36f; -$function-color: #e61d5f; -$save-row-color: #dad5cb; -$button-color: darken($save-row-color, 10%); -$border-color: lighten($background-color, $border-lighten); -$input-color: lighten($background-color, 8.5%); - -@mixin transition($prop, $time, $curve) { - -webkit-transition: $prop $time $curve; - -o-transition: $prop $time $curve; - -moz-transition: $prop $time $curve; - transition: $prop $time $curve; -} - -@mixin gradient($a, $b) { - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from($a), to($b)); - background: -o-gradient(linear, 0% 0%, 0% 100%, from($a), to($b)); - background: -moz-gradient(linear, 0% 0%, 0% 100%, from($a), to($b)); -} - -@mixin button() { - margin-left: 5px; - margin-top: 1px; - border-radius: 2px; - font-size: 9px; - line-height: 7px; - padding: 4px 4px 5px 4px; - background: $button-color; - color: #fff; - text-shadow: 0 1px 0 darken($button-color, 10%); - box-shadow: 0 -1px 0 darken($button-color, 10%); - cursor: pointer; -} - -@mixin gears() { - background: $button-color url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat; - height: 7px; - width: 8px; -} - -@import "structure"; - -/** Main type */ -.dg { - - color: #eee; - font: 11px 'Lucida Grande', sans-serif; - text-shadow: 0 -1px 0 #111; - - /** Auto place */ - &.main { - - /** Scrollbar */ - &::-webkit-scrollbar { - width: 5px; - background: $background-color; - } - &::-webkit-scrollbar-corner { - height: 0; - display: none; - } - &::-webkit-scrollbar-thumb { - border-radius: 5px; - background: lighten($background-color, 30%); - } - - } - - li { - - &:not(.folder) { - background: $background-color; - border-bottom: 1px solid $border-color; - } - - &.save-row { - - line-height: 25px; - background: $save-row-color; - border: 0; - - select { - margin-left: 5px; - width: 108px; - - } - - .button { - - &.gears { - @include gears; - } - - @include button; - - &:hover { - background-color: darken($button-color, 5%); - box-shadow: 0 -1px 0 darken($button-color, 10%); - } - - } - - } - - &.folder { - border-bottom: 0; - } - - &.title { - padding-left: 16px; - background: #000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat; - cursor: pointer; - border-bottom: 1px solid rgba(255, 255, 255, 0.2); - } - - } - - .closed li.title { - background-image: url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==); - } - - /* Controller row,
    1. */ - .cr { - - &.boolean { - border-left: 3px solid $boolean-color; - } - - &.color { - border-left: 3px solid; - } - - &.function { - border-left: 3px solid $function-color; - } - - &.number { - border-left: 3px solid $number-color; - input[type=text] { - color: $number-color; - } - } - - &.string { - border-left: 3px solid $string-color; - input[type=text] { - color: $string-color; - } - } - - &.function:hover, - &.boolean:hover { - background: #111; - } - - } - - /** Controllers */ - .c { - - input[type=text] { - - background: $input-color; - outline: none; - &:hover { - background: lighten($input-color, $hover-lighten); - } - &:focus { - background: lighten($input-color, $active-lighten); - color: #fff; - } - - } - - .slider { - background: $input-color; - cursor: ew-resize; - } - - .slider-fg { - background: $number-color; - max-width: 100%; - } - - .slider:hover { - background: lighten($input-color, $hover-lighten); - .slider-fg { - background: lighten($number-color, $hover-lighten); - } - } - - } - -} diff --git a/public/dat.gui-master/src/dat/index.js b/public/dat.gui-master/src/dat/index.js deleted file mode 100644 index 87b1a1eca..000000000 --- a/public/dat.gui-master/src/dat/index.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -import Color from './color/Color'; -import math from './color/math'; -import interpret from './color/interpret'; - -import Controller from './controllers/Controller'; -import BooleanController from './controllers/BooleanController'; -import OptionController from './controllers/OptionController'; -import StringController from './controllers/StringController'; -import NumberController from './controllers/NumberController'; -import NumberControllerBox from './controllers/NumberControllerBox'; -import NumberControllerSlider from './controllers/NumberControllerSlider'; -import FunctionController from './controllers/FunctionController'; -import ColorController from './controllers/ColorController'; - -import domImport from './dom/dom'; -import GUIImport from './gui/GUI'; - -export const color = { - Color: Color, - math: math, - interpret: interpret -}; - -export const controllers = { - Controller: Controller, - BooleanController: BooleanController, - OptionController: OptionController, - StringController: StringController, - NumberController: NumberController, - NumberControllerBox: NumberControllerBox, - NumberControllerSlider: NumberControllerSlider, - FunctionController: FunctionController, - ColorController: ColorController -}; - -export const dom = { dom: domImport }; - -export const gui = { GUI: GUIImport }; - -export const GUI = GUIImport; - -export default { - color, - controllers, - dom, - gui, - GUI -}; diff --git a/public/dat.gui-master/src/dat/utils/common.js b/public/dat.gui-master/src/dat/utils/common.js deleted file mode 100644 index 9ab4288c0..000000000 --- a/public/dat.gui-master/src/dat/utils/common.js +++ /dev/null @@ -1,157 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -const ARR_EACH = Array.prototype.forEach; -const ARR_SLICE = Array.prototype.slice; - -/** - * Band-aid methods for things that should be a lot easier in JavaScript. - * Implementation and structure inspired by underscore.js - * http://documentcloud.github.com/underscore/ - */ - -const Common = { - BREAK: {}, - - extend: function(target) { - this.each(ARR_SLICE.call(arguments, 1), function(obj) { - const keys = this.isObject(obj) ? Object.keys(obj) : []; - keys.forEach(function(key) { - if (!this.isUndefined(obj[key])) { - target[key] = obj[key]; - } - }.bind(this)); - }, this); - - return target; - }, - - defaults: function(target) { - this.each(ARR_SLICE.call(arguments, 1), function(obj) { - const keys = this.isObject(obj) ? Object.keys(obj) : []; - keys.forEach(function(key) { - if (this.isUndefined(target[key])) { - target[key] = obj[key]; - } - }.bind(this)); - }, this); - - return target; - }, - - compose: function() { - const toCall = ARR_SLICE.call(arguments); - return function() { - let args = ARR_SLICE.call(arguments); - for (let i = toCall.length - 1; i >= 0; i--) { - args = [toCall[i].apply(this, args)]; - } - return args[0]; - }; - }, - - each: function(obj, itr, scope) { - if (!obj) { - return; - } - - if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) { - obj.forEach(itr, scope); - } else if (obj.length === obj.length + 0) { // Is number but not NaN - let key; - let l; - for (key = 0, l = obj.length; key < l; key++) { - if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) { - return; - } - } - } else { - for (const key in obj) { - if (itr.call(scope, obj[key], key) === this.BREAK) { - return; - } - } - } - }, - - defer: function(fnc) { - setTimeout(fnc, 0); - }, - - // if the function is called repeatedly, wait until threshold passes until we execute the function - debounce: function(func, threshold, callImmediately) { - let timeout; - - return function() { - const obj = this; - const args = arguments; - function delayed() { - timeout = null; - if (!callImmediately) func.apply(obj, args); - } - - const callNow = callImmediately || !timeout; - - clearTimeout(timeout); - timeout = setTimeout(delayed, threshold); - - if (callNow) { - func.apply(obj, args); - } - }; - }, - - toArray: function(obj) { - if (obj.toArray) return obj.toArray(); - return ARR_SLICE.call(obj); - }, - - isUndefined: function(obj) { - return obj === undefined; - }, - - isNull: function(obj) { - return obj === null; - }, - - isNaN: function(obj) { - return isNaN(obj); - }, - - isArray: Array.isArray || function(obj) { - return obj.constructor === Array; - }, - - isObject: function(obj) { - return obj === Object(obj); - }, - - isNumber: function(obj) { - return obj === obj + 0; - }, - - isString: function(obj) { - return obj === obj + ''; - }, - - isBoolean: function(obj) { - return obj === false || obj === true; - }, - - isFunction: function(obj) { - return obj instanceof Function; - } - -}; - -export default Common; diff --git a/public/dat.gui-master/src/dat/utils/css.js b/public/dat.gui-master/src/dat/utils/css.js deleted file mode 100644 index fadc82de6..000000000 --- a/public/dat.gui-master/src/dat/utils/css.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -const css = { - load: function(url, indoc) { - const doc = indoc || document; - const link = doc.createElement('link'); - link.type = 'text/css'; - link.rel = 'stylesheet'; - link.href = url; - doc.getElementsByTagName('head')[0].appendChild(link); - }, - - inject: function(cssContent, indoc) { - const doc = indoc || document; - const injected = document.createElement('style'); - injected.type = 'text/css'; - injected.innerHTML = cssContent; - const head = doc.getElementsByTagName('head')[0]; - try { - head.appendChild(injected); - } catch (e) { // Unable to inject CSS, probably because of a Content Security Policy - } - } -}; - -export default css; diff --git a/public/dat.gui-master/src/dat/utils/requestAnimationFrame.js b/public/dat.gui-master/src/dat/utils/requestAnimationFrame.js deleted file mode 100644 index 9949e0774..000000000 --- a/public/dat.gui-master/src/dat/utils/requestAnimationFrame.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -function requestAnimationFrame(callback) { - setTimeout(callback, 1000 / 60); -} - -export default window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - window.msRequestAnimationFrame || - requestAnimationFrame; diff --git a/public/dat.gui-master/tests/index.html b/public/dat.gui-master/tests/index.html deleted file mode 100644 index 6b146c00a..000000000 --- a/public/dat.gui-master/tests/index.html +++ /dev/null @@ -1,1450 +0,0 @@ - - - - - - - - - - - - - -

      - -

      - -
      -

      -
        -
        test markup, will be hidden
        - - diff --git a/public/dat.gui-master/tests/jquery.js b/public/dat.gui-master/tests/jquery.js deleted file mode 100644 index 11e6d0679..000000000 --- a/public/dat.gui-master/tests/jquery.js +++ /dev/null @@ -1,9046 +0,0 @@ -/*! - * jQuery JavaScript Library v1.6.4 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Mon Sep 12 18:54:48 2011 -0400 - */ -(function( window, undefined ) { - -// Use the correct document accordingly with window argument (sandbox) -var document = window.document, - navigator = window.navigator, - location = window.location; -var jQuery = (function() { - -// Define a local copy of jQuery -var jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // A central reference to the root jQuery(document) - rootjQuery, - - // A simple way to check for HTML strings or ID strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, - - // Check if a string has a non-whitespace character in it - rnotwhite = /\S/, - - // Used for trimming whitespace - trimLeft = /^\s+/, - trimRight = /\s+$/, - - // Check for digits - rdigit = /\d/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, - rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - - // Useragent RegExp - rwebkit = /(webkit)[ \/]([\w.]+)/, - ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, - rmsie = /(msie) ([\w.]+)/, - rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, - - // Matches dashed string for camelizing - rdashAlpha = /-([a-z]|[0-9])/ig, - rmsPrefix = /^-ms-/, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return ( letter + "" ).toUpperCase(); - }, - - // Keep a UserAgent string for use with jQuery.browser - userAgent = navigator.userAgent, - - // For matching the engine and version of the browser - browserMatch, - - // The deferred used on DOM ready - readyList, - - // The ready event handler - DOMContentLoaded, - - // Save a reference to some core methods - toString = Object.prototype.toString, - hasOwn = Object.prototype.hasOwnProperty, - push = Array.prototype.push, - slice = Array.prototype.slice, - trim = String.prototype.trim, - indexOf = Array.prototype.indexOf, - - // [[Class]] -> type pairs - class2type = {}; - -jQuery.fn = jQuery.prototype = { - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem, ret, doc; - - // Handle $(""), $(null), or $(undefined) - if ( !selector ) { - return this; - } - - // Handle $(DOMElement) - if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - } - - // The body element only exists once, optimize finding it - if ( selector === "body" && !context && document.body ) { - this.context = document; - this[0] = document.body; - this.selector = selector; - this.length = 1; - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - // Are we dealing with HTML string or an ID? - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = quickExpr.exec( selector ); - } - - // Verify a match, and that no context was specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - doc = (context ? context.ownerDocument || context : document); - - // If a single string is passed in and it's a single tag - // just do a createElement and skip the rest - ret = rsingleTag.exec( selector ); - - if ( ret ) { - if ( jQuery.isPlainObject( context ) ) { - selector = [ document.createElement( ret[1] ) ]; - jQuery.fn.attr.call( selector, context, true ); - - } else { - selector = [ doc.createElement( ret[1] ) ]; - } - - } else { - ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); - selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; - } - - return jQuery.merge( this, selector ); - - // HANDLE: $("#id") - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return (context || rootjQuery).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if (selector.selector !== undefined) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The current version of jQuery being used - jquery: "1.6.4", - - // The default length of a jQuery object is 0 - length: 0, - - // The number of elements contained in the matched element set - size: function() { - return this.length; - }, - - toArray: function() { - return slice.call( this, 0 ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems, name, selector ) { - // Build a new jQuery matched element set - var ret = this.constructor(); - - if ( jQuery.isArray( elems ) ) { - push.apply( ret, elems ); - - } else { - jQuery.merge( ret, elems ); - } - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - ret.context = this.context; - - if ( name === "find" ) { - ret.selector = this.selector + (this.selector ? " " : "") + selector; - } else if ( name ) { - ret.selector = this.selector + "." + name + "(" + selector + ")"; - } - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Attach the listeners - jQuery.bindReady(); - - // Add the callback - readyList.done( fn ); - - return this; - }, - - eq: function( i ) { - return i === -1 ? - this.slice( i ) : - this.slice( i, +i + 1 ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ), - "slice", slice.call(arguments).join(",") ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: [].sort, - splice: [].splice -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - // Either a released hold or an DOMready/load event and not yet ready - if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready, 1 ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger( "ready" ).unbind( "ready" ); - } - } - }, - - bindReady: function() { - if ( readyList ) { - return; - } - - readyList = jQuery._Deferred(); - - // Catch cases where $(document).ready() is called after the - // browser event has already occurred. - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - return setTimeout( jQuery.ready, 1 ); - } - - // Mozilla, Opera and webkit nightlies currently support this event - if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", jQuery.ready, false ); - - // If IE event model is used - } else if ( document.attachEvent ) { - // ensure firing before onload, - // maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", DOMContentLoaded ); - - // A fallback to window.onload, that will always work - window.attachEvent( "onload", jQuery.ready ); - - // If IE and not a frame - // continually check to see if the document is ready - var toplevel = false; - - try { - toplevel = window.frameElement == null; - } catch(e) {} - - if ( document.documentElement.doScroll && toplevel ) { - doScrollCheck(); - } - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - // A crude way of determining if an object is a window - isWindow: function( obj ) { - return obj && typeof obj === "object" && "setInterval" in obj; - }, - - isNaN: function( obj ) { - return obj == null || !rdigit.test( obj ) || isNaN( obj ); - }, - - type: function( obj ) { - return obj == null ? - String( obj ) : - class2type[ toString.call(obj) ] || "object"; - }, - - isPlainObject: function( obj ) { - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - try { - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call(obj, "constructor") && - !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - } catch ( e ) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - - var key; - for ( key in obj ) {} - - return key === undefined || hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - for ( var name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw msg; - }, - - parseJSON: function( data ) { - if ( typeof data !== "string" || !data ) { - return null; - } - - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim( data ); - - // Attempt to parse using the native JSON parser first - if ( window.JSON && window.JSON.parse ) { - return window.JSON.parse( data ); - } - - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if ( rvalidchars.test( data.replace( rvalidescape, "@" ) - .replace( rvalidtokens, "]" ) - .replace( rvalidbraces, "")) ) { - - return (new Function( "return " + data ))(); - - } - jQuery.error( "Invalid JSON: " + data ); - }, - - // Cross-browser xml parsing - parseXML: function( data ) { - var xml, tmp; - try { - if ( window.DOMParser ) { // Standard - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } else { // IE - xml = new ActiveXObject( "Microsoft.XMLDOM" ); - xml.async = "false"; - xml.loadXML( data ); - } - } catch( e ) { - xml = undefined; - } - if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && rnotwhite.test( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); - }, - - // args is for internal usage only - each: function( object, callback, args ) { - var name, i = 0, - length = object.length, - isObj = length === undefined || jQuery.isFunction( object ); - - if ( args ) { - if ( isObj ) { - for ( name in object ) { - if ( callback.apply( object[ name ], args ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.apply( object[ i++ ], args ) === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isObj ) { - for ( name in object ) { - if ( callback.call( object[ name ], name, object[ name ] ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { - break; - } - } - } - } - - return object; - }, - - // Use native String.trim function wherever possible - trim: trim ? - function( text ) { - return text == null ? - "" : - trim.call( text ); - } : - - // Otherwise use our own trimming functionality - function( text ) { - return text == null ? - "" : - text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); - }, - - // results is for internal usage only - makeArray: function( array, results ) { - var ret = results || []; - - if ( array != null ) { - // The window, strings (and functions) also have 'length' - // The extra typeof function check is to prevent crashes - // in Safari 2 (See: #3039) - // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 - var type = jQuery.type( array ); - - if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { - push.call( ret, array ); - } else { - jQuery.merge( ret, array ); - } - } - - return ret; - }, - - inArray: function( elem, array ) { - if ( !array ) { - return -1; - } - - if ( indexOf ) { - return indexOf.call( array, elem ); - } - - for ( var i = 0, length = array.length; i < length; i++ ) { - if ( array[ i ] === elem ) { - return i; - } - } - - return -1; - }, - - merge: function( first, second ) { - var i = first.length, - j = 0; - - if ( typeof second.length === "number" ) { - for ( var l = second.length; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var ret = [], retVal; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( var i = 0, length = elems.length; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, key, ret = [], - i = 0, - length = elems.length, - // jquery objects are treated as arrays - isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; - - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Go through every key on the object, - } else { - for ( key in elems ) { - value = callback( elems[ key ], key, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } - - // Flatten any nested arrays - return ret.concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - if ( typeof context === "string" ) { - var tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - var args = slice.call( arguments, 2 ), - proxy = function() { - return fn.apply( context, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; - - return proxy; - }, - - // Mutifunctional method to get and set values to a collection - // The value/s can optionally be executed if it's a function - access: function( elems, key, value, exec, fn, pass ) { - var length = elems.length; - - // Setting many attributes - if ( typeof key === "object" ) { - for ( var k in key ) { - jQuery.access( elems, k, key[k], exec, fn, value ); - } - return elems; - } - - // Setting one attribute - if ( value !== undefined ) { - // Optionally, function values get executed if exec is true - exec = !pass && exec && jQuery.isFunction(value); - - for ( var i = 0; i < length; i++ ) { - fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); - } - - return elems; - } - - // Getting an attribute - return length ? fn( elems[0], key ) : undefined; - }, - - now: function() { - return (new Date()).getTime(); - }, - - // Use of jQuery.browser is frowned upon. - // More details: http://docs.jquery.com/Utilities/jQuery.browser - uaMatch: function( ua ) { - ua = ua.toLowerCase(); - - var match = rwebkit.exec( ua ) || - ropera.exec( ua ) || - rmsie.exec( ua ) || - ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || - []; - - return { browser: match[1] || "", version: match[2] || "0" }; - }, - - sub: function() { - function jQuerySub( selector, context ) { - return new jQuerySub.fn.init( selector, context ); - } - jQuery.extend( true, jQuerySub, this ); - jQuerySub.superclass = this; - jQuerySub.fn = jQuerySub.prototype = this(); - jQuerySub.fn.constructor = jQuerySub; - jQuerySub.sub = this.sub; - jQuerySub.fn.init = function init( selector, context ) { - if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { - context = jQuerySub( context ); - } - - return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); - }; - jQuerySub.fn.init.prototype = jQuerySub.fn; - var rootjQuerySub = jQuerySub(document); - return jQuerySub; - }, - - browser: {} -}); - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -browserMatch = jQuery.uaMatch( userAgent ); -if ( browserMatch.browser ) { - jQuery.browser[ browserMatch.browser ] = true; - jQuery.browser.version = browserMatch.version; -} - -// Deprecated, use jQuery.browser.webkit instead -if ( jQuery.browser.webkit ) { - jQuery.browser.safari = true; -} - -// IE doesn't match non-breaking spaces with \s -if ( rnotwhite.test( "\xA0" ) ) { - trimLeft = /^[\s\xA0]+/; - trimRight = /[\s\xA0]+$/; -} - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); - -// Cleanup functions for the document ready method -if ( document.addEventListener ) { - DOMContentLoaded = function() { - document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - jQuery.ready(); - }; - -} else if ( document.attachEvent ) { - DOMContentLoaded = function() { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( document.readyState === "complete" ) { - document.detachEvent( "onreadystatechange", DOMContentLoaded ); - jQuery.ready(); - } - }; -} - -// The DOM ready check for Internet Explorer -function doScrollCheck() { - if ( jQuery.isReady ) { - return; - } - - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch(e) { - setTimeout( doScrollCheck, 1 ); - return; - } - - // and execute any waiting functions - jQuery.ready(); -} - -return jQuery; - -})(); - - -var // Promise methods - promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ), - // Static reference to slice - sliceDeferred = [].slice; - -jQuery.extend({ - // Create a simple deferred (one callbacks list) - _Deferred: function() { - var // callbacks list - callbacks = [], - // stored [ context , args ] - fired, - // to avoid firing when already doing so - firing, - // flag to know if the deferred has been cancelled - cancelled, - // the deferred itself - deferred = { - - // done( f1, f2, ...) - done: function() { - if ( !cancelled ) { - var args = arguments, - i, - length, - elem, - type, - _fired; - if ( fired ) { - _fired = fired; - fired = 0; - } - for ( i = 0, length = args.length; i < length; i++ ) { - elem = args[ i ]; - type = jQuery.type( elem ); - if ( type === "array" ) { - deferred.done.apply( deferred, elem ); - } else if ( type === "function" ) { - callbacks.push( elem ); - } - } - if ( _fired ) { - deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); - } - } - return this; - }, - - // resolve with given context and args - resolveWith: function( context, args ) { - if ( !cancelled && !fired && !firing ) { - // make sure args are available (#8421) - args = args || []; - firing = 1; - try { - while( callbacks[ 0 ] ) { - callbacks.shift().apply( context, args ); - } - } - finally { - fired = [ context, args ]; - firing = 0; - } - } - return this; - }, - - // resolve with this as context and given arguments - resolve: function() { - deferred.resolveWith( this, arguments ); - return this; - }, - - // Has this deferred been resolved? - isResolved: function() { - return !!( firing || fired ); - }, - - // Cancel - cancel: function() { - cancelled = 1; - callbacks = []; - return this; - } - }; - - return deferred; - }, - - // Full fledged deferred (two callbacks list) - Deferred: function( func ) { - var deferred = jQuery._Deferred(), - failDeferred = jQuery._Deferred(), - promise; - // Add errorDeferred methods, then and promise - jQuery.extend( deferred, { - then: function( doneCallbacks, failCallbacks ) { - deferred.done( doneCallbacks ).fail( failCallbacks ); - return this; - }, - always: function() { - return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments ); - }, - fail: failDeferred.done, - rejectWith: failDeferred.resolveWith, - reject: failDeferred.resolve, - isRejected: failDeferred.isResolved, - pipe: function( fnDone, fnFail ) { - return jQuery.Deferred(function( newDefer ) { - jQuery.each( { - done: [ fnDone, "resolve" ], - fail: [ fnFail, "reject" ] - }, function( handler, data ) { - var fn = data[ 0 ], - action = data[ 1 ], - returned; - if ( jQuery.isFunction( fn ) ) { - deferred[ handler ](function() { - returned = fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise().then( newDefer.resolve, newDefer.reject ); - } else { - newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); - } - }); - } else { - deferred[ handler ]( newDefer[ action ] ); - } - }); - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - if ( obj == null ) { - if ( promise ) { - return promise; - } - promise = obj = {}; - } - var i = promiseMethods.length; - while( i-- ) { - obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; - } - return obj; - } - }); - // Make sure only one callback list will be used - deferred.done( failDeferred.cancel ).fail( deferred.cancel ); - // Unexpose cancel - delete deferred.cancel; - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - return deferred; - }, - - // Deferred helper - when: function( firstParam ) { - var args = arguments, - i = 0, - length = args.length, - count = length, - deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? - firstParam : - jQuery.Deferred(); - function resolveFunc( i ) { - return function( value ) { - args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; - if ( !( --count ) ) { - // Strange bug in FF4: - // Values changed onto the arguments object sometimes end up as undefined values - // outside the $.when method. Cloning the object into a fresh array solves the issue - deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) ); - } - }; - } - if ( length > 1 ) { - for( ; i < length; i++ ) { - if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) { - args[ i ].promise().then( resolveFunc(i), deferred.reject ); - } else { - --count; - } - } - if ( !count ) { - deferred.resolveWith( deferred, args ); - } - } else if ( deferred !== firstParam ) { - deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); - } - return deferred.promise(); - } -}); - - - -jQuery.support = (function() { - - var div = document.createElement( "div" ), - documentElement = document.documentElement, - all, - a, - select, - opt, - input, - marginDiv, - support, - fragment, - body, - testElementParent, - testElement, - testElementStyle, - tds, - events, - eventName, - i, - isSupported; - - // Preliminary tests - div.setAttribute("className", "t"); - div.innerHTML = "
        a"; - - - all = div.getElementsByTagName( "*" ); - a = div.getElementsByTagName( "a" )[ 0 ]; - - // Can't get basic test support - if ( !all || !all.length || !a ) { - return {}; - } - - // First batch of supports tests - select = document.createElement( "select" ); - opt = select.appendChild( document.createElement("option") ); - input = div.getElementsByTagName( "input" )[ 0 ]; - - support = { - // IE strips leading whitespace when .innerHTML is used - leadingWhitespace: ( div.firstChild.nodeType === 3 ), - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - tbody: !div.getElementsByTagName( "tbody" ).length, - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - htmlSerialize: !!div.getElementsByTagName( "link" ).length, - - // Get the style information from getAttribute - // (IE uses .cssText instead) - style: /top/.test( a.getAttribute("style") ), - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - hrefNormalized: ( a.getAttribute( "href" ) === "/a" ), - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - opacity: /^0.55$/.test( a.style.opacity ), - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - cssFloat: !!a.style.cssFloat, - - // Make sure that if no value is specified for a checkbox - // that it defaults to "on". - // (WebKit defaults to "" instead) - checkOn: ( input.value === "on" ), - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - optSelected: opt.selected, - - // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) - getSetAttribute: div.className !== "t", - - // Will be defined later - submitBubbles: true, - changeBubbles: true, - focusinBubbles: false, - deleteExpando: true, - noCloneEvent: true, - inlineBlockNeedsLayout: false, - shrinkWrapBlocks: false, - reliableMarginRight: true - }; - - // Make sure checked status is properly cloned - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Test to see if it's possible to delete an expando from an element - // Fails in Internet Explorer - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - - if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { - div.attachEvent( "onclick", function() { - // Cloning a node shouldn't copy over any - // bound event handlers (IE does this) - support.noCloneEvent = false; - }); - div.cloneNode( true ).fireEvent( "onclick" ); - } - - // Check if a radio maintains it's value - // after being appended to the DOM - input = document.createElement("input"); - input.value = "t"; - input.setAttribute("type", "radio"); - support.radioValue = input.value === "t"; - - input.setAttribute("checked", "checked"); - div.appendChild( input ); - fragment = document.createDocumentFragment(); - fragment.appendChild( div.firstChild ); - - // WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - div.innerHTML = ""; - - // Figure out if the W3C box model works as expected - div.style.width = div.style.paddingLeft = "1px"; - - body = document.getElementsByTagName( "body" )[ 0 ]; - // We use our own, invisible, body unless the body is already present - // in which case we use a div (#9239) - testElement = document.createElement( body ? "div" : "body" ); - testElementStyle = { - visibility: "hidden", - width: 0, - height: 0, - border: 0, - margin: 0, - background: "none" - }; - if ( body ) { - jQuery.extend( testElementStyle, { - position: "absolute", - left: "-1000px", - top: "-1000px" - }); - } - for ( i in testElementStyle ) { - testElement.style[ i ] = testElementStyle[ i ]; - } - testElement.appendChild( div ); - testElementParent = body || documentElement; - testElementParent.insertBefore( testElement, testElementParent.firstChild ); - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - support.appendChecked = input.checked; - - support.boxModel = div.offsetWidth === 2; - - if ( "zoom" in div.style ) { - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - // (IE < 8 does this) - div.style.display = "inline"; - div.style.zoom = 1; - support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); - - // Check if elements with layout shrink-wrap their children - // (IE 6 does this) - div.style.display = ""; - div.innerHTML = "
        "; - support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); - } - - div.innerHTML = "
        t
        "; - tds = div.getElementsByTagName( "td" ); - - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - // (only IE 8 fails this test) - isSupported = ( tds[ 0 ].offsetHeight === 0 ); - - tds[ 0 ].style.display = ""; - tds[ 1 ].style.display = "none"; - - // Check if empty table cells still have offsetWidth/Height - // (IE < 8 fail this test) - support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); - div.innerHTML = ""; - - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. For more - // info see bug #3333 - // Fails in WebKit before Feb 2011 nightlies - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - if ( document.defaultView && document.defaultView.getComputedStyle ) { - marginDiv = document.createElement( "div" ); - marginDiv.style.width = "0"; - marginDiv.style.marginRight = "0"; - div.appendChild( marginDiv ); - support.reliableMarginRight = - ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; - } - - // Remove the body element we added - testElement.innerHTML = ""; - testElementParent.removeChild( testElement ); - - // Technique from Juriy Zaytsev - // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ - // We only care about the case where non-standard event systems - // are used, namely in IE. Short-circuiting here helps us to - // avoid an eval call (in setAttribute) which can cause CSP - // to go haywire. See: https://developer.mozilla.org/en/Security/CSP - if ( div.attachEvent ) { - for( i in { - submit: 1, - change: 1, - focusin: 1 - } ) { - eventName = "on" + i; - isSupported = ( eventName in div ); - if ( !isSupported ) { - div.setAttribute( eventName, "return;" ); - isSupported = ( typeof div[ eventName ] === "function" ); - } - support[ i + "Bubbles" ] = isSupported; - } - } - - // Null connected elements to avoid leaks in IE - testElement = fragment = select = opt = body = marginDiv = div = input = null; - - return support; -})(); - -// Keep track of boxModel -jQuery.boxModel = jQuery.support.boxModel; - - - - -var rbrace = /^(?:\{.*\}|\[.*\])$/, - rmultiDash = /([A-Z])/g; - -jQuery.extend({ - cache: {}, - - // Please use with caution - uuid: 0, - - // Unique for each copy of jQuery on the page - // Non-digits removed to match rinlinejQuery - expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), - - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", - "applet": true - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, ret, - internalKey = jQuery.expando, - getByName = typeof name === "string", - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || (pvt && id && (cache[ id ] && !cache[ id ][ internalKey ]))) && getByName && data === undefined ) { - return; - } - - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - elem[ jQuery.expando ] = id = ++jQuery.uuid; - } else { - id = jQuery.expando; - } - } - - if ( !cache[ id ] ) { - cache[ id ] = {}; - - // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery - // metadata on plain JS objects when the object is serialized using - // JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); - } else { - cache[ id ] = jQuery.extend(cache[ id ], name); - } - } - - thisCache = cache[ id ]; - - // Internal jQuery data is stored in a separate object inside the object's data - // cache in order to avoid key collisions between internal data and user-defined - // data - if ( pvt ) { - if ( !thisCache[ internalKey ] ) { - thisCache[ internalKey ] = {}; - } - - thisCache = thisCache[ internalKey ]; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should - // not attempt to inspect the internal events object using jQuery.data, as this - // internal data object is undocumented and subject to change. - if ( name === "events" && !thisCache[name] ) { - return thisCache[ internalKey ] && thisCache[ internalKey ].events; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( getByName ) { - - // First Try to find as-is property data - ret = thisCache[ name ]; - - // Test for null|undefined property data - if ( ret == null ) { - - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; - } - } else { - ret = thisCache; - } - - return ret; - }, - - removeData: function( elem, name, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, - - // Reference to internal data cache key - internalKey = jQuery.expando, - - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - - // See jQuery.data for more information - id = isNode ? elem[ jQuery.expando ] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - - thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; - - if ( thisCache ) { - - // Support interoperable removal of hyphenated or camelcased keys - if ( !thisCache[ name ] ) { - name = jQuery.camelCase( name ); - } - - delete thisCache[ name ]; - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( !isEmptyDataObject(thisCache) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( pvt ) { - delete cache[ id ][ internalKey ]; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject(cache[ id ]) ) { - return; - } - } - - var internalCache = cache[ id ][ internalKey ]; - - // Browsers that fail expando deletion also refuse to delete expandos on - // the window, but it will allow it on all other JS objects; other browsers - // don't care - // Ensure that `cache` is not a window object #10080 - if ( jQuery.support.deleteExpando || !cache.setInterval ) { - delete cache[ id ]; - } else { - cache[ id ] = null; - } - - // We destroyed the entire user cache at once because it's faster than - // iterating through each key, but we need to continue to persist internal - // data if it existed - if ( internalCache ) { - cache[ id ] = {}; - // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery - // metadata on plain JS objects when the object is serialized using - // JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - - cache[ id ][ internalKey ] = internalCache; - - // Otherwise, we need to eliminate the expando on the node to avoid - // false lookups in the cache for entries that no longer exist - } else if ( isNode ) { - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( jQuery.support.deleteExpando ) { - delete elem[ jQuery.expando ]; - } else if ( elem.removeAttribute ) { - elem.removeAttribute( jQuery.expando ); - } else { - elem[ jQuery.expando ] = null; - } - } - }, - - // For internal use only. - _data: function( elem, name, data ) { - return jQuery.data( elem, name, data, true ); - }, - - // A method for determining if a DOM node can handle the data expando - acceptData: function( elem ) { - if ( elem.nodeName ) { - var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; - - if ( match ) { - return !(match === true || elem.getAttribute("classid") !== match); - } - } - - return true; - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var data = null; - - if ( typeof key === "undefined" ) { - if ( this.length ) { - data = jQuery.data( this[0] ); - - if ( this[0].nodeType === 1 ) { - var attr = this[0].attributes, name; - for ( var i = 0, l = attr.length; i < l; i++ ) { - name = attr[i].name; - - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.substring(5) ); - - dataAttr( this[0], name, data[ name ] ); - } - } - } - } - - return data; - - } else if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } - - var parts = key.split("."); - parts[1] = parts[1] ? "." + parts[1] : ""; - - if ( value === undefined ) { - data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); - - // Try to fetch any internally stored data first - if ( data === undefined && this.length ) { - data = jQuery.data( this[0], key ); - data = dataAttr( this[0], key, data ); - } - - return data === undefined && parts[1] ? - this.data( parts[0] ) : - data; - - } else { - return this.each(function() { - var $this = jQuery( this ), - args = [ parts[0], value ]; - - $this.triggerHandler( "setData" + parts[1] + "!", args ); - jQuery.data( this, key, value ); - $this.triggerHandler( "changeData" + parts[1] + "!", args ); - }); - } - }, - - removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); - } -}); - -function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - !jQuery.isNaN( data ) ? parseFloat( data ) : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - - } else { - data = undefined; - } - } - - return data; -} - -// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON -// property to be considered empty objects; this property always exists in -// order to make sure JSON.stringify does not expose internal metadata -function isEmptyDataObject( obj ) { - for ( var name in obj ) { - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} - - - - -function handleQueueMarkDefer( elem, type, src ) { - var deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - defer = jQuery.data( elem, deferDataKey, undefined, true ); - if ( defer && - ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) && - ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) { - // Give room for hard-coded callbacks to fire first - // and eventually mark/queue something else on the element - setTimeout( function() { - if ( !jQuery.data( elem, queueDataKey, undefined, true ) && - !jQuery.data( elem, markDataKey, undefined, true ) ) { - jQuery.removeData( elem, deferDataKey, true ); - defer.resolve(); - } - }, 0 ); - } -} - -jQuery.extend({ - - _mark: function( elem, type ) { - if ( elem ) { - type = (type || "fx") + "mark"; - jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true ); - } - }, - - _unmark: function( force, elem, type ) { - if ( force !== true ) { - type = elem; - elem = force; - force = false; - } - if ( elem ) { - type = type || "fx"; - var key = type + "mark", - count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 ); - if ( count ) { - jQuery.data( elem, key, count, true ); - } else { - jQuery.removeData( elem, key, true ); - handleQueueMarkDefer( elem, type, "mark" ); - } - } - }, - - queue: function( elem, type, data ) { - if ( elem ) { - type = (type || "fx") + "queue"; - var q = jQuery.data( elem, type, undefined, true ); - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !q || jQuery.isArray(data) ) { - q = jQuery.data( elem, type, jQuery.makeArray(data), true ); - } else { - q.push( data ); - } - } - return q || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - fn = queue.shift(), - defer; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - } - - if ( fn ) { - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift("inprogress"); - } - - fn.call(elem, function() { - jQuery.dequeue(elem, type); - }); - } - - if ( !queue.length ) { - jQuery.removeData( elem, type + "queue", true ); - handleQueueMarkDefer( elem, type, "queue" ); - } - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - } - - if ( data === undefined ) { - return jQuery.queue( this[0], type ); - } - return this.each(function() { - var queue = jQuery.queue( this, type, data ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; - type = type || "fx"; - - return this.queue( type, function() { - var elem = this; - setTimeout(function() { - jQuery.dequeue( elem, type ); - }, time ); - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, object ) { - if ( typeof type !== "string" ) { - object = type; - type = undefined; - } - type = type || "fx"; - var defer = jQuery.Deferred(), - elements = this, - i = elements.length, - count = 1, - deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - tmp; - function resolve() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - } - while( i-- ) { - if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || - ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || - jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && - jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) { - count++; - tmp.done( resolve ); - } - } - resolve(); - return defer.promise(); - } -}); - - - - -var rclass = /[\n\t\r]/g, - rspace = /\s+/, - rreturn = /\r/g, - rtype = /^(?:button|input)$/i, - rfocusable = /^(?:button|input|object|select|textarea)$/i, - rclickable = /^a(?:rea)?$/i, - rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, - nodeHook, boolHook; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.attr ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.prop ); - }, - - removeProp: function( name ) { - name = jQuery.propFix[ name ] || name; - return this.each(function() { - // try/catch handles cases where IE balks (such as removing a property on window) - try { - this[ name ] = undefined; - delete this[ name ]; - } catch( e ) {} - }); - }, - - addClass: function( value ) { - var classNames, i, l, elem, - setClass, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call(this, j, this.className) ); - }); - } - - if ( value && typeof value === "string" ) { - classNames = value.split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 ) { - if ( !elem.className && classNames.length === 1 ) { - elem.className = value; - - } else { - setClass = " " + elem.className + " "; - - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { - setClass += classNames[ c ] + " "; - } - } - elem.className = jQuery.trim( setClass ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classNames, i, l, elem, className, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call(this, j, this.className) ); - }); - } - - if ( (value && typeof value === "string") || value === undefined ) { - classNames = (value || "").split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 && elem.className ) { - if ( value ) { - className = (" " + elem.className + " ").replace( rclass, " " ); - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - className = className.replace(" " + classNames[ c ] + " ", " "); - } - elem.className = jQuery.trim( className ); - - } else { - elem.className = ""; - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isBool = typeof stateVal === "boolean"; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - state = stateVal, - classNames = value.split( rspace ); - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space seperated list - state = isBool ? state : !self.hasClass( className ); - self[ state ? "addClass" : "removeClass" ]( className ); - } - - } else if ( type === "undefined" || type === "boolean" ) { - if ( this.className ) { - // store className if set - jQuery._data( this, "__className__", this.className ); - } - - // toggle whole className - this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " "; - for ( var i = 0, l = this.length; i < l; i++ ) { - if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var hooks, ret, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; - - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return undefined; - } - - var isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var self = jQuery(this), val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, self.val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } -}); - -jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // attributes.value is undefined in Blackberry 4.7 but - // uses .value. See #6932 - var val = elem.attributes.value; - return !val || val.specified ? elem.value : elem.text; - } - }, - select: { - get: function( elem ) { - var value, - index = elem.selectedIndex, - values = [], - options = elem.options, - one = elem.type === "select-one"; - - // Nothing was selected - if ( index < 0 ) { - return null; - } - - // Loop through all the selected options - for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { - var option = options[ i ]; - - // Don't return options that are disabled or in a disabled optgroup - if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && - (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - // Fixes Bug #2551 -- select.val() broken in IE after form.reset() - if ( one && !values.length && options.length ) { - return jQuery( options[ index ] ).val(); - } - - return values; - }, - - set: function( elem, value ) { - var values = jQuery.makeArray( value ); - - jQuery(elem).find("option").each(function() { - this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; - }); - - if ( !values.length ) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - attrFn: { - val: true, - css: true, - html: true, - text: true, - data: true, - width: true, - height: true, - offset: true - }, - - attrFix: { - // Always normalize to ensure hook usage - tabindex: "tabIndex" - }, - - attr: function( elem, name, value, pass ) { - var nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return undefined; - } - - if ( pass && name in jQuery.attrFn ) { - return jQuery( elem )[ name ]( value ); - } - - // Fallback to prop when attributes are not supported - if ( !("getAttribute" in elem) ) { - return jQuery.prop( elem, name, value ); - } - - var ret, hooks, - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - // Normalize the name if needed - if ( notxml ) { - name = jQuery.attrFix[ name ] || name; - - hooks = jQuery.attrHooks[ name ]; - - if ( !hooks ) { - // Use boolHook for boolean attributes - if ( rboolean.test( name ) ) { - hooks = boolHook; - - // Use nodeHook if available( IE6/7 ) - } else if ( nodeHook ) { - hooks = nodeHook; - } - } - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return undefined; - - } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, "" + value ); - return value; - } - - } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - - ret = elem.getAttribute( name ); - - // Non-existent attributes return null, we normalize to undefined - return ret === null ? - undefined : - ret; - } - }, - - removeAttr: function( elem, name ) { - var propName; - if ( elem.nodeType === 1 ) { - name = jQuery.attrFix[ name ] || name; - - jQuery.attr( elem, name, "" ); - elem.removeAttribute( name ); - - // Set corresponding property to false for boolean attributes - if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) { - elem[ propName ] = false; - } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - // We can't allow the type property to be changed (since it causes problems in IE) - if ( rtype.test( elem.nodeName ) && elem.parentNode ) { - jQuery.error( "type property can't be changed" ); - } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to it's default in case type is set after value - // This is for element creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - }, - // Use the value property for back compat - // Use the nodeHook for button elements in IE6/7 (#1954) - value: { - get: function( elem, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.get( elem, name ); - } - return name in elem ? - elem.value : - null; - }, - set: function( elem, value, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.set( elem, value, name ); - } - // Does not return so that setAttribute is also used - elem.value = value; - } - } - }, - - propFix: { - tabindex: "tabIndex", - readonly: "readOnly", - "for": "htmlFor", - "class": "className", - maxlength: "maxLength", - cellspacing: "cellSpacing", - cellpadding: "cellPadding", - rowspan: "rowSpan", - colspan: "colSpan", - usemap: "useMap", - frameborder: "frameBorder", - contenteditable: "contentEditable" - }, - - prop: function( elem, name, value ) { - var nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return undefined; - } - - var ret, hooks, - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - return (elem[ name ] = value); - } - - } else { - if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - return elem[ name ]; - } - } - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - var attributeNode = elem.getAttributeNode("tabindex"); - - return attributeNode && attributeNode.specified ? - parseInt( attributeNode.value, 10 ) : - rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? - 0 : - undefined; - } - } - } -}); - -// Add the tabindex propHook to attrHooks for back-compat -jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex; - -// Hook for boolean attributes -boolHook = { - get: function( elem, name ) { - // Align boolean attributes with corresponding properties - // Fall back to attribute presence where some booleans are not supported - var attrNode; - return jQuery.prop( elem, name ) === true || ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ? - name.toLowerCase() : - undefined; - }, - set: function( elem, value, name ) { - var propName; - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - // value is true since we know at this point it's type boolean and not false - // Set boolean attributes to the same name and set the DOM property - propName = jQuery.propFix[ name ] || name; - if ( propName in elem ) { - // Only set the IDL specifically if it already exists on the element - elem[ propName ] = true; - } - - elem.setAttribute( name, name.toLowerCase() ); - } - return name; - } -}; - -// IE6/7 do not support getting/setting some attributes with get/setAttribute -if ( !jQuery.support.getSetAttribute ) { - - // Use this for any attribute in IE6/7 - // This fixes almost every IE6/7 issue - nodeHook = jQuery.valHooks.button = { - get: function( elem, name ) { - var ret; - ret = elem.getAttributeNode( name ); - // Return undefined if nodeValue is empty string - return ret && ret.nodeValue !== "" ? - ret.nodeValue : - undefined; - }, - set: function( elem, value, name ) { - // Set the existing or create a new attribute node - var ret = elem.getAttributeNode( name ); - if ( !ret ) { - ret = document.createAttribute( name ); - elem.setAttributeNode( ret ); - } - return (ret.nodeValue = value + ""); - } - }; - - // Set width and height to auto instead of 0 on empty string( Bug #8150 ) - // This is for removals - jQuery.each([ "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - set: function( elem, value ) { - if ( value === "" ) { - elem.setAttribute( name, "auto" ); - return value; - } - } - }); - }); -} - - -// Some attributes require a special call on IE -if ( !jQuery.support.hrefNormalized ) { - jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - get: function( elem ) { - var ret = elem.getAttribute( name, 2 ); - return ret === null ? undefined : ret; - } - }); - }); -} - -if ( !jQuery.support.style ) { - jQuery.attrHooks.style = { - get: function( elem ) { - // Return undefined in the case of empty string - // Normalize to lowercase since IE uppercases css property names - return elem.style.cssText.toLowerCase() || undefined; - }, - set: function( elem, value ) { - return (elem.style.cssText = "" + value); - } - }; -} - -// Safari mis-reports the default selected property of an option -// Accessing the parent's selectedIndex property fixes it -if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { - get: function( elem ) { - var parent = elem.parentNode; - - if ( parent ) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - return null; - } - }); -} - -// Radios and checkboxes getter/setter -if ( !jQuery.support.checkOn ) { - jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - get: function( elem ) { - // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - } - }; - }); -} -jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0); - } - } - }); -}); - - - - -var rnamespaces = /\.(.*)$/, - rformElems = /^(?:textarea|input|select)$/i, - rperiod = /\./g, - rspaces = / /g, - rescape = /[^\w\s.|`]/g, - fcleanup = function( nm ) { - return nm.replace(rescape, "\\$&"); - }; - -/* - * A number of helper functions used for managing events. - * Many of the ideas behind this code originated from - * Dean Edwards' addEvent library. - */ -jQuery.event = { - - // Bind an event to an element - // Original by Dean Edwards - add: function( elem, types, handler, data ) { - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - if ( handler === false ) { - handler = returnFalse; - } else if ( !handler ) { - // Fixes bug #7229. Fix recommended by jdalton - return; - } - - var handleObjIn, handleObj; - - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - } - - // Make sure that the function being executed has a unique ID - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure - var elemData = jQuery._data( elem ); - - // If no elemData is found then we must be trying to bind to one of the - // banned noData elements - if ( !elemData ) { - return; - } - - var events = elemData.events, - eventHandle = elemData.handle; - - if ( !events ) { - elemData.events = events = {}; - } - - if ( !eventHandle ) { - elemData.handle = eventHandle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.handle.apply( eventHandle.elem, arguments ) : - undefined; - }; - } - - // Add elem as a property of the handle function - // This is to prevent a memory leak with non-native events in IE. - eventHandle.elem = elem; - - // Handle multiple events separated by a space - // jQuery(...).bind("mouseover mouseout", fn); - types = types.split(" "); - - var type, i = 0, namespaces; - - while ( (type = types[ i++ ]) ) { - handleObj = handleObjIn ? - jQuery.extend({}, handleObjIn) : - { handler: handler, data: data }; - - // Namespaced event handlers - if ( type.indexOf(".") > -1 ) { - namespaces = type.split("."); - type = namespaces.shift(); - handleObj.namespace = namespaces.slice(0).sort().join("."); - - } else { - namespaces = []; - handleObj.namespace = ""; - } - - handleObj.type = type; - if ( !handleObj.guid ) { - handleObj.guid = handler.guid; - } - - // Get the current list of functions bound to this event - var handlers = events[ type ], - special = jQuery.event.special[ type ] || {}; - - // Init the event handler queue - if ( !handlers ) { - handlers = events[ type ] = []; - - // Check for a special event handler - // Only use addEventListener/attachEvent if the special - // events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add the function to the element's handler list - handlers.push( handleObj ); - - // Keep track of which events have been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - global: {}, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, pos ) { - // don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - if ( handler === false ) { - handler = returnFalse; - } - - var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, - elemData = jQuery.hasData( elem ) && jQuery._data( elem ), - events = elemData && elemData.events; - - if ( !elemData || !events ) { - return; - } - - // types is actually an event object here - if ( types && types.type ) { - handler = types.handler; - types = types.type; - } - - // Unbind all events for the element - if ( !types || typeof types === "string" && types.charAt(0) === "." ) { - types = types || ""; - - for ( type in events ) { - jQuery.event.remove( elem, type + types ); - } - - return; - } - - // Handle multiple events separated by a space - // jQuery(...).unbind("mouseover mouseout", fn); - types = types.split(" "); - - while ( (type = types[ i++ ]) ) { - origType = type; - handleObj = null; - all = type.indexOf(".") < 0; - namespaces = []; - - if ( !all ) { - // Namespaced event handlers - namespaces = type.split("."); - type = namespaces.shift(); - - namespace = new RegExp("(^|\\.)" + - jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); - } - - eventType = events[ type ]; - - if ( !eventType ) { - continue; - } - - if ( !handler ) { - for ( j = 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( all || namespace.test( handleObj.namespace ) ) { - jQuery.event.remove( elem, origType, handleObj.handler, j ); - eventType.splice( j--, 1 ); - } - } - - continue; - } - - special = jQuery.event.special[ type ] || {}; - - for ( j = pos || 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( handler.guid === handleObj.guid ) { - // remove the given handler for the given type - if ( all || namespace.test( handleObj.namespace ) ) { - if ( pos == null ) { - eventType.splice( j--, 1 ); - } - - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - - if ( pos != null ) { - break; - } - } - } - - // remove generic event handler if no more handlers exist - if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { - if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - ret = null; - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - var handle = elemData.handle; - if ( handle ) { - handle.elem = null; - } - - delete elemData.events; - delete elemData.handle; - - if ( jQuery.isEmptyObject( elemData ) ) { - jQuery.removeData( elem, undefined, true ); - } - } - }, - - // Events that are safe to short-circuit if no handlers are attached. - // Native DOM events should not be added, they may have inline handlers. - customEvent: { - "getData": true, - "setData": true, - "changeData": true - }, - - trigger: function( event, data, elem, onlyHandlers ) { - // Event object or event type - var type = event.type || event, - namespaces = [], - exclusive; - - if ( type.indexOf("!") >= 0 ) { - // Exclusive events trigger only for the exact event (no namespaces) - type = type.slice(0, -1); - exclusive = true; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - - if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { - // No jQuery handlers for this event type, and it can't have inline handlers - return; - } - - // Caller can pass in an Event, Object, or just an event type string - event = typeof event === "object" ? - // jQuery.Event object - event[ jQuery.expando ] ? event : - // Object literal - new jQuery.Event( type, event ) : - // Just the event type (string) - new jQuery.Event( type ); - - event.type = type; - event.exclusive = exclusive; - event.namespace = namespaces.join("."); - event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); - - // triggerHandler() and global events don't bubble or run the default action - if ( onlyHandlers || !elem ) { - event.preventDefault(); - event.stopPropagation(); - } - - // Handle a global trigger - if ( !elem ) { - // TODO: Stop taunting the data cache; remove global events and always attach to document - jQuery.each( jQuery.cache, function() { - // internalKey variable is just used to make it easier to find - // and potentially change this stuff later; currently it just - // points to jQuery.expando - var internalKey = jQuery.expando, - internalCache = this[ internalKey ]; - if ( internalCache && internalCache.events && internalCache.events[ type ] ) { - jQuery.event.trigger( event, data, internalCache.handle.elem ); - } - }); - return; - } - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // Clean up the event in case it is being reused - event.result = undefined; - event.target = elem; - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data != null ? jQuery.makeArray( data ) : []; - data.unshift( event ); - - var cur = elem, - // IE doesn't like method names with a colon (#3533, #8272) - ontype = type.indexOf(":") < 0 ? "on" + type : ""; - - // Fire event on the current element, then bubble up the DOM tree - do { - var handle = jQuery._data( cur, "handle" ); - - event.currentTarget = cur; - if ( handle ) { - handle.apply( cur, data ); - } - - // Trigger an inline bound script - if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) { - event.result = false; - event.preventDefault(); - } - - // Bubble up to document, then to window - cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window; - } while ( cur && !event.isPropagationStopped() ); - - // If nobody prevented the default action, do it now - if ( !event.isDefaultPrevented() ) { - var old, - special = jQuery.event.special[ type ] || {}; - - if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) && - !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction)() check here because IE6/7 fails that test. - // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch. - try { - if ( ontype && elem[ type ] ) { - // Don't re-trigger an onFOO event when we call its FOO() method - old = elem[ ontype ]; - - if ( old ) { - elem[ ontype ] = null; - } - - jQuery.event.triggered = type; - elem[ type ](); - } - } catch ( ieError ) {} - - if ( old ) { - elem[ ontype ] = old; - } - - jQuery.event.triggered = undefined; - } - } - - return event.result; - }, - - handle: function( event ) { - event = jQuery.event.fix( event || window.event ); - // Snapshot the handlers list since a called handler may add/remove events. - var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0), - run_all = !event.exclusive && !event.namespace, - args = Array.prototype.slice.call( arguments, 0 ); - - // Use the fix-ed Event rather than the (read-only) native event - args[0] = event; - event.currentTarget = this; - - for ( var j = 0, l = handlers.length; j < l; j++ ) { - var handleObj = handlers[ j ]; - - // Triggered event must 1) be non-exclusive and have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event. - if ( run_all || event.namespace_re.test( handleObj.namespace ) ) { - // Pass in a reference to the handler function itself - // So that we can later remove it - event.handler = handleObj.handler; - event.data = handleObj.data; - event.handleObj = handleObj; - - var ret = handleObj.handler.apply( this, args ); - - if ( ret !== undefined ) { - event.result = ret; - if ( ret === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - - if ( event.isImmediatePropagationStopped() ) { - break; - } - } - } - return event.result; - }, - - props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // store a copy of the original event object - // and "clone" to set read-only properties - var originalEvent = event; - event = jQuery.Event( originalEvent ); - - for ( var i = this.props.length, prop; i; ) { - prop = this.props[ --i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Fix target property, if necessary - if ( !event.target ) { - // Fixes #1925 where srcElement might not be defined either - event.target = event.srcElement || document; - } - - // check if target is a textnode (safari) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && event.fromElement ) { - event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; - } - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && event.clientX != null ) { - var eventDocument = event.target.ownerDocument || document, - doc = eventDocument.documentElement, - body = eventDocument.body; - - event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); - event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); - } - - // Add which for key events - if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { - event.which = event.charCode != null ? event.charCode : event.keyCode; - } - - // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) - if ( !event.metaKey && event.ctrlKey ) { - event.metaKey = event.ctrlKey; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && event.button !== undefined ) { - event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); - } - - return event; - }, - - // Deprecated, use jQuery.guid instead - guid: 1E8, - - // Deprecated, use jQuery.proxy instead - proxy: jQuery.proxy, - - special: { - ready: { - // Make sure the ready event is setup - setup: jQuery.bindReady, - teardown: jQuery.noop - }, - - live: { - add: function( handleObj ) { - jQuery.event.add( this, - liveConvert( handleObj.origType, handleObj.selector ), - jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); - }, - - remove: function( handleObj ) { - jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); - } - }, - - beforeunload: { - setup: function( data, namespaces, eventHandle ) { - // We only want to do this special case on windows - if ( jQuery.isWindow( this ) ) { - this.onbeforeunload = eventHandle; - } - }, - - teardown: function( namespaces, eventHandle ) { - if ( this.onbeforeunload === eventHandle ) { - this.onbeforeunload = null; - } - } - } - } -}; - -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - if ( elem.detachEvent ) { - elem.detachEvent( "on" + type, handle ); - } - }; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !this.preventDefault ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || - src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // timeStamp is buggy for some events on Firefox(#3843) - // So we won't rely on the native value - this.timeStamp = jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -function returnFalse() { - return false; -} -function returnTrue() { - return true; -} - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - preventDefault: function() { - this.isDefaultPrevented = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - - // if preventDefault exists run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); - - // otherwise set the returnValue property of the original event to false (IE) - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - this.isPropagationStopped = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - // if stopPropagation exists run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - // otherwise set the cancelBubble property of the original event to true (IE) - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - }, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse -}; - -// Checks if an event happened on an element within another element -// Used in jQuery.event.special.mouseenter and mouseleave handlers -var withinElement = function( event ) { - - // Check if mouse(over|out) are still within the same parent element - var related = event.relatedTarget, - inside = false, - eventType = event.type; - - event.type = event.data; - - if ( related !== this ) { - - if ( related ) { - inside = jQuery.contains( this, related ); - } - - if ( !inside ) { - - jQuery.event.handle.apply( this, arguments ); - - event.type = eventType; - } - } -}, - -// In case of event delegation, we only need to rename the event.type, -// liveHandler will take care of the rest. -delegate = function( event ) { - event.type = event.data; - jQuery.event.handle.apply( this, arguments ); -}; - -// Create mouseenter and mouseleave events -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - setup: function( data ) { - jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); - }, - teardown: function( data ) { - jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); - } - }; -}); - -// submit delegation -if ( !jQuery.support.submitBubbles ) { - - jQuery.event.special.submit = { - setup: function( data, namespaces ) { - if ( !jQuery.nodeName( this, "form" ) ) { - jQuery.event.add(this, "click.specialSubmit", function( e ) { - // Avoid triggering error on non-existent type attribute in IE VML (#7071) - var elem = e.target, - type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : ""; - - if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { - trigger( "submit", this, arguments ); - } - }); - - jQuery.event.add(this, "keypress.specialSubmit", function( e ) { - var elem = e.target, - type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : ""; - - if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { - trigger( "submit", this, arguments ); - } - }); - - } else { - return false; - } - }, - - teardown: function( namespaces ) { - jQuery.event.remove( this, ".specialSubmit" ); - } - }; - -} - -// change delegation, happens here so we have bind. -if ( !jQuery.support.changeBubbles ) { - - var changeFilters, - - getVal = function( elem ) { - var type = jQuery.nodeName( elem, "input" ) ? elem.type : "", - val = elem.value; - - if ( type === "radio" || type === "checkbox" ) { - val = elem.checked; - - } else if ( type === "select-multiple" ) { - val = elem.selectedIndex > -1 ? - jQuery.map( elem.options, function( elem ) { - return elem.selected; - }).join("-") : - ""; - - } else if ( jQuery.nodeName( elem, "select" ) ) { - val = elem.selectedIndex; - } - - return val; - }, - - testChange = function testChange( e ) { - var elem = e.target, data, val; - - if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { - return; - } - - data = jQuery._data( elem, "_change_data" ); - val = getVal(elem); - - // the current data will be also retrieved by beforeactivate - if ( e.type !== "focusout" || elem.type !== "radio" ) { - jQuery._data( elem, "_change_data", val ); - } - - if ( data === undefined || val === data ) { - return; - } - - if ( data != null || val ) { - e.type = "change"; - e.liveFired = undefined; - jQuery.event.trigger( e, arguments[1], elem ); - } - }; - - jQuery.event.special.change = { - filters: { - focusout: testChange, - - beforedeactivate: testChange, - - click: function( e ) { - var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; - - if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) { - testChange.call( this, e ); - } - }, - - // Change has to be called before submit - // Keydown will be called before keypress, which is used in submit-event delegation - keydown: function( e ) { - var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; - - if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) || - (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || - type === "select-multiple" ) { - testChange.call( this, e ); - } - }, - - // Beforeactivate happens also before the previous element is blurred - // with this event you can't trigger a change event, but you can store - // information - beforeactivate: function( e ) { - var elem = e.target; - jQuery._data( elem, "_change_data", getVal(elem) ); - } - }, - - setup: function( data, namespaces ) { - if ( this.type === "file" ) { - return false; - } - - for ( var type in changeFilters ) { - jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); - } - - return rformElems.test( this.nodeName ); - }, - - teardown: function( namespaces ) { - jQuery.event.remove( this, ".specialChange" ); - - return rformElems.test( this.nodeName ); - } - }; - - changeFilters = jQuery.event.special.change.filters; - - // Handle when the input is .focus()'d - changeFilters.focus = changeFilters.beforeactivate; -} - -function trigger( type, elem, args ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - // Don't pass args or remember liveFired; they apply to the donor event. - var event = jQuery.extend( {}, args[ 0 ] ); - event.type = type; - event.originalEvent = {}; - event.liveFired = undefined; - jQuery.event.handle.call( elem, event ); - if ( event.isDefaultPrevented() ) { - args[ 0 ].preventDefault(); - } -} - -// Create "bubbling" focus and blur events -if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0; - - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - - function handler( donor ) { - // Donor event is always a native one; fix it and switch its type. - // Let focusin/out handler cancel the donor focus/blur event. - var e = jQuery.event.fix( donor ); - e.type = fix; - e.originalEvent = {}; - jQuery.event.trigger( e, null, e.target ); - if ( e.isDefaultPrevented() ) { - donor.preventDefault(); - } - } - }); -} - -jQuery.each(["bind", "one"], function( i, name ) { - jQuery.fn[ name ] = function( type, data, fn ) { - var handler; - - // Handle object literals - if ( typeof type === "object" ) { - for ( var key in type ) { - this[ name ](key, data, type[key], fn); - } - return this; - } - - if ( arguments.length === 2 || data === false ) { - fn = data; - data = undefined; - } - - if ( name === "one" ) { - handler = function( event ) { - jQuery( this ).unbind( event, handler ); - return fn.apply( this, arguments ); - }; - handler.guid = fn.guid || jQuery.guid++; - } else { - handler = fn; - } - - if ( type === "unload" && name !== "one" ) { - this.one( type, data, fn ); - - } else { - for ( var i = 0, l = this.length; i < l; i++ ) { - jQuery.event.add( this[i], type, handler, data ); - } - } - - return this; - }; -}); - -jQuery.fn.extend({ - unbind: function( type, fn ) { - // Handle object literals - if ( typeof type === "object" && !type.preventDefault ) { - for ( var key in type ) { - this.unbind(key, type[key]); - } - - } else { - for ( var i = 0, l = this.length; i < l; i++ ) { - jQuery.event.remove( this[i], type, fn ); - } - } - - return this; - }, - - delegate: function( selector, types, data, fn ) { - return this.live( types, data, fn, selector ); - }, - - undelegate: function( selector, types, fn ) { - if ( arguments.length === 0 ) { - return this.unbind( "live" ); - - } else { - return this.die( types, null, fn, selector ); - } - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - - triggerHandler: function( type, data ) { - if ( this[0] ) { - return jQuery.event.trigger( type, data, this[0], true ); - } - }, - - toggle: function( fn ) { - // Save reference to arguments for access in closure - var args = arguments, - guid = fn.guid || jQuery.guid++, - i = 0, - toggler = function( event ) { - // Figure out which function to execute - var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; - jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); - - // Make sure that clicks stop - event.preventDefault(); - - // and execute the function - return args[ lastToggle ].apply( this, arguments ) || false; - }; - - // link all the functions, so any of them can unbind this click handler - toggler.guid = guid; - while ( i < args.length ) { - args[ i++ ].guid = guid; - } - - return this.click( toggler ); - }, - - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -}); - -var liveMap = { - focus: "focusin", - blur: "focusout", - mouseenter: "mouseover", - mouseleave: "mouseout" -}; - -jQuery.each(["live", "die"], function( i, name ) { - jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { - var type, i = 0, match, namespaces, preType, - selector = origSelector || this.selector, - context = origSelector ? this : jQuery( this.context ); - - if ( typeof types === "object" && !types.preventDefault ) { - for ( var key in types ) { - context[ name ]( key, data, types[key], selector ); - } - - return this; - } - - if ( name === "die" && !types && - origSelector && origSelector.charAt(0) === "." ) { - - context.unbind( origSelector ); - - return this; - } - - if ( data === false || jQuery.isFunction( data ) ) { - fn = data || returnFalse; - data = undefined; - } - - types = (types || "").split(" "); - - while ( (type = types[ i++ ]) != null ) { - match = rnamespaces.exec( type ); - namespaces = ""; - - if ( match ) { - namespaces = match[0]; - type = type.replace( rnamespaces, "" ); - } - - if ( type === "hover" ) { - types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); - continue; - } - - preType = type; - - if ( liveMap[ type ] ) { - types.push( liveMap[ type ] + namespaces ); - type = type + namespaces; - - } else { - type = (liveMap[ type ] || type) + namespaces; - } - - if ( name === "live" ) { - // bind live handler - for ( var j = 0, l = context.length; j < l; j++ ) { - jQuery.event.add( context[j], "live." + liveConvert( type, selector ), - { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); - } - - } else { - // unbind live handler - context.unbind( "live." + liveConvert( type, selector ), fn ); - } - } - - return this; - }; -}); - -function liveHandler( event ) { - var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, - elems = [], - selectors = [], - events = jQuery._data( this, "events" ); - - // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) - if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { - return; - } - - if ( event.namespace ) { - namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); - } - - event.liveFired = this; - - var live = events.live.slice(0); - - for ( j = 0; j < live.length; j++ ) { - handleObj = live[j]; - - if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { - selectors.push( handleObj.selector ); - - } else { - live.splice( j--, 1 ); - } - } - - match = jQuery( event.target ).closest( selectors, event.currentTarget ); - - for ( i = 0, l = match.length; i < l; i++ ) { - close = match[i]; - - for ( j = 0; j < live.length; j++ ) { - handleObj = live[j]; - - if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { - elem = close.elem; - related = null; - - // Those two events require additional checking - if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { - event.type = handleObj.preType; - related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; - - // Make sure not to accidentally match a child element with the same selector - if ( related && jQuery.contains( elem, related ) ) { - related = elem; - } - } - - if ( !related || related !== elem ) { - elems.push({ elem: elem, handleObj: handleObj, level: close.level }); - } - } - } - } - - for ( i = 0, l = elems.length; i < l; i++ ) { - match = elems[i]; - - if ( maxLevel && match.level > maxLevel ) { - break; - } - - event.currentTarget = match.elem; - event.data = match.handleObj.data; - event.handleObj = match.handleObj; - - ret = match.handleObj.origHandler.apply( match.elem, arguments ); - - if ( ret === false || event.isPropagationStopped() ) { - maxLevel = match.level; - - if ( ret === false ) { - stop = false; - } - if ( event.isImmediatePropagationStopped() ) { - break; - } - } - } - - return stop; -} - -function liveConvert( type, selector ) { - return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&"); -} - -jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup error").split(" "), function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - if ( fn == null ) { - fn = data; - data = null; - } - - return arguments.length > 0 ? - this.bind( name, data, fn ) : - this.trigger( name ); - }; - - if ( jQuery.attrFn ) { - jQuery.attrFn[ name ] = true; - } -}); - - - -/*! - * Sizzle CSS Selector Engine - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){ - -var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, - done = 0, - toString = Object.prototype.toString, - hasDuplicate = false, - baseHasDuplicate = true, - rBackslash = /\\/g, - rNonWord = /\W/; - -// Here we check if the JavaScript engine is using some sort of -// optimization where it does not always call our comparision -// function. If that is the case, discard the hasDuplicate value. -// Thus far that includes Google Chrome. -[0, 0].sort(function() { - baseHasDuplicate = false; - return 0; -}); - -var Sizzle = function( selector, context, results, seed ) { - results = results || []; - context = context || document; - - var origContext = context; - - if ( context.nodeType !== 1 && context.nodeType !== 9 ) { - return []; - } - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - var m, set, checkSet, extra, ret, cur, pop, i, - prune = true, - contextXML = Sizzle.isXML( context ), - parts = [], - soFar = selector; - - // Reset the position of the chunker regexp (start from head) - do { - chunker.exec( "" ); - m = chunker.exec( soFar ); - - if ( m ) { - soFar = m[3]; - - parts.push( m[1] ); - - if ( m[2] ) { - extra = m[3]; - break; - } - } - } while ( m ); - - if ( parts.length > 1 && origPOS.exec( selector ) ) { - - if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { - set = posProcess( parts[0] + parts[1], context ); - - } else { - set = Expr.relative[ parts[0] ] ? - [ context ] : - Sizzle( parts.shift(), context ); - - while ( parts.length ) { - selector = parts.shift(); - - if ( Expr.relative[ selector ] ) { - selector += parts.shift(); - } - - set = posProcess( selector, set ); - } - } - - } else { - // Take a shortcut and set the context if the root selector is an ID - // (but not if it'll be faster if the inner selector is an ID) - if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && - Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { - - ret = Sizzle.find( parts.shift(), context, contextXML ); - context = ret.expr ? - Sizzle.filter( ret.expr, ret.set )[0] : - ret.set[0]; - } - - if ( context ) { - ret = seed ? - { expr: parts.pop(), set: makeArray(seed) } : - Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); - - set = ret.expr ? - Sizzle.filter( ret.expr, ret.set ) : - ret.set; - - if ( parts.length > 0 ) { - checkSet = makeArray( set ); - - } else { - prune = false; - } - - while ( parts.length ) { - cur = parts.pop(); - pop = cur; - - if ( !Expr.relative[ cur ] ) { - cur = ""; - } else { - pop = parts.pop(); - } - - if ( pop == null ) { - pop = context; - } - - Expr.relative[ cur ]( checkSet, pop, contextXML ); - } - - } else { - checkSet = parts = []; - } - } - - if ( !checkSet ) { - checkSet = set; - } - - if ( !checkSet ) { - Sizzle.error( cur || selector ); - } - - if ( toString.call(checkSet) === "[object Array]" ) { - if ( !prune ) { - results.push.apply( results, checkSet ); - - } else if ( context && context.nodeType === 1 ) { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { - results.push( set[i] ); - } - } - - } else { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && checkSet[i].nodeType === 1 ) { - results.push( set[i] ); - } - } - } - - } else { - makeArray( checkSet, results ); - } - - if ( extra ) { - Sizzle( extra, origContext, results, seed ); - Sizzle.uniqueSort( results ); - } - - return results; -}; - -Sizzle.uniqueSort = function( results ) { - if ( sortOrder ) { - hasDuplicate = baseHasDuplicate; - results.sort( sortOrder ); - - if ( hasDuplicate ) { - for ( var i = 1; i < results.length; i++ ) { - if ( results[i] === results[ i - 1 ] ) { - results.splice( i--, 1 ); - } - } - } - } - - return results; -}; - -Sizzle.matches = function( expr, set ) { - return Sizzle( expr, null, null, set ); -}; - -Sizzle.matchesSelector = function( node, expr ) { - return Sizzle( expr, null, null, [node] ).length > 0; -}; - -Sizzle.find = function( expr, context, isXML ) { - var set; - - if ( !expr ) { - return []; - } - - for ( var i = 0, l = Expr.order.length; i < l; i++ ) { - var match, - type = Expr.order[i]; - - if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { - var left = match[1]; - match.splice( 1, 1 ); - - if ( left.substr( left.length - 1 ) !== "\\" ) { - match[1] = (match[1] || "").replace( rBackslash, "" ); - set = Expr.find[ type ]( match, context, isXML ); - - if ( set != null ) { - expr = expr.replace( Expr.match[ type ], "" ); - break; - } - } - } - } - - if ( !set ) { - set = typeof context.getElementsByTagName !== "undefined" ? - context.getElementsByTagName( "*" ) : - []; - } - - return { set: set, expr: expr }; -}; - -Sizzle.filter = function( expr, set, inplace, not ) { - var match, anyFound, - old = expr, - result = [], - curLoop = set, - isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); - - while ( expr && set.length ) { - for ( var type in Expr.filter ) { - if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { - var found, item, - filter = Expr.filter[ type ], - left = match[1]; - - anyFound = false; - - match.splice(1,1); - - if ( left.substr( left.length - 1 ) === "\\" ) { - continue; - } - - if ( curLoop === result ) { - result = []; - } - - if ( Expr.preFilter[ type ] ) { - match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); - - if ( !match ) { - anyFound = found = true; - - } else if ( match === true ) { - continue; - } - } - - if ( match ) { - for ( var i = 0; (item = curLoop[i]) != null; i++ ) { - if ( item ) { - found = filter( item, match, i, curLoop ); - var pass = not ^ !!found; - - if ( inplace && found != null ) { - if ( pass ) { - anyFound = true; - - } else { - curLoop[i] = false; - } - - } else if ( pass ) { - result.push( item ); - anyFound = true; - } - } - } - } - - if ( found !== undefined ) { - if ( !inplace ) { - curLoop = result; - } - - expr = expr.replace( Expr.match[ type ], "" ); - - if ( !anyFound ) { - return []; - } - - break; - } - } - } - - // Improper expression - if ( expr === old ) { - if ( anyFound == null ) { - Sizzle.error( expr ); - - } else { - break; - } - } - - old = expr; - } - - return curLoop; -}; - -Sizzle.error = function( msg ) { - throw "Syntax error, unrecognized expression: " + msg; -}; - -var Expr = Sizzle.selectors = { - order: [ "ID", "NAME", "TAG" ], - - match: { - ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, - ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, - TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, - CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, - POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, - PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ - }, - - leftMatch: {}, - - attrMap: { - "class": "className", - "for": "htmlFor" - }, - - attrHandle: { - href: function( elem ) { - return elem.getAttribute( "href" ); - }, - type: function( elem ) { - return elem.getAttribute( "type" ); - } - }, - - relative: { - "+": function(checkSet, part){ - var isPartStr = typeof part === "string", - isTag = isPartStr && !rNonWord.test( part ), - isPartStrNotTag = isPartStr && !isTag; - - if ( isTag ) { - part = part.toLowerCase(); - } - - for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { - if ( (elem = checkSet[i]) ) { - while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} - - checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? - elem || false : - elem === part; - } - } - - if ( isPartStrNotTag ) { - Sizzle.filter( part, checkSet, true ); - } - }, - - ">": function( checkSet, part ) { - var elem, - isPartStr = typeof part === "string", - i = 0, - l = checkSet.length; - - if ( isPartStr && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - var parent = elem.parentNode; - checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; - } - } - - } else { - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - checkSet[i] = isPartStr ? - elem.parentNode : - elem.parentNode === part; - } - } - - if ( isPartStr ) { - Sizzle.filter( part, checkSet, true ); - } - } - }, - - "": function(checkSet, part, isXML){ - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); - }, - - "~": function( checkSet, part, isXML ) { - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); - } - }, - - find: { - ID: function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }, - - NAME: function( match, context ) { - if ( typeof context.getElementsByName !== "undefined" ) { - var ret = [], - results = context.getElementsByName( match[1] ); - - for ( var i = 0, l = results.length; i < l; i++ ) { - if ( results[i].getAttribute("name") === match[1] ) { - ret.push( results[i] ); - } - } - - return ret.length === 0 ? null : ret; - } - }, - - TAG: function( match, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( match[1] ); - } - } - }, - preFilter: { - CLASS: function( match, curLoop, inplace, result, not, isXML ) { - match = " " + match[1].replace( rBackslash, "" ) + " "; - - if ( isXML ) { - return match; - } - - for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { - if ( elem ) { - if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { - if ( !inplace ) { - result.push( elem ); - } - - } else if ( inplace ) { - curLoop[i] = false; - } - } - } - - return false; - }, - - ID: function( match ) { - return match[1].replace( rBackslash, "" ); - }, - - TAG: function( match, curLoop ) { - return match[1].replace( rBackslash, "" ).toLowerCase(); - }, - - CHILD: function( match ) { - if ( match[1] === "nth" ) { - if ( !match[2] ) { - Sizzle.error( match[0] ); - } - - match[2] = match[2].replace(/^\+|\s*/g, ''); - - // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' - var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( - match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || - !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); - - // calculate the numbers (first)n+(last) including if they are negative - match[2] = (test[1] + (test[2] || 1)) - 0; - match[3] = test[3] - 0; - } - else if ( match[2] ) { - Sizzle.error( match[0] ); - } - - // TODO: Move to normal caching system - match[0] = done++; - - return match; - }, - - ATTR: function( match, curLoop, inplace, result, not, isXML ) { - var name = match[1] = match[1].replace( rBackslash, "" ); - - if ( !isXML && Expr.attrMap[name] ) { - match[1] = Expr.attrMap[name]; - } - - // Handle if an un-quoted value was used - match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); - - if ( match[2] === "~=" ) { - match[4] = " " + match[4] + " "; - } - - return match; - }, - - PSEUDO: function( match, curLoop, inplace, result, not ) { - if ( match[1] === "not" ) { - // If we're dealing with a complex expression, or a simple one - if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { - match[3] = Sizzle(match[3], null, null, curLoop); - - } else { - var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); - - if ( !inplace ) { - result.push.apply( result, ret ); - } - - return false; - } - - } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { - return true; - } - - return match; - }, - - POS: function( match ) { - match.unshift( true ); - - return match; - } - }, - - filters: { - enabled: function( elem ) { - return elem.disabled === false && elem.type !== "hidden"; - }, - - disabled: function( elem ) { - return elem.disabled === true; - }, - - checked: function( elem ) { - return elem.checked === true; - }, - - selected: function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - parent: function( elem ) { - return !!elem.firstChild; - }, - - empty: function( elem ) { - return !elem.firstChild; - }, - - has: function( elem, i, match ) { - return !!Sizzle( match[3], elem ).length; - }, - - header: function( elem ) { - return (/h\d/i).test( elem.nodeName ); - }, - - text: function( elem ) { - var attr = elem.getAttribute( "type" ), type = elem.type; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); - }, - - radio: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; - }, - - checkbox: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; - }, - - file: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; - }, - - password: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; - }, - - submit: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "submit" === elem.type; - }, - - image: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; - }, - - reset: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "reset" === elem.type; - }, - - button: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && "button" === elem.type || name === "button"; - }, - - input: function( elem ) { - return (/input|select|textarea|button/i).test( elem.nodeName ); - }, - - focus: function( elem ) { - return elem === elem.ownerDocument.activeElement; - } - }, - setFilters: { - first: function( elem, i ) { - return i === 0; - }, - - last: function( elem, i, match, array ) { - return i === array.length - 1; - }, - - even: function( elem, i ) { - return i % 2 === 0; - }, - - odd: function( elem, i ) { - return i % 2 === 1; - }, - - lt: function( elem, i, match ) { - return i < match[3] - 0; - }, - - gt: function( elem, i, match ) { - return i > match[3] - 0; - }, - - nth: function( elem, i, match ) { - return match[3] - 0 === i; - }, - - eq: function( elem, i, match ) { - return match[3] - 0 === i; - } - }, - filter: { - PSEUDO: function( elem, match, i, array ) { - var name = match[1], - filter = Expr.filters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - - } else if ( name === "contains" ) { - return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; - - } else if ( name === "not" ) { - var not = match[3]; - - for ( var j = 0, l = not.length; j < l; j++ ) { - if ( not[j] === elem ) { - return false; - } - } - - return true; - - } else { - Sizzle.error( name ); - } - }, - - CHILD: function( elem, match ) { - var type = match[1], - node = elem; - - switch ( type ) { - case "only": - case "first": - while ( (node = node.previousSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - if ( type === "first" ) { - return true; - } - - node = elem; - - case "last": - while ( (node = node.nextSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - return true; - - case "nth": - var first = match[2], - last = match[3]; - - if ( first === 1 && last === 0 ) { - return true; - } - - var doneName = match[0], - parent = elem.parentNode; - - if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { - var count = 0; - - for ( node = parent.firstChild; node; node = node.nextSibling ) { - if ( node.nodeType === 1 ) { - node.nodeIndex = ++count; - } - } - - parent.sizcache = doneName; - } - - var diff = elem.nodeIndex - last; - - if ( first === 0 ) { - return diff === 0; - - } else { - return ( diff % first === 0 && diff / first >= 0 ); - } - } - }, - - ID: function( elem, match ) { - return elem.nodeType === 1 && elem.getAttribute("id") === match; - }, - - TAG: function( elem, match ) { - return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; - }, - - CLASS: function( elem, match ) { - return (" " + (elem.className || elem.getAttribute("class")) + " ") - .indexOf( match ) > -1; - }, - - ATTR: function( elem, match ) { - var name = match[1], - result = Expr.attrHandle[ name ] ? - Expr.attrHandle[ name ]( elem ) : - elem[ name ] != null ? - elem[ name ] : - elem.getAttribute( name ), - value = result + "", - type = match[2], - check = match[4]; - - return result == null ? - type === "!=" : - type === "=" ? - value === check : - type === "*=" ? - value.indexOf(check) >= 0 : - type === "~=" ? - (" " + value + " ").indexOf(check) >= 0 : - !check ? - value && result !== false : - type === "!=" ? - value !== check : - type === "^=" ? - value.indexOf(check) === 0 : - type === "$=" ? - value.substr(value.length - check.length) === check : - type === "|=" ? - value === check || value.substr(0, check.length + 1) === check + "-" : - false; - }, - - POS: function( elem, match, i, array ) { - var name = match[2], - filter = Expr.setFilters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - } - } - } -}; - -var origPOS = Expr.match.POS, - fescape = function(all, num){ - return "\\" + (num - 0 + 1); - }; - -for ( var type in Expr.match ) { - Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); - Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); -} - -var makeArray = function( array, results ) { - array = Array.prototype.slice.call( array, 0 ); - - if ( results ) { - results.push.apply( results, array ); - return results; - } - - return array; -}; - -// Perform a simple check to determine if the browser is capable of -// converting a NodeList to an array using builtin methods. -// Also verifies that the returned array holds DOM nodes -// (which is not the case in the Blackberry browser) -try { - Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; - -// Provide a fallback method if it does not work -} catch( e ) { - makeArray = function( array, results ) { - var i = 0, - ret = results || []; - - if ( toString.call(array) === "[object Array]" ) { - Array.prototype.push.apply( ret, array ); - - } else { - if ( typeof array.length === "number" ) { - for ( var l = array.length; i < l; i++ ) { - ret.push( array[i] ); - } - - } else { - for ( ; array[i]; i++ ) { - ret.push( array[i] ); - } - } - } - - return ret; - }; -} - -var sortOrder, siblingCheck; - -if ( document.documentElement.compareDocumentPosition ) { - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { - return a.compareDocumentPosition ? -1 : 1; - } - - return a.compareDocumentPosition(b) & 4 ? -1 : 1; - }; - -} else { - sortOrder = function( a, b ) { - // The nodes are identical, we can exit early - if ( a === b ) { - hasDuplicate = true; - return 0; - - // Fallback to using sourceIndex (in IE) if it's available on both nodes - } else if ( a.sourceIndex && b.sourceIndex ) { - return a.sourceIndex - b.sourceIndex; - } - - var al, bl, - ap = [], - bp = [], - aup = a.parentNode, - bup = b.parentNode, - cur = aup; - - // If the nodes are siblings (or identical) we can do a quick check - if ( aup === bup ) { - return siblingCheck( a, b ); - - // If no parents were found then the nodes are disconnected - } else if ( !aup ) { - return -1; - - } else if ( !bup ) { - return 1; - } - - // Otherwise they're somewhere else in the tree so we need - // to build up a full list of the parentNodes for comparison - while ( cur ) { - ap.unshift( cur ); - cur = cur.parentNode; - } - - cur = bup; - - while ( cur ) { - bp.unshift( cur ); - cur = cur.parentNode; - } - - al = ap.length; - bl = bp.length; - - // Start walking down the tree looking for a discrepancy - for ( var i = 0; i < al && i < bl; i++ ) { - if ( ap[i] !== bp[i] ) { - return siblingCheck( ap[i], bp[i] ); - } - } - - // We ended someplace up the tree so do a sibling check - return i === al ? - siblingCheck( a, bp[i], -1 ) : - siblingCheck( ap[i], b, 1 ); - }; - - siblingCheck = function( a, b, ret ) { - if ( a === b ) { - return ret; - } - - var cur = a.nextSibling; - - while ( cur ) { - if ( cur === b ) { - return -1; - } - - cur = cur.nextSibling; - } - - return 1; - }; -} - -// Utility function for retreiving the text value of an array of DOM nodes -Sizzle.getText = function( elems ) { - var ret = "", elem; - - for ( var i = 0; elems[i]; i++ ) { - elem = elems[i]; - - // Get the text from text nodes and CDATA nodes - if ( elem.nodeType === 3 || elem.nodeType === 4 ) { - ret += elem.nodeValue; - - // Traverse everything else, except comment nodes - } else if ( elem.nodeType !== 8 ) { - ret += Sizzle.getText( elem.childNodes ); - } - } - - return ret; -}; - -// Check to see if the browser returns elements by name when -// querying by getElementById (and provide a workaround) -(function(){ - // We're going to inject a fake input element with a specified name - var form = document.createElement("div"), - id = "script" + (new Date()).getTime(), - root = document.documentElement; - - form.innerHTML = ""; - - // Inject it into the root element, check its status, and remove it quickly - root.insertBefore( form, root.firstChild ); - - // The workaround has to do additional checks after a getElementById - // Which slows things down for other browsers (hence the branching) - if ( document.getElementById( id ) ) { - Expr.find.ID = function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - - return m ? - m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? - [m] : - undefined : - []; - } - }; - - Expr.filter.ID = function( elem, match ) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); - - return elem.nodeType === 1 && node && node.nodeValue === match; - }; - } - - root.removeChild( form ); - - // release memory in IE - root = form = null; -})(); - -(function(){ - // Check to see if the browser returns only elements - // when doing getElementsByTagName("*") - - // Create a fake element - var div = document.createElement("div"); - div.appendChild( document.createComment("") ); - - // Make sure no comments are found - if ( div.getElementsByTagName("*").length > 0 ) { - Expr.find.TAG = function( match, context ) { - var results = context.getElementsByTagName( match[1] ); - - // Filter out possible comments - if ( match[1] === "*" ) { - var tmp = []; - - for ( var i = 0; results[i]; i++ ) { - if ( results[i].nodeType === 1 ) { - tmp.push( results[i] ); - } - } - - results = tmp; - } - - return results; - }; - } - - // Check to see if an attribute returns normalized href attributes - div.innerHTML = ""; - - if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && - div.firstChild.getAttribute("href") !== "#" ) { - - Expr.attrHandle.href = function( elem ) { - return elem.getAttribute( "href", 2 ); - }; - } - - // release memory in IE - div = null; -})(); - -if ( document.querySelectorAll ) { - (function(){ - var oldSizzle = Sizzle, - div = document.createElement("div"), - id = "__sizzle__"; - - div.innerHTML = "

        "; - - // Safari can't handle uppercase or unicode characters when - // in quirks mode. - if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { - return; - } - - Sizzle = function( query, context, extra, seed ) { - context = context || document; - - // Only use querySelectorAll on non-XML documents - // (ID selectors don't work in non-HTML documents) - if ( !seed && !Sizzle.isXML(context) ) { - // See if we find a selector to speed up - var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); - - if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { - // Speed-up: Sizzle("TAG") - if ( match[1] ) { - return makeArray( context.getElementsByTagName( query ), extra ); - - // Speed-up: Sizzle(".CLASS") - } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { - return makeArray( context.getElementsByClassName( match[2] ), extra ); - } - } - - if ( context.nodeType === 9 ) { - // Speed-up: Sizzle("body") - // The body element only exists once, optimize finding it - if ( query === "body" && context.body ) { - return makeArray( [ context.body ], extra ); - - // Speed-up: Sizzle("#ID") - } else if ( match && match[3] ) { - var elem = context.getElementById( match[3] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id === match[3] ) { - return makeArray( [ elem ], extra ); - } - - } else { - return makeArray( [], extra ); - } - } - - try { - return makeArray( context.querySelectorAll(query), extra ); - } catch(qsaError) {} - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - var oldContext = context, - old = context.getAttribute( "id" ), - nid = old || id, - hasParent = context.parentNode, - relativeHierarchySelector = /^\s*[+~]/.test( query ); - - if ( !old ) { - context.setAttribute( "id", nid ); - } else { - nid = nid.replace( /'/g, "\\$&" ); - } - if ( relativeHierarchySelector && hasParent ) { - context = context.parentNode; - } - - try { - if ( !relativeHierarchySelector || hasParent ) { - return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); - } - - } catch(pseudoError) { - } finally { - if ( !old ) { - oldContext.removeAttribute( "id" ); - } - } - } - } - - return oldSizzle(query, context, extra, seed); - }; - - for ( var prop in oldSizzle ) { - Sizzle[ prop ] = oldSizzle[ prop ]; - } - - // release memory in IE - div = null; - })(); -} - -(function(){ - var html = document.documentElement, - matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; - - if ( matches ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9 fails this) - var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), - pseudoWorks = false; - - try { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( document.documentElement, "[test!='']:sizzle" ); - - } catch( pseudoError ) { - pseudoWorks = true; - } - - Sizzle.matchesSelector = function( node, expr ) { - // Make sure that attribute selectors are quoted - expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); - - if ( !Sizzle.isXML( node ) ) { - try { - if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { - var ret = matches.call( node, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || !disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9, so check for that - node.document && node.document.nodeType !== 11 ) { - return ret; - } - } - } catch(e) {} - } - - return Sizzle(expr, null, null, [node]).length > 0; - }; - } -})(); - -(function(){ - var div = document.createElement("div"); - - div.innerHTML = "
        "; - - // Opera can't find a second classname (in 9.6) - // Also, make sure that getElementsByClassName actually exists - if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { - return; - } - - // Safari caches class attributes, doesn't catch changes (in 3.2) - div.lastChild.className = "e"; - - if ( div.getElementsByClassName("e").length === 1 ) { - return; - } - - Expr.order.splice(1, 0, "CLASS"); - Expr.find.CLASS = function( match, context, isXML ) { - if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { - return context.getElementsByClassName(match[1]); - } - }; - - // release memory in IE - div = null; -})(); - -function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem.sizcache === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 && !isXML ){ - elem.sizcache = doneName; - elem.sizset = i; - } - - if ( elem.nodeName.toLowerCase() === cur ) { - match = elem; - break; - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem.sizcache === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 ) { - if ( !isXML ) { - elem.sizcache = doneName; - elem.sizset = i; - } - - if ( typeof cur !== "string" ) { - if ( elem === cur ) { - match = true; - break; - } - - } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { - match = elem; - break; - } - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -if ( document.documentElement.contains ) { - Sizzle.contains = function( a, b ) { - return a !== b && (a.contains ? a.contains(b) : true); - }; - -} else if ( document.documentElement.compareDocumentPosition ) { - Sizzle.contains = function( a, b ) { - return !!(a.compareDocumentPosition(b) & 16); - }; - -} else { - Sizzle.contains = function() { - return false; - }; -} - -Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; - - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -var posProcess = function( selector, context ) { - var match, - tmpSet = [], - later = "", - root = context.nodeType ? [context] : context; - - // Position selectors must be done after the filter - // And so must :not(positional) so we move all PSEUDOs to the end - while ( (match = Expr.match.PSEUDO.exec( selector )) ) { - later += match[0]; - selector = selector.replace( Expr.match.PSEUDO, "" ); - } - - selector = Expr.relative[selector] ? selector + "*" : selector; - - for ( var i = 0, l = root.length; i < l; i++ ) { - Sizzle( selector, root[i], tmpSet ); - } - - return Sizzle.filter( later, tmpSet ); -}; - -// EXPOSE -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.filters; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})(); - - -var runtil = /Until$/, - rparentsprev = /^(?:parents|prevUntil|prevAll)/, - // Note: This RegExp should be improved, or likely pulled from Sizzle - rmultiselector = /,/, - isSimple = /^.[^:#\[\.,]*$/, - slice = Array.prototype.slice, - POS = jQuery.expr.match.POS, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend({ - find: function( selector ) { - var self = this, - i, l; - - if ( typeof selector !== "string" ) { - return jQuery( selector ).filter(function() { - for ( i = 0, l = self.length; i < l; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }); - } - - var ret = this.pushStack( "", "find", selector ), - length, n, r; - - for ( i = 0, l = this.length; i < l; i++ ) { - length = ret.length; - jQuery.find( selector, this[i], ret ); - - if ( i > 0 ) { - // Make sure that the results are unique - for ( n = length; n < ret.length; n++ ) { - for ( r = 0; r < length; r++ ) { - if ( ret[r] === ret[n] ) { - ret.splice(n--, 1); - break; - } - } - } - } - } - - return ret; - }, - - has: function( target ) { - var targets = jQuery( target ); - return this.filter(function() { - for ( var i = 0, l = targets.length; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector, false), "not", selector); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector, true), "filter", selector ); - }, - - is: function( selector ) { - return !!selector && ( typeof selector === "string" ? - jQuery.filter( selector, this ).length > 0 : - this.filter( selector ).length > 0 ); - }, - - closest: function( selectors, context ) { - var ret = [], i, l, cur = this[0]; - - // Array - if ( jQuery.isArray( selectors ) ) { - var match, selector, - matches = {}, - level = 1; - - if ( cur && selectors.length ) { - for ( i = 0, l = selectors.length; i < l; i++ ) { - selector = selectors[i]; - - if ( !matches[ selector ] ) { - matches[ selector ] = POS.test( selector ) ? - jQuery( selector, context || this.context ) : - selector; - } - } - - while ( cur && cur.ownerDocument && cur !== context ) { - for ( selector in matches ) { - match = matches[ selector ]; - - if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) { - ret.push({ selector: selector, elem: cur, level: level }); - } - } - - cur = cur.parentNode; - level++; - } - } - - return ret; - } - - // String - var pos = POS.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( i = 0, l = this.length; i < l; i++ ) { - cur = this[i]; - - while ( cur ) { - if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { - ret.push( cur ); - break; - - } else { - cur = cur.parentNode; - if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { - break; - } - } - } - } - - ret = ret.length > 1 ? jQuery.unique( ret ) : ret; - - return this.pushStack( ret, "closest", selectors ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return jQuery.inArray( this[0], jQuery( elem ) ); - } - - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? - all : - jQuery.unique( all ) ); - }, - - andSelf: function() { - return this.add( this.prevObject ); - } -}); - -// A painfully simple check to see if an element is disconnected -// from a document (should be improved, where feasible). -function isDisconnected( node ) { - return !node || !node.parentNode || node.parentNode.nodeType === 11; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return jQuery.nth( elem, 2, "nextSibling" ); - }, - prev: function( elem ) { - return jQuery.nth( elem, 2, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( elem.parentNode.firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.makeArray( elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ), - // The variable 'args' was introduced in - // https://github.com/jquery/jquery/commit/52a0238 - // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. - // http://code.google.com/p/v8/issues/detail?id=1050 - args = slice.call(arguments); - - if ( !runtil.test( name ) ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } - - ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; - - if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { - ret = ret.reverse(); - } - - return this.pushStack( ret, name, args.join(",") ); - }; -}); - -jQuery.extend({ - filter: function( expr, elems, not ) { - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 ? - jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : - jQuery.find.matches(expr, elems); - }, - - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; - - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); - } - cur = cur[dir]; - } - return matched; - }, - - nth: function( cur, result, dir, elem ) { - result = result || 1; - var num = 0; - - for ( ; cur; cur = cur[dir] ) { - if ( cur.nodeType === 1 && ++num === result ) { - break; - } - } - - return cur; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); - } - } - - return r; - } -}); - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, keep ) { - - // Can't pass null or undefined to indexOf in Firefox 4 - // Set to 0 to skip string check - qualifier = qualifier || 0; - - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep(elements, function( elem, i ) { - var retVal = !!qualifier.call( elem, i, elem ); - return retVal === keep; - }); - - } else if ( qualifier.nodeType ) { - return jQuery.grep(elements, function( elem, i ) { - return (elem === qualifier) === keep; - }); - - } else if ( typeof qualifier === "string" ) { - var filtered = jQuery.grep(elements, function( elem ) { - return elem.nodeType === 1; - }); - - if ( isSimple.test( qualifier ) ) { - return jQuery.filter(qualifier, filtered, !keep); - } else { - qualifier = jQuery.filter( qualifier, filtered ); - } - } - - return jQuery.grep(elements, function( elem, i ) { - return (jQuery.inArray( elem, qualifier ) >= 0) === keep; - }); -} - - - - -var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, - rtagName = /<([\w:]+)/, - rtbody = /", "" ], - legend: [ 1, "
        ", "
        " ], - thead: [ 1, "", "
        " ], - tr: [ 2, "", "
        " ], - td: [ 3, "", "
        " ], - col: [ 2, "", "
        " ], - area: [ 1, "", "" ], - _default: [ 0, "", "" ] - }; - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// IE can't serialize and - + +
        + +
        + - - - + From 7903bac140ac98fdf5a8c3b20cce4b8731eac63c Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 20:09:30 -0400 Subject: [PATCH 28/54] submit yt might work now --- public/css/style.css | 6 ++--- public/index.html | 3 +-- public/js/scripts.js | 56 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 5 deletions(-) diff --git a/public/css/style.css b/public/css/style.css index 10b38e345..9b5ea2857 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -115,13 +115,13 @@ nav{ } #canvas-box { - width: 85%; + width: 100%; height: 80%; + align-content: center; } #canvas { - width: 100%; - height 100%; + width: 85%; } #gui { diff --git a/public/index.html b/public/index.html index c6031d594..a4720d458 100644 --- a/public/index.html +++ b/public/index.html @@ -41,7 +41,7 @@ @@ -78,18 +76,6 @@

        Enter YouTube URL

        - - - - - - - diff --git a/public/js/scripts.js b/public/js/scripts.js index 4a2d08dfa..9d688be7b 100644 --- a/public/js/scripts.js +++ b/public/js/scripts.js @@ -27,27 +27,24 @@ console.log("Welcome to assignment 3!") // }) // } -window.onload = function() { - let audioContext = null - let audioIntervalId = null - - const submit = function( e ) { - console.log('submitting video url') +const submit = function( e ) { + console.log('button pressed') + let audioContext = null + let audioIntervalId = null // Create an AudioContext for output if (audioContext) { audioContext.close() clearInterval(audioIntervalId) } audioContext = new AudioContext() - const audioContextTimestamp = Date.now() const bufferSource = audioContext.createBufferSource() - const resonanceAudio = new ResonanceAudio(audioContext) - resonanceAudio.output.connect(audioContext.destination) + // const resonanceAudio = new ResonanceAudio(audioContext) + // resonanceAudio.output.connect(audioContext.destination) // Open an XMLHttpRequest to stream audio data from YouTube - const videoUrl = document.querySelector( '#ytvid' ).value(); + const videoUrl = document.querySelector( '#ytvid' ).value; let videoId = '' try { videoId = videoUrl.split('=')[1] @@ -56,28 +53,27 @@ window.onload = function() { console.log('failed to split video url. try again.') return } - console.log(videoId) const request = new XMLHttpRequest() request.open('POST', `/stream/${videoId}`, true) request.responseType = 'arraybuffer' - request.onload = function() { + request.onload = function() { + console.log('starting audio decode') // Decode the arraybuffer from the XMLHttpRequest - audioContext.decodeAudioData(request.response, buffer => { + audioContext.decodeAudioData(request.response, buffer => { // Connect the audio buffer to the AudioContext for output - const source = resonanceAudio.createSource() + // console.log('about to start buffer') bufferSource.buffer = buffer - bufferSource.connect(source.input) - bufferSource.start() - const audioContextDelay = Date.now() - audioContextTimestamp - + bufferSource.connect(audioContext.destination) + bufferSource.start(0) + // console.log('buffer started') }, error => { alert('Unable to process audio stream') console.error(error) }) } + request.send() - }) return false -}) +} From 32366345780fa829bd8b24ba6ed5eb2825ddda6e Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 21:59:53 -0400 Subject: [PATCH 31/54] changed dat implementation --- package.json | 1 + public/build/dat.gui.css | 1 - public/build/dat.gui.js | 2537 ---------------------------- public/build/dat.gui.js.map | 1 - public/build/dat.gui.min.js | 13 - public/build/dat.gui.module.js | 2523 --------------------------- public/build/dat.gui.module.js.map | 1 - public/js/myGui.js | 4 +- 8 files changed, 4 insertions(+), 5077 deletions(-) delete mode 100644 public/build/dat.gui.css delete mode 100644 public/build/dat.gui.js delete mode 100644 public/build/dat.gui.js.map delete mode 100644 public/build/dat.gui.min.js delete mode 100644 public/build/dat.gui.module.js delete mode 100644 public/build/dat.gui.module.js.map diff --git a/package.json b/package.json index f85cf5c58..9db957ace 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "compression": "^1.7.4", "cookie-parser": "^1.4.4", "cookie-session": "^1.3.3", + "dat.gui": "^0.7.6", "express": "^4.17.1", "express-session": "^1.16.2", "helmet": "^3.21.1", diff --git a/public/build/dat.gui.css b/public/build/dat.gui.css deleted file mode 100644 index c039f4538..000000000 --- a/public/build/dat.gui.css +++ /dev/null @@ -1 +0,0 @@ -.dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda} diff --git a/public/build/dat.gui.js b/public/build/dat.gui.js deleted file mode 100644 index 85fadecc2..000000000 --- a/public/build/dat.gui.js +++ /dev/null @@ -1,2537 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (factory((global.dat = {}))); -}(this, (function (exports) { 'use strict'; - -function ___$insertStyle(css) { - if (!css) { - return; - } - if (typeof window === 'undefined') { - return; - } - - var style = document.createElement('style'); - - style.setAttribute('type', 'text/css'); - style.innerHTML = css; - document.head.appendChild(style); - - return css; -} - -function colorToString (color, forceCSSHex) { - var colorFormat = color.__state.conversionName.toString(); - var r = Math.round(color.r); - var g = Math.round(color.g); - var b = Math.round(color.b); - var a = color.a; - var h = Math.round(color.h); - var s = color.s.toFixed(1); - var v = color.v.toFixed(1); - if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') { - var str = color.hex.toString(16); - while (str.length < 6) { - str = '0' + str; - } - return '#' + str; - } else if (colorFormat === 'CSS_RGB') { - return 'rgb(' + r + ',' + g + ',' + b + ')'; - } else if (colorFormat === 'CSS_RGBA') { - return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; - } else if (colorFormat === 'HEX') { - return '0x' + color.hex.toString(16); - } else if (colorFormat === 'RGB_ARRAY') { - return '[' + r + ',' + g + ',' + b + ']'; - } else if (colorFormat === 'RGBA_ARRAY') { - return '[' + r + ',' + g + ',' + b + ',' + a + ']'; - } else if (colorFormat === 'RGB_OBJ') { - return '{r:' + r + ',g:' + g + ',b:' + b + '}'; - } else if (colorFormat === 'RGBA_OBJ') { - return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}'; - } else if (colorFormat === 'HSV_OBJ') { - return '{h:' + h + ',s:' + s + ',v:' + v + '}'; - } else if (colorFormat === 'HSVA_OBJ') { - return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}'; - } - return 'unknown format'; -} - -var ARR_EACH = Array.prototype.forEach; -var ARR_SLICE = Array.prototype.slice; -var Common = { - BREAK: {}, - extend: function extend(target) { - this.each(ARR_SLICE.call(arguments, 1), function (obj) { - var keys = this.isObject(obj) ? Object.keys(obj) : []; - keys.forEach(function (key) { - if (!this.isUndefined(obj[key])) { - target[key] = obj[key]; - } - }.bind(this)); - }, this); - return target; - }, - defaults: function defaults(target) { - this.each(ARR_SLICE.call(arguments, 1), function (obj) { - var keys = this.isObject(obj) ? Object.keys(obj) : []; - keys.forEach(function (key) { - if (this.isUndefined(target[key])) { - target[key] = obj[key]; - } - }.bind(this)); - }, this); - return target; - }, - compose: function compose() { - var toCall = ARR_SLICE.call(arguments); - return function () { - var args = ARR_SLICE.call(arguments); - for (var i = toCall.length - 1; i >= 0; i--) { - args = [toCall[i].apply(this, args)]; - } - return args[0]; - }; - }, - each: function each(obj, itr, scope) { - if (!obj) { - return; - } - if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) { - obj.forEach(itr, scope); - } else if (obj.length === obj.length + 0) { - var key = void 0; - var l = void 0; - for (key = 0, l = obj.length; key < l; key++) { - if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) { - return; - } - } - } else { - for (var _key in obj) { - if (itr.call(scope, obj[_key], _key) === this.BREAK) { - return; - } - } - } - }, - defer: function defer(fnc) { - setTimeout(fnc, 0); - }, - debounce: function debounce(func, threshold, callImmediately) { - var timeout = void 0; - return function () { - var obj = this; - var args = arguments; - function delayed() { - timeout = null; - if (!callImmediately) func.apply(obj, args); - } - var callNow = callImmediately || !timeout; - clearTimeout(timeout); - timeout = setTimeout(delayed, threshold); - if (callNow) { - func.apply(obj, args); - } - }; - }, - toArray: function toArray(obj) { - if (obj.toArray) return obj.toArray(); - return ARR_SLICE.call(obj); - }, - isUndefined: function isUndefined(obj) { - return obj === undefined; - }, - isNull: function isNull(obj) { - return obj === null; - }, - isNaN: function (_isNaN) { - function isNaN(_x) { - return _isNaN.apply(this, arguments); - } - isNaN.toString = function () { - return _isNaN.toString(); - }; - return isNaN; - }(function (obj) { - return isNaN(obj); - }), - isArray: Array.isArray || function (obj) { - return obj.constructor === Array; - }, - isObject: function isObject(obj) { - return obj === Object(obj); - }, - isNumber: function isNumber(obj) { - return obj === obj + 0; - }, - isString: function isString(obj) { - return obj === obj + ''; - }, - isBoolean: function isBoolean(obj) { - return obj === false || obj === true; - }, - isFunction: function isFunction(obj) { - return Object.prototype.toString.call(obj) === '[object Function]'; - } -}; - -var INTERPRETATIONS = [ -{ - litmus: Common.isString, - conversions: { - THREE_CHAR_HEX: { - read: function read(original) { - var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); - if (test === null) { - return false; - } - return { - space: 'HEX', - hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0) - }; - }, - write: colorToString - }, - SIX_CHAR_HEX: { - read: function read(original) { - var test = original.match(/^#([A-F0-9]{6})$/i); - if (test === null) { - return false; - } - return { - space: 'HEX', - hex: parseInt('0x' + test[1].toString(), 0) - }; - }, - write: colorToString - }, - CSS_RGB: { - read: function read(original) { - var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); - if (test === null) { - return false; - } - return { - space: 'RGB', - r: parseFloat(test[1]), - g: parseFloat(test[2]), - b: parseFloat(test[3]) - }; - }, - write: colorToString - }, - CSS_RGBA: { - read: function read(original) { - var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); - if (test === null) { - return false; - } - return { - space: 'RGB', - r: parseFloat(test[1]), - g: parseFloat(test[2]), - b: parseFloat(test[3]), - a: parseFloat(test[4]) - }; - }, - write: colorToString - } - } -}, -{ - litmus: Common.isNumber, - conversions: { - HEX: { - read: function read(original) { - return { - space: 'HEX', - hex: original, - conversionName: 'HEX' - }; - }, - write: function write(color) { - return color.hex; - } - } - } -}, -{ - litmus: Common.isArray, - conversions: { - RGB_ARRAY: { - read: function read(original) { - if (original.length !== 3) { - return false; - } - return { - space: 'RGB', - r: original[0], - g: original[1], - b: original[2] - }; - }, - write: function write(color) { - return [color.r, color.g, color.b]; - } - }, - RGBA_ARRAY: { - read: function read(original) { - if (original.length !== 4) return false; - return { - space: 'RGB', - r: original[0], - g: original[1], - b: original[2], - a: original[3] - }; - }, - write: function write(color) { - return [color.r, color.g, color.b, color.a]; - } - } - } -}, -{ - litmus: Common.isObject, - conversions: { - RGBA_OBJ: { - read: function read(original) { - if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) { - return { - space: 'RGB', - r: original.r, - g: original.g, - b: original.b, - a: original.a - }; - } - return false; - }, - write: function write(color) { - return { - r: color.r, - g: color.g, - b: color.b, - a: color.a - }; - } - }, - RGB_OBJ: { - read: function read(original) { - if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) { - return { - space: 'RGB', - r: original.r, - g: original.g, - b: original.b - }; - } - return false; - }, - write: function write(color) { - return { - r: color.r, - g: color.g, - b: color.b - }; - } - }, - HSVA_OBJ: { - read: function read(original) { - if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) { - return { - space: 'HSV', - h: original.h, - s: original.s, - v: original.v, - a: original.a - }; - } - return false; - }, - write: function write(color) { - return { - h: color.h, - s: color.s, - v: color.v, - a: color.a - }; - } - }, - HSV_OBJ: { - read: function read(original) { - if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) { - return { - space: 'HSV', - h: original.h, - s: original.s, - v: original.v - }; - } - return false; - }, - write: function write(color) { - return { - h: color.h, - s: color.s, - v: color.v - }; - } - } - } -}]; -var result = void 0; -var toReturn = void 0; -var interpret = function interpret() { - toReturn = false; - var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0]; - Common.each(INTERPRETATIONS, function (family) { - if (family.litmus(original)) { - Common.each(family.conversions, function (conversion, conversionName) { - result = conversion.read(original); - if (toReturn === false && result !== false) { - toReturn = result; - result.conversionName = conversionName; - result.conversion = conversion; - return Common.BREAK; - } - }); - return Common.BREAK; - } - }); - return toReturn; -}; - -var tmpComponent = void 0; -var ColorMath = { - hsv_to_rgb: function hsv_to_rgb(h, s, v) { - var hi = Math.floor(h / 60) % 6; - var f = h / 60 - Math.floor(h / 60); - var p = v * (1.0 - s); - var q = v * (1.0 - f * s); - var t = v * (1.0 - (1.0 - f) * s); - var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi]; - return { - r: c[0] * 255, - g: c[1] * 255, - b: c[2] * 255 - }; - }, - rgb_to_hsv: function rgb_to_hsv(r, g, b) { - var min = Math.min(r, g, b); - var max = Math.max(r, g, b); - var delta = max - min; - var h = void 0; - var s = void 0; - if (max !== 0) { - s = delta / max; - } else { - return { - h: NaN, - s: 0, - v: 0 - }; - } - if (r === max) { - h = (g - b) / delta; - } else if (g === max) { - h = 2 + (b - r) / delta; - } else { - h = 4 + (r - g) / delta; - } - h /= 6; - if (h < 0) { - h += 1; - } - return { - h: h * 360, - s: s, - v: max / 255 - }; - }, - rgb_to_hex: function rgb_to_hex(r, g, b) { - var hex = this.hex_with_component(0, 2, r); - hex = this.hex_with_component(hex, 1, g); - hex = this.hex_with_component(hex, 0, b); - return hex; - }, - component_from_hex: function component_from_hex(hex, componentIndex) { - return hex >> componentIndex * 8 & 0xFF; - }, - hex_with_component: function hex_with_component(hex, componentIndex, value) { - return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent); - } -}; - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { - return typeof obj; -} : function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; -}; - - - - - - - - - - - -var classCallCheck = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}; - -var createClass = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; -}(); - - - - - - - -var get = function get(object, property, receiver) { - if (object === null) object = Function.prototype; - var desc = Object.getOwnPropertyDescriptor(object, property); - - if (desc === undefined) { - var parent = Object.getPrototypeOf(object); - - if (parent === null) { - return undefined; - } else { - return get(parent, property, receiver); - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get; - - if (getter === undefined) { - return undefined; - } - - return getter.call(receiver); - } -}; - -var inherits = function (subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: false, - writable: true, - configurable: true - } - }); - if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -}; - - - - - - - - - - - -var possibleConstructorReturn = function (self, call) { - if (!self) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return call && (typeof call === "object" || typeof call === "function") ? call : self; -}; - -var Color = function () { - function Color() { - classCallCheck(this, Color); - this.__state = interpret.apply(this, arguments); - if (this.__state === false) { - throw new Error('Failed to interpret color arguments'); - } - this.__state.a = this.__state.a || 1; - } - createClass(Color, [{ - key: 'toString', - value: function toString() { - return colorToString(this); - } - }, { - key: 'toHexString', - value: function toHexString() { - return colorToString(this, true); - } - }, { - key: 'toOriginal', - value: function toOriginal() { - return this.__state.conversion.write(this); - } - }]); - return Color; -}(); -function defineRGBComponent(target, component, componentHexIndex) { - Object.defineProperty(target, component, { - get: function get$$1() { - if (this.__state.space === 'RGB') { - return this.__state[component]; - } - Color.recalculateRGB(this, component, componentHexIndex); - return this.__state[component]; - }, - set: function set$$1(v) { - if (this.__state.space !== 'RGB') { - Color.recalculateRGB(this, component, componentHexIndex); - this.__state.space = 'RGB'; - } - this.__state[component] = v; - } - }); -} -function defineHSVComponent(target, component) { - Object.defineProperty(target, component, { - get: function get$$1() { - if (this.__state.space === 'HSV') { - return this.__state[component]; - } - Color.recalculateHSV(this); - return this.__state[component]; - }, - set: function set$$1(v) { - if (this.__state.space !== 'HSV') { - Color.recalculateHSV(this); - this.__state.space = 'HSV'; - } - this.__state[component] = v; - } - }); -} -Color.recalculateRGB = function (color, component, componentHexIndex) { - if (color.__state.space === 'HEX') { - color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex); - } else if (color.__state.space === 'HSV') { - Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); - } else { - throw new Error('Corrupted color state'); - } -}; -Color.recalculateHSV = function (color) { - var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b); - Common.extend(color.__state, { - s: result.s, - v: result.v - }); - if (!Common.isNaN(result.h)) { - color.__state.h = result.h; - } else if (Common.isUndefined(color.__state.h)) { - color.__state.h = 0; - } -}; -Color.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a']; -defineRGBComponent(Color.prototype, 'r', 2); -defineRGBComponent(Color.prototype, 'g', 1); -defineRGBComponent(Color.prototype, 'b', 0); -defineHSVComponent(Color.prototype, 'h'); -defineHSVComponent(Color.prototype, 's'); -defineHSVComponent(Color.prototype, 'v'); -Object.defineProperty(Color.prototype, 'a', { - get: function get$$1() { - return this.__state.a; - }, - set: function set$$1(v) { - this.__state.a = v; - } -}); -Object.defineProperty(Color.prototype, 'hex', { - get: function get$$1() { - if (!this.__state.space !== 'HEX') { - this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b); - } - return this.__state.hex; - }, - set: function set$$1(v) { - this.__state.space = 'HEX'; - this.__state.hex = v; - } -}); - -var Controller = function () { - function Controller(object, property) { - classCallCheck(this, Controller); - this.initialValue = object[property]; - this.domElement = document.createElement('div'); - this.object = object; - this.property = property; - this.__onChange = undefined; - this.__onFinishChange = undefined; - } - createClass(Controller, [{ - key: 'onChange', - value: function onChange(fnc) { - this.__onChange = fnc; - return this; - } - }, { - key: 'onFinishChange', - value: function onFinishChange(fnc) { - this.__onFinishChange = fnc; - return this; - } - }, { - key: 'setValue', - value: function setValue(newValue) { - this.object[this.property] = newValue; - if (this.__onChange) { - this.__onChange.call(this, newValue); - } - this.updateDisplay(); - return this; - } - }, { - key: 'getValue', - value: function getValue() { - return this.object[this.property]; - } - }, { - key: 'updateDisplay', - value: function updateDisplay() { - return this; - } - }, { - key: 'isModified', - value: function isModified() { - return this.initialValue !== this.getValue(); - } - }]); - return Controller; -}(); - -var EVENT_MAP = { - HTMLEvents: ['change'], - MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'], - KeyboardEvents: ['keydown'] -}; -var EVENT_MAP_INV = {}; -Common.each(EVENT_MAP, function (v, k) { - Common.each(v, function (e) { - EVENT_MAP_INV[e] = k; - }); -}); -var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; -function cssValueToPixels(val) { - if (val === '0' || Common.isUndefined(val)) { - return 0; - } - var match = val.match(CSS_VALUE_PIXELS); - if (!Common.isNull(match)) { - return parseFloat(match[1]); - } - return 0; -} -var dom = { - makeSelectable: function makeSelectable(elem, selectable) { - if (elem === undefined || elem.style === undefined) return; - elem.onselectstart = selectable ? function () { - return false; - } : function () {}; - elem.style.MozUserSelect = selectable ? 'auto' : 'none'; - elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; - elem.unselectable = selectable ? 'on' : 'off'; - }, - makeFullscreen: function makeFullscreen(elem, hor, vert) { - var vertical = vert; - var horizontal = hor; - if (Common.isUndefined(horizontal)) { - horizontal = true; - } - if (Common.isUndefined(vertical)) { - vertical = true; - } - elem.style.position = 'absolute'; - if (horizontal) { - elem.style.left = 0; - elem.style.right = 0; - } - if (vertical) { - elem.style.top = 0; - elem.style.bottom = 0; - } - }, - fakeEvent: function fakeEvent(elem, eventType, pars, aux) { - var params = pars || {}; - var className = EVENT_MAP_INV[eventType]; - if (!className) { - throw new Error('Event type ' + eventType + ' not supported.'); - } - var evt = document.createEvent(className); - switch (className) { - case 'MouseEvents': - { - var clientX = params.x || params.clientX || 0; - var clientY = params.y || params.clientY || 0; - evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0, - 0, - clientX, - clientY, - false, false, false, false, 0, null); - break; - } - case 'KeyboardEvents': - { - var init = evt.initKeyboardEvent || evt.initKeyEvent; - Common.defaults(params, { - cancelable: true, - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false, - keyCode: undefined, - charCode: undefined - }); - init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode); - break; - } - default: - { - evt.initEvent(eventType, params.bubbles || false, params.cancelable || true); - break; - } - } - Common.defaults(evt, aux); - elem.dispatchEvent(evt); - }, - bind: function bind(elem, event, func, newBool) { - var bool = newBool || false; - if (elem.addEventListener) { - elem.addEventListener(event, func, bool); - } else if (elem.attachEvent) { - elem.attachEvent('on' + event, func); - } - return dom; - }, - unbind: function unbind(elem, event, func, newBool) { - var bool = newBool || false; - if (elem.removeEventListener) { - elem.removeEventListener(event, func, bool); - } else if (elem.detachEvent) { - elem.detachEvent('on' + event, func); - } - return dom; - }, - addClass: function addClass(elem, className) { - if (elem.className === undefined) { - elem.className = className; - } else if (elem.className !== className) { - var classes = elem.className.split(/ +/); - if (classes.indexOf(className) === -1) { - classes.push(className); - elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); - } - } - return dom; - }, - removeClass: function removeClass(elem, className) { - if (className) { - if (elem.className === className) { - elem.removeAttribute('class'); - } else { - var classes = elem.className.split(/ +/); - var index = classes.indexOf(className); - if (index !== -1) { - classes.splice(index, 1); - elem.className = classes.join(' '); - } - } - } else { - elem.className = undefined; - } - return dom; - }, - hasClass: function hasClass(elem, className) { - return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; - }, - getWidth: function getWidth(elem) { - var style = getComputedStyle(elem); - return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width); - }, - getHeight: function getHeight(elem) { - var style = getComputedStyle(elem); - return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height); - }, - getOffset: function getOffset(el) { - var elem = el; - var offset = { left: 0, top: 0 }; - if (elem.offsetParent) { - do { - offset.left += elem.offsetLeft; - offset.top += elem.offsetTop; - elem = elem.offsetParent; - } while (elem); - } - return offset; - }, - isActive: function isActive(elem) { - return elem === document.activeElement && (elem.type || elem.href); - } -}; - -var BooleanController = function (_Controller) { - inherits(BooleanController, _Controller); - function BooleanController(object, property) { - classCallCheck(this, BooleanController); - var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property)); - var _this = _this2; - _this2.__prev = _this2.getValue(); - _this2.__checkbox = document.createElement('input'); - _this2.__checkbox.setAttribute('type', 'checkbox'); - function onChange() { - _this.setValue(!_this.__prev); - } - dom.bind(_this2.__checkbox, 'change', onChange, false); - _this2.domElement.appendChild(_this2.__checkbox); - _this2.updateDisplay(); - return _this2; - } - createClass(BooleanController, [{ - key: 'setValue', - value: function setValue(v) { - var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - this.__prev = this.getValue(); - return toReturn; - } - }, { - key: 'updateDisplay', - value: function updateDisplay() { - if (this.getValue() === true) { - this.__checkbox.setAttribute('checked', 'checked'); - this.__checkbox.checked = true; - this.__prev = true; - } else { - this.__checkbox.checked = false; - this.__prev = false; - } - return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this); - } - }]); - return BooleanController; -}(Controller); - -var OptionController = function (_Controller) { - inherits(OptionController, _Controller); - function OptionController(object, property, opts) { - classCallCheck(this, OptionController); - var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property)); - var options = opts; - var _this = _this2; - _this2.__select = document.createElement('select'); - if (Common.isArray(options)) { - var map = {}; - Common.each(options, function (element) { - map[element] = element; - }); - options = map; - } - Common.each(options, function (value, key) { - var opt = document.createElement('option'); - opt.innerHTML = key; - opt.setAttribute('value', value); - _this.__select.appendChild(opt); - }); - _this2.updateDisplay(); - dom.bind(_this2.__select, 'change', function () { - var desiredValue = this.options[this.selectedIndex].value; - _this.setValue(desiredValue); - }); - _this2.domElement.appendChild(_this2.__select); - return _this2; - } - createClass(OptionController, [{ - key: 'setValue', - value: function setValue(v) { - var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - return toReturn; - } - }, { - key: 'updateDisplay', - value: function updateDisplay() { - if (dom.isActive(this.__select)) return this; - this.__select.value = this.getValue(); - return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this); - } - }]); - return OptionController; -}(Controller); - -var StringController = function (_Controller) { - inherits(StringController, _Controller); - function StringController(object, property) { - classCallCheck(this, StringController); - var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property)); - var _this = _this2; - function onChange() { - _this.setValue(_this.__input.value); - } - function onBlur() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - _this2.__input = document.createElement('input'); - _this2.__input.setAttribute('type', 'text'); - dom.bind(_this2.__input, 'keyup', onChange); - dom.bind(_this2.__input, 'change', onChange); - dom.bind(_this2.__input, 'blur', onBlur); - dom.bind(_this2.__input, 'keydown', function (e) { - if (e.keyCode === 13) { - this.blur(); - } - }); - _this2.updateDisplay(); - _this2.domElement.appendChild(_this2.__input); - return _this2; - } - createClass(StringController, [{ - key: 'updateDisplay', - value: function updateDisplay() { - if (!dom.isActive(this.__input)) { - this.__input.value = this.getValue(); - } - return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this); - } - }]); - return StringController; -}(Controller); - -function numDecimals(x) { - var _x = x.toString(); - if (_x.indexOf('.') > -1) { - return _x.length - _x.indexOf('.') - 1; - } - return 0; -} -var NumberController = function (_Controller) { - inherits(NumberController, _Controller); - function NumberController(object, property, params) { - classCallCheck(this, NumberController); - var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property)); - var _params = params || {}; - _this.__min = _params.min; - _this.__max = _params.max; - _this.__step = _params.step; - if (Common.isUndefined(_this.__step)) { - if (_this.initialValue === 0) { - _this.__impliedStep = 1; - } else { - _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10; - } - } else { - _this.__impliedStep = _this.__step; - } - _this.__precision = numDecimals(_this.__impliedStep); - return _this; - } - createClass(NumberController, [{ - key: 'setValue', - value: function setValue(v) { - var _v = v; - if (this.__min !== undefined && _v < this.__min) { - _v = this.__min; - } else if (this.__max !== undefined && _v > this.__max) { - _v = this.__max; - } - if (this.__step !== undefined && _v % this.__step !== 0) { - _v = Math.round(_v / this.__step) * this.__step; - } - return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v); - } - }, { - key: 'min', - value: function min(minValue) { - this.__min = minValue; - return this; - } - }, { - key: 'max', - value: function max(maxValue) { - this.__max = maxValue; - return this; - } - }, { - key: 'step', - value: function step(stepValue) { - this.__step = stepValue; - this.__impliedStep = stepValue; - this.__precision = numDecimals(stepValue); - return this; - } - }]); - return NumberController; -}(Controller); - -function roundToDecimal(value, decimals) { - var tenTo = Math.pow(10, decimals); - return Math.round(value * tenTo) / tenTo; -} -var NumberControllerBox = function (_NumberController) { - inherits(NumberControllerBox, _NumberController); - function NumberControllerBox(object, property, params) { - classCallCheck(this, NumberControllerBox); - var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params)); - _this2.__truncationSuspended = false; - var _this = _this2; - var prevY = void 0; - function onChange() { - var attempted = parseFloat(_this.__input.value); - if (!Common.isNaN(attempted)) { - _this.setValue(attempted); - } - } - function onFinish() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - function onBlur() { - onFinish(); - } - function onMouseDrag(e) { - var diff = prevY - e.clientY; - _this.setValue(_this.getValue() + diff * _this.__impliedStep); - prevY = e.clientY; - } - function onMouseUp() { - dom.unbind(window, 'mousemove', onMouseDrag); - dom.unbind(window, 'mouseup', onMouseUp); - onFinish(); - } - function onMouseDown(e) { - dom.bind(window, 'mousemove', onMouseDrag); - dom.bind(window, 'mouseup', onMouseUp); - prevY = e.clientY; - } - _this2.__input = document.createElement('input'); - _this2.__input.setAttribute('type', 'text'); - dom.bind(_this2.__input, 'change', onChange); - dom.bind(_this2.__input, 'blur', onBlur); - dom.bind(_this2.__input, 'mousedown', onMouseDown); - dom.bind(_this2.__input, 'keydown', function (e) { - if (e.keyCode === 13) { - _this.__truncationSuspended = true; - this.blur(); - _this.__truncationSuspended = false; - onFinish(); - } - }); - _this2.updateDisplay(); - _this2.domElement.appendChild(_this2.__input); - return _this2; - } - createClass(NumberControllerBox, [{ - key: 'updateDisplay', - value: function updateDisplay() { - this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); - return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this); - } - }]); - return NumberControllerBox; -}(NumberController); - -function map(v, i1, i2, o1, o2) { - return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); -} -var NumberControllerSlider = function (_NumberController) { - inherits(NumberControllerSlider, _NumberController); - function NumberControllerSlider(object, property, min, max, step) { - classCallCheck(this, NumberControllerSlider); - var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step })); - var _this = _this2; - _this2.__background = document.createElement('div'); - _this2.__foreground = document.createElement('div'); - dom.bind(_this2.__background, 'mousedown', onMouseDown); - dom.bind(_this2.__background, 'touchstart', onTouchStart); - dom.addClass(_this2.__background, 'slider'); - dom.addClass(_this2.__foreground, 'slider-fg'); - function onMouseDown(e) { - document.activeElement.blur(); - dom.bind(window, 'mousemove', onMouseDrag); - dom.bind(window, 'mouseup', onMouseUp); - onMouseDrag(e); - } - function onMouseDrag(e) { - e.preventDefault(); - var bgRect = _this.__background.getBoundingClientRect(); - _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); - return false; - } - function onMouseUp() { - dom.unbind(window, 'mousemove', onMouseDrag); - dom.unbind(window, 'mouseup', onMouseUp); - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - function onTouchStart(e) { - if (e.touches.length !== 1) { - return; - } - dom.bind(window, 'touchmove', onTouchMove); - dom.bind(window, 'touchend', onTouchEnd); - onTouchMove(e); - } - function onTouchMove(e) { - var clientX = e.touches[0].clientX; - var bgRect = _this.__background.getBoundingClientRect(); - _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); - } - function onTouchEnd() { - dom.unbind(window, 'touchmove', onTouchMove); - dom.unbind(window, 'touchend', onTouchEnd); - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - _this2.updateDisplay(); - _this2.__background.appendChild(_this2.__foreground); - _this2.domElement.appendChild(_this2.__background); - return _this2; - } - createClass(NumberControllerSlider, [{ - key: 'updateDisplay', - value: function updateDisplay() { - var pct = (this.getValue() - this.__min) / (this.__max - this.__min); - this.__foreground.style.width = pct * 100 + '%'; - return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this); - } - }]); - return NumberControllerSlider; -}(NumberController); - -var FunctionController = function (_Controller) { - inherits(FunctionController, _Controller); - function FunctionController(object, property, text) { - classCallCheck(this, FunctionController); - var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property)); - var _this = _this2; - _this2.__button = document.createElement('div'); - _this2.__button.innerHTML = text === undefined ? 'Fire' : text; - dom.bind(_this2.__button, 'click', function (e) { - e.preventDefault(); - _this.fire(); - return false; - }); - dom.addClass(_this2.__button, 'button'); - _this2.domElement.appendChild(_this2.__button); - return _this2; - } - createClass(FunctionController, [{ - key: 'fire', - value: function fire() { - if (this.__onChange) { - this.__onChange.call(this); - } - this.getValue().call(this.object); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - } - }]); - return FunctionController; -}(Controller); - -var ColorController = function (_Controller) { - inherits(ColorController, _Controller); - function ColorController(object, property) { - classCallCheck(this, ColorController); - var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property)); - _this2.__color = new Color(_this2.getValue()); - _this2.__temp = new Color(0); - var _this = _this2; - _this2.domElement = document.createElement('div'); - dom.makeSelectable(_this2.domElement, false); - _this2.__selector = document.createElement('div'); - _this2.__selector.className = 'selector'; - _this2.__saturation_field = document.createElement('div'); - _this2.__saturation_field.className = 'saturation-field'; - _this2.__field_knob = document.createElement('div'); - _this2.__field_knob.className = 'field-knob'; - _this2.__field_knob_border = '2px solid '; - _this2.__hue_knob = document.createElement('div'); - _this2.__hue_knob.className = 'hue-knob'; - _this2.__hue_field = document.createElement('div'); - _this2.__hue_field.className = 'hue-field'; - _this2.__input = document.createElement('input'); - _this2.__input.type = 'text'; - _this2.__input_textShadow = '0 1px 1px '; - dom.bind(_this2.__input, 'keydown', function (e) { - if (e.keyCode === 13) { - onBlur.call(this); - } - }); - dom.bind(_this2.__input, 'blur', onBlur); - dom.bind(_this2.__selector, 'mousedown', function () { - dom.addClass(this, 'drag').bind(window, 'mouseup', function () { - dom.removeClass(_this.__selector, 'drag'); - }); - }); - dom.bind(_this2.__selector, 'touchstart', function () { - dom.addClass(this, 'drag').bind(window, 'touchend', function () { - dom.removeClass(_this.__selector, 'drag'); - }); - }); - var valueField = document.createElement('div'); - Common.extend(_this2.__selector.style, { - width: '122px', - height: '102px', - padding: '3px', - backgroundColor: '#222', - boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' - }); - Common.extend(_this2.__field_knob.style, { - position: 'absolute', - width: '12px', - height: '12px', - border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'), - boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', - borderRadius: '12px', - zIndex: 1 - }); - Common.extend(_this2.__hue_knob.style, { - position: 'absolute', - width: '15px', - height: '2px', - borderRight: '4px solid #fff', - zIndex: 1 - }); - Common.extend(_this2.__saturation_field.style, { - width: '100px', - height: '100px', - border: '1px solid #555', - marginRight: '3px', - display: 'inline-block', - cursor: 'pointer' - }); - Common.extend(valueField.style, { - width: '100%', - height: '100%', - background: 'none' - }); - linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000'); - Common.extend(_this2.__hue_field.style, { - width: '15px', - height: '100px', - border: '1px solid #555', - cursor: 'ns-resize', - position: 'absolute', - top: '3px', - right: '3px' - }); - hueGradient(_this2.__hue_field); - Common.extend(_this2.__input.style, { - outline: 'none', - textAlign: 'center', - color: '#fff', - border: 0, - fontWeight: 'bold', - textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)' - }); - dom.bind(_this2.__saturation_field, 'mousedown', fieldDown); - dom.bind(_this2.__saturation_field, 'touchstart', fieldDown); - dom.bind(_this2.__field_knob, 'mousedown', fieldDown); - dom.bind(_this2.__field_knob, 'touchstart', fieldDown); - dom.bind(_this2.__hue_field, 'mousedown', fieldDownH); - dom.bind(_this2.__hue_field, 'touchstart', fieldDownH); - function fieldDown(e) { - setSV(e); - dom.bind(window, 'mousemove', setSV); - dom.bind(window, 'touchmove', setSV); - dom.bind(window, 'mouseup', fieldUpSV); - dom.bind(window, 'touchend', fieldUpSV); - } - function fieldDownH(e) { - setH(e); - dom.bind(window, 'mousemove', setH); - dom.bind(window, 'touchmove', setH); - dom.bind(window, 'mouseup', fieldUpH); - dom.bind(window, 'touchend', fieldUpH); - } - function fieldUpSV() { - dom.unbind(window, 'mousemove', setSV); - dom.unbind(window, 'touchmove', setSV); - dom.unbind(window, 'mouseup', fieldUpSV); - dom.unbind(window, 'touchend', fieldUpSV); - onFinish(); - } - function fieldUpH() { - dom.unbind(window, 'mousemove', setH); - dom.unbind(window, 'touchmove', setH); - dom.unbind(window, 'mouseup', fieldUpH); - dom.unbind(window, 'touchend', fieldUpH); - onFinish(); - } - function onBlur() { - var i = interpret(this.value); - if (i !== false) { - _this.__color.__state = i; - _this.setValue(_this.__color.toOriginal()); - } else { - this.value = _this.__color.toString(); - } - } - function onFinish() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.__color.toOriginal()); - } - } - _this2.__saturation_field.appendChild(valueField); - _this2.__selector.appendChild(_this2.__field_knob); - _this2.__selector.appendChild(_this2.__saturation_field); - _this2.__selector.appendChild(_this2.__hue_field); - _this2.__hue_field.appendChild(_this2.__hue_knob); - _this2.domElement.appendChild(_this2.__input); - _this2.domElement.appendChild(_this2.__selector); - _this2.updateDisplay(); - function setSV(e) { - if (e.type.indexOf('touch') === -1) { - e.preventDefault(); - } - var fieldRect = _this.__saturation_field.getBoundingClientRect(); - var _ref = e.touches && e.touches[0] || e, - clientX = _ref.clientX, - clientY = _ref.clientY; - var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left); - var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); - if (v > 1) { - v = 1; - } else if (v < 0) { - v = 0; - } - if (s > 1) { - s = 1; - } else if (s < 0) { - s = 0; - } - _this.__color.v = v; - _this.__color.s = s; - _this.setValue(_this.__color.toOriginal()); - return false; - } - function setH(e) { - if (e.type.indexOf('touch') === -1) { - e.preventDefault(); - } - var fieldRect = _this.__hue_field.getBoundingClientRect(); - var _ref2 = e.touches && e.touches[0] || e, - clientY = _ref2.clientY; - var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); - if (h > 1) { - h = 1; - } else if (h < 0) { - h = 0; - } - _this.__color.h = h * 360; - _this.setValue(_this.__color.toOriginal()); - return false; - } - return _this2; - } - createClass(ColorController, [{ - key: 'updateDisplay', - value: function updateDisplay() { - var i = interpret(this.getValue()); - if (i !== false) { - var mismatch = false; - Common.each(Color.COMPONENTS, function (component) { - if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) { - mismatch = true; - return {}; - } - }, this); - if (mismatch) { - Common.extend(this.__color.__state, i); - } - } - Common.extend(this.__temp.__state, this.__color.__state); - this.__temp.a = 1; - var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0; - var _flip = 255 - flip; - Common.extend(this.__field_knob.style, { - marginLeft: 100 * this.__color.s - 7 + 'px', - marginTop: 100 * (1 - this.__color.v) - 7 + 'px', - backgroundColor: this.__temp.toHexString(), - border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')' - }); - this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'; - this.__temp.s = 1; - this.__temp.v = 1; - linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString()); - this.__input.value = this.__color.toString(); - Common.extend(this.__input.style, { - backgroundColor: this.__color.toHexString(), - color: 'rgb(' + flip + ',' + flip + ',' + flip + ')', - textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)' - }); - } - }]); - return ColorController; -}(Controller); -var vendors = ['-moz-', '-o-', '-webkit-', '-ms-', '']; -function linearGradient(elem, x, a, b) { - elem.style.background = ''; - Common.each(vendors, function (vendor) { - elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); '; - }); -} -function hueGradient(elem) { - elem.style.background = ''; - elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'; - elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; -} - -var css = { - load: function load(url, indoc) { - var doc = indoc || document; - var link = doc.createElement('link'); - link.type = 'text/css'; - link.rel = 'stylesheet'; - link.href = url; - doc.getElementsByTagName('head')[0].appendChild(link); - }, - inject: function inject(cssContent, indoc) { - var doc = indoc || document; - var injected = document.createElement('style'); - injected.type = 'text/css'; - injected.innerHTML = cssContent; - var head = doc.getElementsByTagName('head')[0]; - try { - head.appendChild(injected); - } catch (e) { - } - } -}; - -var saveDialogContents = "
        \n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
        \n\n Automatically save\n values to localStorage on exit.\n\n
        The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
        \n\n
        \n\n
        "; - -var ControllerFactory = function ControllerFactory(object, property) { - var initialValue = object[property]; - if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) { - return new OptionController(object, property, arguments[2]); - } - if (Common.isNumber(initialValue)) { - if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) { - if (Common.isNumber(arguments[4])) { - return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]); - } - return new NumberControllerSlider(object, property, arguments[2], arguments[3]); - } - if (Common.isNumber(arguments[4])) { - return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] }); - } - return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); - } - if (Common.isString(initialValue)) { - return new StringController(object, property); - } - if (Common.isFunction(initialValue)) { - return new FunctionController(object, property, ''); - } - if (Common.isBoolean(initialValue)) { - return new BooleanController(object, property); - } - return null; -}; - -function requestAnimationFrame(callback) { - setTimeout(callback, 1000 / 60); -} -var requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame; - -var CenteredDiv = function () { - function CenteredDiv() { - classCallCheck(this, CenteredDiv); - this.backgroundElement = document.createElement('div'); - Common.extend(this.backgroundElement.style, { - backgroundColor: 'rgba(0,0,0,0.8)', - top: 0, - left: 0, - display: 'none', - zIndex: '1000', - opacity: 0, - WebkitTransition: 'opacity 0.2s linear', - transition: 'opacity 0.2s linear' - }); - dom.makeFullscreen(this.backgroundElement); - this.backgroundElement.style.position = 'fixed'; - this.domElement = document.createElement('div'); - Common.extend(this.domElement.style, { - position: 'fixed', - display: 'none', - zIndex: '1001', - opacity: 0, - WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear', - transition: 'transform 0.2s ease-out, opacity 0.2s linear' - }); - document.body.appendChild(this.backgroundElement); - document.body.appendChild(this.domElement); - var _this = this; - dom.bind(this.backgroundElement, 'click', function () { - _this.hide(); - }); - } - createClass(CenteredDiv, [{ - key: 'show', - value: function show() { - var _this = this; - this.backgroundElement.style.display = 'block'; - this.domElement.style.display = 'block'; - this.domElement.style.opacity = 0; - this.domElement.style.webkitTransform = 'scale(1.1)'; - this.layout(); - Common.defer(function () { - _this.backgroundElement.style.opacity = 1; - _this.domElement.style.opacity = 1; - _this.domElement.style.webkitTransform = 'scale(1)'; - }); - } - }, { - key: 'hide', - value: function hide() { - var _this = this; - var hide = function hide() { - _this.domElement.style.display = 'none'; - _this.backgroundElement.style.display = 'none'; - dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); - dom.unbind(_this.domElement, 'transitionend', hide); - dom.unbind(_this.domElement, 'oTransitionEnd', hide); - }; - dom.bind(this.domElement, 'webkitTransitionEnd', hide); - dom.bind(this.domElement, 'transitionend', hide); - dom.bind(this.domElement, 'oTransitionEnd', hide); - this.backgroundElement.style.opacity = 0; - this.domElement.style.opacity = 0; - this.domElement.style.webkitTransform = 'scale(1.1)'; - } - }, { - key: 'layout', - value: function layout() { - this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px'; - this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px'; - } - }]); - return CenteredDiv; -}(); - -var styleSheet = ___$insertStyle(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"); - -css.inject(styleSheet); -var CSS_NAMESPACE = 'dg'; -var HIDE_KEY_CODE = 72; -var CLOSE_BUTTON_HEIGHT = 20; -var DEFAULT_DEFAULT_PRESET_NAME = 'Default'; -var SUPPORTS_LOCAL_STORAGE = function () { - try { - return !!window.localStorage; - } catch (e) { - return false; - } -}(); -var SAVE_DIALOGUE = void 0; -var autoPlaceVirgin = true; -var autoPlaceContainer = void 0; -var hide = false; -var hideableGuis = []; -var GUI = function GUI(pars) { - var _this = this; - var params = pars || {}; - this.domElement = document.createElement('div'); - this.__ul = document.createElement('ul'); - this.domElement.appendChild(this.__ul); - dom.addClass(this.domElement, CSS_NAMESPACE); - this.__folders = {}; - this.__controllers = []; - this.__rememberedObjects = []; - this.__rememberedObjectIndecesToControllers = []; - this.__listening = []; - params = Common.defaults(params, { - closeOnTop: false, - autoPlace: true, - width: GUI.DEFAULT_WIDTH - }); - params = Common.defaults(params, { - resizable: params.autoPlace, - hideable: params.autoPlace - }); - if (!Common.isUndefined(params.load)) { - if (params.preset) { - params.load.preset = params.preset; - } - } else { - params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; - } - if (Common.isUndefined(params.parent) && params.hideable) { - hideableGuis.push(this); - } - params.resizable = Common.isUndefined(params.parent) && params.resizable; - if (params.autoPlace && Common.isUndefined(params.scrollable)) { - params.scrollable = true; - } - var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; - var saveToLocalStorage = void 0; - var titleRow = void 0; - Object.defineProperties(this, - { - parent: { - get: function get$$1() { - return params.parent; - } - }, - scrollable: { - get: function get$$1() { - return params.scrollable; - } - }, - autoPlace: { - get: function get$$1() { - return params.autoPlace; - } - }, - closeOnTop: { - get: function get$$1() { - return params.closeOnTop; - } - }, - preset: { - get: function get$$1() { - if (_this.parent) { - return _this.getRoot().preset; - } - return params.load.preset; - }, - set: function set$$1(v) { - if (_this.parent) { - _this.getRoot().preset = v; - } else { - params.load.preset = v; - } - setPresetSelectIndex(this); - _this.revert(); - } - }, - width: { - get: function get$$1() { - return params.width; - }, - set: function set$$1(v) { - params.width = v; - setWidth(_this, v); - } - }, - name: { - get: function get$$1() { - return params.name; - }, - set: function set$$1(v) { - params.name = v; - if (titleRow) { - titleRow.innerHTML = params.name; - } - } - }, - closed: { - get: function get$$1() { - return params.closed; - }, - set: function set$$1(v) { - params.closed = v; - if (params.closed) { - dom.addClass(_this.__ul, GUI.CLASS_CLOSED); - } else { - dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); - } - this.onResize(); - if (_this.__closeButton) { - _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; - } - } - }, - load: { - get: function get$$1() { - return params.load; - } - }, - useLocalStorage: { - get: function get$$1() { - return useLocalStorage; - }, - set: function set$$1(bool) { - if (SUPPORTS_LOCAL_STORAGE) { - useLocalStorage = bool; - if (bool) { - dom.bind(window, 'unload', saveToLocalStorage); - } else { - dom.unbind(window, 'unload', saveToLocalStorage); - } - localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); - } - } - } - }); - if (Common.isUndefined(params.parent)) { - this.closed = params.closed || false; - dom.addClass(this.domElement, GUI.CLASS_MAIN); - dom.makeSelectable(this.domElement, false); - if (SUPPORTS_LOCAL_STORAGE) { - if (useLocalStorage) { - _this.useLocalStorage = true; - var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui')); - if (savedGui) { - params.load = JSON.parse(savedGui); - } - } - } - this.__closeButton = document.createElement('div'); - this.__closeButton.innerHTML = GUI.TEXT_CLOSED; - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); - if (params.closeOnTop) { - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP); - this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]); - } else { - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM); - this.domElement.appendChild(this.__closeButton); - } - dom.bind(this.__closeButton, 'click', function () { - _this.closed = !_this.closed; - }); - } else { - if (params.closed === undefined) { - params.closed = true; - } - var titleRowName = document.createTextNode(params.name); - dom.addClass(titleRowName, 'controller-name'); - titleRow = addRow(_this, titleRowName); - var onClickTitle = function onClickTitle(e) { - e.preventDefault(); - _this.closed = !_this.closed; - return false; - }; - dom.addClass(this.__ul, GUI.CLASS_CLOSED); - dom.addClass(titleRow, 'title'); - dom.bind(titleRow, 'click', onClickTitle); - if (!params.closed) { - this.closed = false; - } - } - if (params.autoPlace) { - if (Common.isUndefined(params.parent)) { - if (autoPlaceVirgin) { - autoPlaceContainer = document.createElement('div'); - dom.addClass(autoPlaceContainer, CSS_NAMESPACE); - dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER); - document.body.appendChild(autoPlaceContainer); - autoPlaceVirgin = false; - } - autoPlaceContainer.appendChild(this.domElement); - dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); - } - if (!this.parent) { - setWidth(_this, params.width); - } - } - this.__resizeHandler = function () { - _this.onResizeDebounced(); - }; - dom.bind(window, 'resize', this.__resizeHandler); - dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler); - dom.bind(this.__ul, 'transitionend', this.__resizeHandler); - dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler); - this.onResize(); - if (params.resizable) { - addResizeHandle(this); - } - saveToLocalStorage = function saveToLocalStorage() { - if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') { - localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); - } - }; - this.saveToLocalStorageIfPossible = saveToLocalStorage; - function resetWidth() { - var root = _this.getRoot(); - root.width += 1; - Common.defer(function () { - root.width -= 1; - }); - } - if (!params.parent) { - resetWidth(); - } -}; -GUI.toggleHide = function () { - hide = !hide; - Common.each(hideableGuis, function (gui) { - gui.domElement.style.display = hide ? 'none' : ''; - }); -}; -GUI.CLASS_AUTO_PLACE = 'a'; -GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; -GUI.CLASS_MAIN = 'main'; -GUI.CLASS_CONTROLLER_ROW = 'cr'; -GUI.CLASS_TOO_TALL = 'taller-than-window'; -GUI.CLASS_CLOSED = 'closed'; -GUI.CLASS_CLOSE_BUTTON = 'close-button'; -GUI.CLASS_CLOSE_TOP = 'close-top'; -GUI.CLASS_CLOSE_BOTTOM = 'close-bottom'; -GUI.CLASS_DRAG = 'drag'; -GUI.DEFAULT_WIDTH = 245; -GUI.TEXT_CLOSED = 'Close Controls'; -GUI.TEXT_OPEN = 'Open Controls'; -GUI._keydownHandler = function (e) { - if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) { - GUI.toggleHide(); - } -}; -dom.bind(window, 'keydown', GUI._keydownHandler, false); -Common.extend(GUI.prototype, -{ - add: function add(object, property) { - return _add(this, object, property, { - factoryArgs: Array.prototype.slice.call(arguments, 2) - }); - }, - addColor: function addColor(object, property) { - return _add(this, object, property, { - color: true - }); - }, - remove: function remove(controller) { - this.__ul.removeChild(controller.__li); - this.__controllers.splice(this.__controllers.indexOf(controller), 1); - var _this = this; - Common.defer(function () { - _this.onResize(); - }); - }, - destroy: function destroy() { - if (this.parent) { - throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.'); - } - if (this.autoPlace) { - autoPlaceContainer.removeChild(this.domElement); - } - var _this = this; - Common.each(this.__folders, function (subfolder) { - _this.removeFolder(subfolder); - }); - dom.unbind(window, 'keydown', GUI._keydownHandler, false); - removeListeners(this); - }, - addFolder: function addFolder(name) { - if (this.__folders[name] !== undefined) { - throw new Error('You already have a folder in this GUI by the' + ' name "' + name + '"'); - } - var newGuiParams = { name: name, parent: this }; - newGuiParams.autoPlace = this.autoPlace; - if (this.load && - this.load.folders && - this.load.folders[name]) { - newGuiParams.closed = this.load.folders[name].closed; - newGuiParams.load = this.load.folders[name]; - } - var gui = new GUI(newGuiParams); - this.__folders[name] = gui; - var li = addRow(this, gui.domElement); - dom.addClass(li, 'folder'); - return gui; - }, - removeFolder: function removeFolder(folder) { - this.__ul.removeChild(folder.domElement.parentElement); - delete this.__folders[folder.name]; - if (this.load && - this.load.folders && - this.load.folders[folder.name]) { - delete this.load.folders[folder.name]; - } - removeListeners(folder); - var _this = this; - Common.each(folder.__folders, function (subfolder) { - folder.removeFolder(subfolder); - }); - Common.defer(function () { - _this.onResize(); - }); - }, - open: function open() { - this.closed = false; - }, - close: function close() { - this.closed = true; - }, - hide: function hide() { - this.domElement.style.display = 'none'; - }, - show: function show() { - this.domElement.style.display = ''; - }, - onResize: function onResize() { - var root = this.getRoot(); - if (root.scrollable) { - var top = dom.getOffset(root.__ul).top; - var h = 0; - Common.each(root.__ul.childNodes, function (node) { - if (!(root.autoPlace && node === root.__save_row)) { - h += dom.getHeight(node); - } - }); - if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { - dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); - root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; - } else { - dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); - root.__ul.style.height = 'auto'; - } - } - if (root.__resize_handle) { - Common.defer(function () { - root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; - }); - } - if (root.__closeButton) { - root.__closeButton.style.width = root.width + 'px'; - } - }, - onResizeDebounced: Common.debounce(function () { - this.onResize(); - }, 50), - remember: function remember() { - if (Common.isUndefined(SAVE_DIALOGUE)) { - SAVE_DIALOGUE = new CenteredDiv(); - SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents; - } - if (this.parent) { - throw new Error('You can only call remember on a top level GUI.'); - } - var _this = this; - Common.each(Array.prototype.slice.call(arguments), function (object) { - if (_this.__rememberedObjects.length === 0) { - addSaveMenu(_this); - } - if (_this.__rememberedObjects.indexOf(object) === -1) { - _this.__rememberedObjects.push(object); - } - }); - if (this.autoPlace) { - setWidth(this, this.width); - } - }, - getRoot: function getRoot() { - var gui = this; - while (gui.parent) { - gui = gui.parent; - } - return gui; - }, - getSaveObject: function getSaveObject() { - var toReturn = this.load; - toReturn.closed = this.closed; - if (this.__rememberedObjects.length > 0) { - toReturn.preset = this.preset; - if (!toReturn.remembered) { - toReturn.remembered = {}; - } - toReturn.remembered[this.preset] = getCurrentPreset(this); - } - toReturn.folders = {}; - Common.each(this.__folders, function (element, key) { - toReturn.folders[key] = element.getSaveObject(); - }); - return toReturn; - }, - save: function save() { - if (!this.load.remembered) { - this.load.remembered = {}; - } - this.load.remembered[this.preset] = getCurrentPreset(this); - markPresetModified(this, false); - this.saveToLocalStorageIfPossible(); - }, - saveAs: function saveAs(presetName) { - if (!this.load.remembered) { - this.load.remembered = {}; - this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); - } - this.load.remembered[presetName] = getCurrentPreset(this); - this.preset = presetName; - addPresetOption(this, presetName, true); - this.saveToLocalStorageIfPossible(); - }, - revert: function revert(gui) { - Common.each(this.__controllers, function (controller) { - if (!this.getRoot().load.remembered) { - controller.setValue(controller.initialValue); - } else { - recallSavedValue(gui || this.getRoot(), controller); - } - if (controller.__onFinishChange) { - controller.__onFinishChange.call(controller, controller.getValue()); - } - }, this); - Common.each(this.__folders, function (folder) { - folder.revert(folder); - }); - if (!gui) { - markPresetModified(this.getRoot(), false); - } - }, - listen: function listen(controller) { - var init = this.__listening.length === 0; - this.__listening.push(controller); - if (init) { - updateDisplays(this.__listening); - } - }, - updateDisplay: function updateDisplay() { - Common.each(this.__controllers, function (controller) { - controller.updateDisplay(); - }); - Common.each(this.__folders, function (folder) { - folder.updateDisplay(); - }); - } -}); -function addRow(gui, newDom, liBefore) { - var li = document.createElement('li'); - if (newDom) { - li.appendChild(newDom); - } - if (liBefore) { - gui.__ul.insertBefore(li, liBefore); - } else { - gui.__ul.appendChild(li); - } - gui.onResize(); - return li; -} -function removeListeners(gui) { - dom.unbind(window, 'resize', gui.__resizeHandler); - if (gui.saveToLocalStorageIfPossible) { - dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible); - } -} -function markPresetModified(gui, modified) { - var opt = gui.__preset_select[gui.__preset_select.selectedIndex]; - if (modified) { - opt.innerHTML = opt.value + '*'; - } else { - opt.innerHTML = opt.value; - } -} -function augmentController(gui, li, controller) { - controller.__li = li; - controller.__gui = gui; - Common.extend(controller, { - options: function options(_options) { - if (arguments.length > 1) { - var nextSibling = controller.__li.nextElementSibling; - controller.remove(); - return _add(gui, controller.object, controller.property, { - before: nextSibling, - factoryArgs: [Common.toArray(arguments)] - }); - } - if (Common.isArray(_options) || Common.isObject(_options)) { - var _nextSibling = controller.__li.nextElementSibling; - controller.remove(); - return _add(gui, controller.object, controller.property, { - before: _nextSibling, - factoryArgs: [_options] - }); - } - }, - name: function name(_name) { - controller.__li.firstElementChild.firstElementChild.innerHTML = _name; - return controller; - }, - listen: function listen() { - controller.__gui.listen(controller); - return controller; - }, - remove: function remove() { - controller.__gui.remove(controller); - return controller; - } - }); - if (controller instanceof NumberControllerSlider) { - var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step }); - Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) { - var pc = controller[method]; - var pb = box[method]; - controller[method] = box[method] = function () { - var args = Array.prototype.slice.call(arguments); - pb.apply(box, args); - return pc.apply(controller, args); - }; - }); - dom.addClass(li, 'has-slider'); - controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); - } else if (controller instanceof NumberControllerBox) { - var r = function r(returned) { - if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) { - var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML; - var wasListening = controller.__gui.__listening.indexOf(controller) > -1; - controller.remove(); - var newController = _add(gui, controller.object, controller.property, { - before: controller.__li.nextElementSibling, - factoryArgs: [controller.__min, controller.__max, controller.__step] - }); - newController.name(oldName); - if (wasListening) newController.listen(); - return newController; - } - return returned; - }; - controller.min = Common.compose(r, controller.min); - controller.max = Common.compose(r, controller.max); - } else if (controller instanceof BooleanController) { - dom.bind(li, 'click', function () { - dom.fakeEvent(controller.__checkbox, 'click'); - }); - dom.bind(controller.__checkbox, 'click', function (e) { - e.stopPropagation(); - }); - } else if (controller instanceof FunctionController) { - dom.bind(li, 'click', function () { - dom.fakeEvent(controller.__button, 'click'); - }); - dom.bind(li, 'mouseover', function () { - dom.addClass(controller.__button, 'hover'); - }); - dom.bind(li, 'mouseout', function () { - dom.removeClass(controller.__button, 'hover'); - }); - } else if (controller instanceof ColorController) { - dom.addClass(li, 'color'); - controller.updateDisplay = Common.compose(function (val) { - li.style.borderLeftColor = controller.__color.toString(); - return val; - }, controller.updateDisplay); - controller.updateDisplay(); - } - controller.setValue = Common.compose(function (val) { - if (gui.getRoot().__preset_select && controller.isModified()) { - markPresetModified(gui.getRoot(), true); - } - return val; - }, controller.setValue); -} -function recallSavedValue(gui, controller) { - var root = gui.getRoot(); - var matchedIndex = root.__rememberedObjects.indexOf(controller.object); - if (matchedIndex !== -1) { - var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex]; - if (controllerMap === undefined) { - controllerMap = {}; - root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap; - } - controllerMap[controller.property] = controller; - if (root.load && root.load.remembered) { - var presetMap = root.load.remembered; - var preset = void 0; - if (presetMap[gui.preset]) { - preset = presetMap[gui.preset]; - } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) { - preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME]; - } else { - return; - } - if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) { - var value = preset[matchedIndex][controller.property]; - controller.initialValue = value; - controller.setValue(value); - } - } - } -} -function _add(gui, object, property, params) { - if (object[property] === undefined) { - throw new Error('Object "' + object + '" has no property "' + property + '"'); - } - var controller = void 0; - if (params.color) { - controller = new ColorController(object, property); - } else { - var factoryArgs = [object, property].concat(params.factoryArgs); - controller = ControllerFactory.apply(gui, factoryArgs); - } - if (params.before instanceof Controller) { - params.before = params.before.__li; - } - recallSavedValue(gui, controller); - dom.addClass(controller.domElement, 'c'); - var name = document.createElement('span'); - dom.addClass(name, 'property-name'); - name.innerHTML = controller.property; - var container = document.createElement('div'); - container.appendChild(name); - container.appendChild(controller.domElement); - var li = addRow(gui, container, params.before); - dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); - if (controller instanceof ColorController) { - dom.addClass(li, 'color'); - } else { - dom.addClass(li, _typeof(controller.getValue())); - } - augmentController(gui, li, controller); - gui.__controllers.push(controller); - return controller; -} -function getLocalStorageHash(gui, key) { - return document.location.href + '.' + key; -} -function addPresetOption(gui, name, setSelected) { - var opt = document.createElement('option'); - opt.innerHTML = name; - opt.value = name; - gui.__preset_select.appendChild(opt); - if (setSelected) { - gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; - } -} -function showHideExplain(gui, explain) { - explain.style.display = gui.useLocalStorage ? 'block' : 'none'; -} -function addSaveMenu(gui) { - var div = gui.__save_row = document.createElement('li'); - dom.addClass(gui.domElement, 'has-save'); - gui.__ul.insertBefore(div, gui.__ul.firstChild); - dom.addClass(div, 'save-row'); - var gears = document.createElement('span'); - gears.innerHTML = ' '; - dom.addClass(gears, 'button gears'); - var button = document.createElement('span'); - button.innerHTML = 'Save'; - dom.addClass(button, 'button'); - dom.addClass(button, 'save'); - var button2 = document.createElement('span'); - button2.innerHTML = 'New'; - dom.addClass(button2, 'button'); - dom.addClass(button2, 'save-as'); - var button3 = document.createElement('span'); - button3.innerHTML = 'Revert'; - dom.addClass(button3, 'button'); - dom.addClass(button3, 'revert'); - var select = gui.__preset_select = document.createElement('select'); - if (gui.load && gui.load.remembered) { - Common.each(gui.load.remembered, function (value, key) { - addPresetOption(gui, key, key === gui.preset); - }); - } else { - addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); - } - dom.bind(select, 'change', function () { - for (var index = 0; index < gui.__preset_select.length; index++) { - gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; - } - gui.preset = this.value; - }); - div.appendChild(select); - div.appendChild(gears); - div.appendChild(button); - div.appendChild(button2); - div.appendChild(button3); - if (SUPPORTS_LOCAL_STORAGE) { - var explain = document.getElementById('dg-local-explain'); - var localStorageCheckBox = document.getElementById('dg-local-storage'); - var saveLocally = document.getElementById('dg-save-locally'); - saveLocally.style.display = 'block'; - if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { - localStorageCheckBox.setAttribute('checked', 'checked'); - } - showHideExplain(gui, explain); - dom.bind(localStorageCheckBox, 'change', function () { - gui.useLocalStorage = !gui.useLocalStorage; - showHideExplain(gui, explain); - }); - } - var newConstructorTextArea = document.getElementById('dg-new-constructor'); - dom.bind(newConstructorTextArea, 'keydown', function (e) { - if (e.metaKey && (e.which === 67 || e.keyCode === 67)) { - SAVE_DIALOGUE.hide(); - } - }); - dom.bind(gears, 'click', function () { - newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); - SAVE_DIALOGUE.show(); - newConstructorTextArea.focus(); - newConstructorTextArea.select(); - }); - dom.bind(button, 'click', function () { - gui.save(); - }); - dom.bind(button2, 'click', function () { - var presetName = prompt('Enter a new preset name.'); - if (presetName) { - gui.saveAs(presetName); - } - }); - dom.bind(button3, 'click', function () { - gui.revert(); - }); -} -function addResizeHandle(gui) { - var pmouseX = void 0; - gui.__resize_handle = document.createElement('div'); - Common.extend(gui.__resize_handle.style, { - width: '6px', - marginLeft: '-3px', - height: '200px', - cursor: 'ew-resize', - position: 'absolute' - }); - function drag(e) { - e.preventDefault(); - gui.width += pmouseX - e.clientX; - gui.onResize(); - pmouseX = e.clientX; - return false; - } - function dragStop() { - dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); - dom.unbind(window, 'mousemove', drag); - dom.unbind(window, 'mouseup', dragStop); - } - function dragStart(e) { - e.preventDefault(); - pmouseX = e.clientX; - dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); - dom.bind(window, 'mousemove', drag); - dom.bind(window, 'mouseup', dragStop); - return false; - } - dom.bind(gui.__resize_handle, 'mousedown', dragStart); - dom.bind(gui.__closeButton, 'mousedown', dragStart); - gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); -} -function setWidth(gui, w) { - gui.domElement.style.width = w + 'px'; - if (gui.__save_row && gui.autoPlace) { - gui.__save_row.style.width = w + 'px'; - } - if (gui.__closeButton) { - gui.__closeButton.style.width = w + 'px'; - } -} -function getCurrentPreset(gui, useInitialValues) { - var toReturn = {}; - Common.each(gui.__rememberedObjects, function (val, index) { - var savedValues = {}; - var controllerMap = gui.__rememberedObjectIndecesToControllers[index]; - Common.each(controllerMap, function (controller, property) { - savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue(); - }); - toReturn[index] = savedValues; - }); - return toReturn; -} -function setPresetSelectIndex(gui) { - for (var index = 0; index < gui.__preset_select.length; index++) { - if (gui.__preset_select[index].value === gui.preset) { - gui.__preset_select.selectedIndex = index; - } - } -} -function updateDisplays(controllerArray) { - if (controllerArray.length !== 0) { - requestAnimationFrame$1.call(window, function () { - updateDisplays(controllerArray); - }); - } - Common.each(controllerArray, function (c) { - c.updateDisplay(); - }); -} - -var color = { - Color: Color, - math: ColorMath, - interpret: interpret -}; -var controllers = { - Controller: Controller, - BooleanController: BooleanController, - OptionController: OptionController, - StringController: StringController, - NumberController: NumberController, - NumberControllerBox: NumberControllerBox, - NumberControllerSlider: NumberControllerSlider, - FunctionController: FunctionController, - ColorController: ColorController -}; -var dom$1 = { dom: dom }; -var gui = { GUI: GUI }; -var GUI$1 = GUI; -var index = { - color: color, - controllers: controllers, - dom: dom$1, - gui: gui, - GUI: GUI$1 -}; - -exports.color = color; -exports.controllers = controllers; -exports.dom = dom$1; -exports.gui = gui; -exports.GUI = GUI$1; -exports['default'] = index; - -Object.defineProperty(exports, '__esModule', { value: true }); - -}))); -//# sourceMappingURL=dat.gui.js.map diff --git a/public/build/dat.gui.js.map b/public/build/dat.gui.js.map deleted file mode 100644 index eb8553546..000000000 --- a/public/build/dat.gui.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dat.gui.js","sources":["../src/dat/color/toString.js","../src/dat/utils/common.js","../src/dat/color/interpret.js","../src/dat/color/math.js","../src/dat/color/Color.js","../src/dat/controllers/Controller.js","../src/dat/dom/dom.js","../src/dat/controllers/BooleanController.js","../src/dat/controllers/OptionController.js","../src/dat/controllers/StringController.js","../src/dat/controllers/NumberController.js","../src/dat/controllers/NumberControllerBox.js","../src/dat/controllers/NumberControllerSlider.js","../src/dat/controllers/FunctionController.js","../src/dat/controllers/ColorController.js","../src/dat/utils/css.js","../src/dat/gui/saveDialogue.html.js","../src/dat/controllers/ControllerFactory.js","../src/dat/utils/requestAnimationFrame.js","../src/dat/dom/CenteredDiv.js","../src/dat/gui/GUI.js","../src/dat/index.js"],"sourcesContent":["/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nexport default function(color, forceCSSHex) {\n const colorFormat = color.__state.conversionName.toString();\n\n const r = Math.round(color.r);\n const g = Math.round(color.g);\n const b = Math.round(color.b);\n const a = color.a;\n const h = Math.round(color.h);\n const s = color.s.toFixed(1);\n const v = color.v.toFixed(1);\n\n if (forceCSSHex || (colorFormat === 'THREE_CHAR_HEX') || (colorFormat === 'SIX_CHAR_HEX')) {\n let str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n\n return 'unknown format';\n}\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nconst ARR_EACH = Array.prototype.forEach;\nconst ARR_SLICE = Array.prototype.slice;\n\n/**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\nconst Common = {\n BREAK: {},\n\n extend: function(target) {\n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n const keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function(key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n\n return target;\n },\n\n defaults: function(target) {\n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n const keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function(key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n\n return target;\n },\n\n compose: function() {\n const toCall = ARR_SLICE.call(arguments);\n return function() {\n let args = ARR_SLICE.call(arguments);\n for (let i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n\n each: function(obj, itr, scope) {\n if (!obj) {\n return;\n }\n\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n let key;\n let l;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (const key in obj) {\n if (itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n }\n },\n\n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n\n // if the function is called repeatedly, wait until threshold passes until we execute the function\n debounce: function(func, threshold, callImmediately) {\n let timeout;\n\n return function() {\n const obj = this;\n const args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n\n const callNow = callImmediately || !timeout;\n\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n\n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n\n isNull: function(obj) {\n return obj === null;\n },\n\n isNaN: function(obj) {\n return isNaN(obj);\n },\n\n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n\n isObject: function(obj) {\n return obj === Object(obj);\n },\n\n isNumber: function(obj) {\n return obj === obj + 0;\n },\n\n isString: function(obj) {\n return obj === obj + '';\n },\n\n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n\n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n\n};\n\nexport default Common;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport toString from './toString';\nimport common from '../utils/common';\n\nconst INTERPRETATIONS = [\n // Strings\n {\n litmus: common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function(original) {\n const test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString(), 0)\n };\n },\n\n write: toString\n },\n\n SIX_CHAR_HEX: {\n read: function(original) {\n const test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n\n write: toString\n },\n\n CSS_RGB: {\n read: function(original) {\n const test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n\n write: toString\n },\n\n CSS_RGBA: {\n read: function(original) {\n const test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n\n write: toString\n }\n }\n },\n\n // Numbers\n {\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n litmus: common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function(original) {\n if (original.length !== 3) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n },\n\n // Objects\n {\n litmus: common.isObject,\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n }\n];\n\nlet result;\nlet toReturn;\n\nconst interpret = function() {\n toReturn = false;\n\n const original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n common.each(INTERPRETATIONS, function(family) {\n if (family.litmus(original)) {\n common.each(family.conversions, function(conversion, conversionName) {\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n }\n });\n\n return common.BREAK;\n }\n });\n\n return toReturn;\n};\n\nexport default interpret;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nlet tmpComponent;\n\nconst ColorMath = {\n hsv_to_rgb: function(h, s, v) {\n const hi = Math.floor(h / 60) % 6;\n\n const f = h / 60 - Math.floor(h / 60);\n const p = v * (1.0 - s);\n const q = v * (1.0 - (f * s));\n const t = v * (1.0 - ((1.0 - f) * s));\n\n const c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n\n rgb_to_hsv: function(r, g, b) {\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n const delta = max - min;\n let h;\n let s;\n\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n let hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~(0xFF << tmpComponent));\n }\n};\n\nexport default ColorMath;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport interpret from './interpret';\nimport math from './math';\nimport colorToString from './toString';\nimport common from '../utils/common';\n\nclass Color {\n constructor() {\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n\n this.__state.a = this.__state.a || 1;\n }\n\n toString() {\n return colorToString(this);\n }\n\n toHexString() {\n return colorToString(this, true);\n }\n\n toOriginal() {\n return this.__state.conversion.write(this);\n }\n}\n\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n Color.recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n },\n\n set: function(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n }\n });\n}\n\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n\n Color.recalculateHSV(this);\n\n return this.__state[component];\n },\n\n set: function(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n }\n });\n}\n\n\nColor.recalculateRGB = function(color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\n\nColor.recalculateHSV = function(color) {\n const result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\n\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\n\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\n\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\n\nObject.defineProperty(Color.prototype, 'a', {\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n});\n\nObject.defineProperty(Color.prototype, 'hex', {\n get: function() {\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n },\n\n set: function(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nexport default Color;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass Controller {\n constructor(object, property) {\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n }\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {Controller} this\n */\n onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {Controller} this\n */\n onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n\n this.updateDisplay();\n return this;\n }\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue() {\n return this.object[this.property];\n }\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {Controller} this\n */\n updateDisplay() {\n return this;\n }\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified() {\n return this.initialValue !== this.getValue();\n }\n}\n\nexport default Controller;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport common from '../utils/common';\n\nconst EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\n\nconst EVENT_MAP_INV = {};\ncommon.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n});\n\nconst CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\nfunction cssValueToPixels(val) {\n if (val === '0' || common.isUndefined(val)) {\n return 0;\n }\n\n const match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n}\n\n/**\n * @namespace\n * @member dat.dom\n */\nconst dom = {\n\n /**\n *\n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vert\n */\n makeFullscreen: function(elem, hor, vert) {\n let vertical = vert;\n let horizontal = hor;\n\n if (common.isUndefined(horizontal)) {\n horizontal = true;\n }\n\n if (common.isUndefined(vertical)) {\n vertical = true;\n }\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, pars, aux) {\n const params = pars || {};\n const className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n const evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n const clientX = params.x || params.clientX || 0;\n const clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, // screen X\n 0, // screen Y\n clientX, // client X\n clientY, // client Y\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n const init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, newBool) {\n const bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, newBool) {\n const bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n const classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n const classes = elem.className.split(/ +/);\n const index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n const style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style.width);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n const style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style.height);\n },\n\n /**\n *\n * @param el\n */\n getOffset: function(el) {\n let elem = el;\n const offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n *\n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n\n};\n\nexport default dom;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a checkbox input to alter the boolean property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass BooleanController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n const _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n }\n\n setValue(v) {\n const toReturn = super.setValue(v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n\n updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n\n return super.updateDisplay();\n }\n}\n\nexport default BooleanController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\n/**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n */\nclass OptionController extends Controller {\n constructor(object, property, opts) {\n super(object, property);\n\n let options = opts;\n\n const _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n const map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n const opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n const desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n }\n\n setValue(v) {\n const toReturn = super.setValue(v);\n\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n\n updateDisplay() {\n if (dom.isActive(this.__select)) return this; // prevent number from updating if user is trying to manually update\n this.__select.value = this.getValue();\n return super.updateDisplay();\n }\n}\n\nexport default OptionController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass StringController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n const _this = this;\n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n }\n\n updateDisplay() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return super.updateDisplay();\n }\n}\n\nexport default StringController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport common from '../utils/common';\n\nfunction numDecimals(x) {\n const _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n\n return 0;\n}\n\n/**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n */\nclass NumberController extends Controller {\n constructor(object, property, params) {\n super(object, property);\n\n const _params = params || {};\n\n this.__min = _params.min;\n this.__max = _params.max;\n this.__step = _params.step;\n\n if (common.isUndefined(this.__step)) {\n if (this.initialValue === 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n this.__impliedStep = this.__step;\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n }\n\n setValue(v) {\n let _v = v;\n\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n\n return super.setValue(_v);\n }\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min(minValue) {\n this.__min = minValue;\n return this;\n }\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n}\n\nexport default NumberController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport NumberController from './NumberController';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nfunction roundToDecimal(value, decimals) {\n const tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\n\n/**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n */\nclass NumberControllerBox extends NumberController {\n constructor(object, property, params) {\n super(object, property, params);\n\n this.__truncationSuspended = false;\n\n const _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n let prevY;\n\n function onChange() {\n const attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onBlur() {\n onFinish();\n }\n\n function onMouseDrag(e) {\n const diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prevY = e.clientY;\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n // When pressing enter, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n }\n\n updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return super.updateDisplay();\n }\n}\n\nexport default NumberControllerBox;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport NumberController from './NumberController';\nimport dom from '../dom/dom';\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\n\n/**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n */\nclass NumberControllerSlider extends NumberController {\n constructor(object, property, min, max, step) {\n super(object, property, { min: min, max: max, step: step });\n\n const _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n dom.bind(this.__background, 'touchstart', onTouchStart);\n\n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n document.activeElement.blur();\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n e.preventDefault();\n\n const bgRect = _this.__background.getBoundingClientRect();\n\n _this.setValue(\n map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)\n );\n\n return false;\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onTouchStart(e) {\n if (e.touches.length !== 1) { return; }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n\n function onTouchMove(e) {\n const clientX = e.touches[0].clientX;\n const bgRect = _this.__background.getBoundingClientRect();\n\n _this.setValue(\n map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)\n );\n }\n\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n }\n\n updateDisplay() {\n const pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return super.updateDisplay();\n }\n}\n\nexport default NumberControllerSlider;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass FunctionController extends Controller {\n constructor(object, property, text) {\n super(object, property);\n\n const _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n }\n\n fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n}\n\nexport default FunctionController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\nimport Color from '../color/Color';\nimport interpret from '../color/interpret';\nimport common from '../utils/common';\n\n/**\n * @class Represents a given property of an object that is a color.\n * @param {Object} object\n * @param {string} property\n */\nclass ColorController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n const _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(/* e */) {\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(/* e */) {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n\n dom.bind(this.__selector, 'touchstart', function(/* e */) {\n dom\n .addClass(this, 'drag')\n .bind(window, 'touchend', function(/* e */) {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n\n const valueField = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n\n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__saturation_field, 'touchstart', fieldDown);\n\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'touchstart', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', fieldDownH);\n dom.bind(this.__hue_field, 'touchstart', fieldDownH);\n\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n\n function onBlur() {\n const i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n\n this.__saturation_field.appendChild(valueField);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) { e.preventDefault(); }\n\n const fieldRect = _this.__saturation_field.getBoundingClientRect();\n const { clientX, clientY } = (e.touches && e.touches[0]) || e;\n let s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n let v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n }\n\n function setH(e) {\n if (e.type.indexOf('touch') === -1) { e.preventDefault(); }\n\n const fieldRect = _this.__hue_field.getBoundingClientRect();\n const { clientY } = (e.touches && e.touches[0]) || e;\n let h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n }\n }\n\n updateDisplay() {\n const i = interpret(this.getValue());\n\n if (i !== false) {\n let mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) && !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n const flip = (this.__color.v < 0.5 || this.__color.s > 0.5) ? 255 : 0;\n const _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n\n this.__input.value = this.__color.toString();\n\n common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n}\n\nconst vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\n\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\n\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nexport default ColorController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nconst css = {\n load: function(url, indoc) {\n const doc = indoc || document;\n const link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n\n inject: function(cssContent, indoc) {\n const doc = indoc || document;\n const injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n const head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) { // Unable to inject CSS, probably because of a Content Security Policy\n }\n }\n};\n\nexport default css;\n","const saveDialogContents = `
        \n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
        \n\n Automatically save\n values to localStorage on exit.\n\n
        The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
        \n\n
        \n\n
        `;\n\nexport default saveDialogContents;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport OptionController from './OptionController';\nimport NumberControllerBox from './NumberControllerBox';\nimport NumberControllerSlider from './NumberControllerSlider';\nimport StringController from './StringController';\nimport FunctionController from './FunctionController';\nimport BooleanController from './BooleanController';\nimport common from '../utils/common';\n\nconst ControllerFactory = function(object, property) {\n const initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n if (common.isNumber(initialValue)) {\n // Has min and max? (slider)\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n // has step?\n if (common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property,\n arguments[2], arguments[3], arguments[4]);\n }\n\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n\n // number box\n if (common.isNumber(arguments[4])) { // has step\n return new NumberControllerBox(object, property,\n { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n return null;\n};\n\nexport default ControllerFactory;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\n\nexport default window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n requestAnimationFrame;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nclass CenteredDiv {\n constructor() {\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n const _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n }\n\n show() {\n const _this = this;\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n\n /**\n * Hide centered div\n */\n hide() {\n const _this = this;\n\n const hide = function() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n\n layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n}\n\nexport default CenteredDiv;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport css from '../utils/css';\nimport saveDialogueContents from './saveDialogue.html';\nimport ControllerFactory from '../controllers/ControllerFactory';\nimport Controller from '../controllers/Controller';\nimport BooleanController from '../controllers/BooleanController';\nimport FunctionController from '../controllers/FunctionController';\nimport NumberControllerBox from '../controllers/NumberControllerBox';\nimport NumberControllerSlider from '../controllers/NumberControllerSlider';\nimport ColorController from '../controllers/ColorController';\nimport requestAnimationFrame from '../utils/requestAnimationFrame';\nimport CenteredDiv from '../dom/CenteredDiv';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nimport styleSheet from './style.scss'; // CSS to embed in build\n\ncss.inject(styleSheet);\n\n/** @ignore Outer-most className for GUI's */\nconst CSS_NAMESPACE = 'dg';\n\nconst HIDE_KEY_CODE = 72;\n\n/** @ignore The only value shared between the JS and SCSS. Use caution. */\nconst CLOSE_BUTTON_HEIGHT = 20;\n\nconst DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\nconst SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}());\n\nlet SAVE_DIALOGUE;\n\n/** @ignore Have we yet to create an autoPlace GUI? */\nlet autoPlaceVirgin = true;\n\n/** @ignore Fixed position div that auto place GUI's go inside */\nlet autoPlaceContainer;\n\n/** @ignore Are we hiding the GUI's ? */\nlet hide = false;\n\n/** @private GUI's which should be hidden */\nconst hideableGuis = [];\n\n/**\n * @class A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n *\n * @typicalname gui\n *\n * @example\n * // Creating a GUI with options.\n * var gui = new dat.GUI({name: 'My GUI'});\n *\n * @example\n * // Creating a GUI and a subfolder.\n * var gui = new dat.GUI();\n * var folder1 = gui.addFolder('Flow Field');\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.autoPlace=true]\n * @param {Boolean} [params.hideable=true] If true, GUI is shown/hidden by h keypress.\n * @param {Boolean} [params.closed=false] If true, starts closed\n * @param {Boolean} [params.closeOnTop=false] If true, close/open button shows on top of the GUI\n */\nconst GUI = function(pars) {\n const _this = this;\n\n let params = pars || {};\n\n /**\n * Outermost DOM Element\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n // Default parameters\n params = common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n if (!common.isUndefined(params.load)) {\n // Explicit preset\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n let useLocalStorage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n let saveToLocalStorage;\n let titleRow;\n\n Object.defineProperties(this,\n /** @lends GUI.prototype */\n {\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * Handles GUI's position of open/close button\n * @type Boolean\n */\n closeOnTop: {\n get: function() {\n return params.closeOnTop;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n\n return params.load.preset;\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return useLocalStorage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n\n const savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n\n dom.bind(this.__closeButton, 'click', function() {\n _this.closed = !_this.closed;\n });\n // Oh, you're a nested GUI!\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n const titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n\n titleRow = addRow(_this, titleRowName);\n\n const onClickTitle = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n\n if (!params.closed) {\n this.closed = false;\n }\n }\n\n if (params.autoPlace) {\n if (common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n\n // Put it in the dom for you.\n autoPlaceContainer.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n\n\n // Make it not elastic.\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n\n this.__resizeHandler = function() {\n _this.onResizeDebounced();\n };\n\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n saveToLocalStorage = function() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n\n // expose this method publicly\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n\n function resetWidth() {\n const root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n};\n\nGUI.toggleHide = function() {\n hide = !hide;\n common.each(hideableGuis, function(gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\n\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\n\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\n\nGUI._keydownHandler = function(e) {\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\n\ncommon.extend(\n GUI.prototype,\n\n /** @lends GUI.prototype */\n {\n\n /**\n * Adds a new {@link Controller} to the GUI. The type of controller created\n * is inferred from the initial value of object[property]. For\n * color properties, see {@link addColor}.\n *\n * @param {Object} object The object to be manipulated\n * @param {String} property The name of the property to be manipulated\n * @param {Number} [min] Minimum allowed value\n * @param {Number} [max] Maximum allowed value\n * @param {Number} [step] Increment by which to change value\n * @returns {Controller} The controller that was added to the GUI.\n * @instance\n *\n * @example\n * // Add a string controller.\n * var person = {name: 'Sam'};\n * gui.add(person, 'name');\n *\n * @example\n * // Add a number controller slider.\n * var person = {age: 45};\n * gui.add(person, 'age', 0, 100);\n */\n add: function(object, property) {\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n },\n\n /**\n * Adds a new color controller to the GUI.\n *\n * @param object\n * @param property\n * @returns {Controller} The controller that was added to the GUI.\n * @instance\n *\n * @example\n * var palette = {\n * color1: '#FF0000', // CSS string\n * color2: [ 0, 128, 255 ], // RGB array\n * color3: [ 0, 128, 255, 0.3 ], // RGB with alpha\n * color4: { h: 350, s: 0.9, v: 0.3 } // Hue, saturation, value\n * };\n * gui.addColor(palette, 'color1');\n * gui.addColor(palette, 'color2');\n * gui.addColor(palette, 'color3');\n * gui.addColor(palette, 'color4');\n */\n addColor: function(object, property) {\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n },\n\n /**\n * Removes the given controller from the GUI.\n * @param {Controller} controller\n * @instance\n */\n remove: function(controller) {\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n const _this = this;\n common.defer(function() {\n _this.onResize();\n });\n },\n\n /**\n * Removes the root GUI from the document and unbinds all event listeners.\n * For subfolders, use `gui.removeFolder(folder)` instead.\n * @instance\n */\n destroy: function() {\n if (this.parent) {\n throw new Error(\n 'Only the root GUI should be removed with .destroy(). ' +\n 'For subfolders, use gui.removeFolder(folder) instead.'\n );\n }\n\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n\n const _this = this;\n common.each(this.__folders, function(subfolder) {\n _this.removeFolder(subfolder);\n });\n\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n\n removeListeners(this);\n },\n\n /**\n * Creates a new subfolder GUI instance.\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n const newGuiParams = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n newGuiParams.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n // Start me closed if I was closed\n newGuiParams.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n newGuiParams.load = this.load.folders[name];\n }\n\n const gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n\n const li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n\n /**\n * Removes a subfolder GUI instance.\n * @param {dat.gui.GUI} folder The folder to remove.\n * @instance\n */\n removeFolder: function(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n\n delete this.__folders[folder.name];\n\n // Do we have saved appearance data for this folder?\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n\n removeListeners(folder);\n\n const _this = this;\n\n common.each(folder.__folders, function(subfolder) {\n folder.removeFolder(subfolder);\n });\n\n common.defer(function() {\n _this.onResize();\n });\n },\n\n /**\n * Opens the GUI.\n */\n open: function() {\n this.closed = false;\n },\n\n /**\n * Closes the GUI.\n */\n close: function() {\n this.closed = true;\n },\n\n /**\n * Hides the GUI.\n */\n hide: function() {\n this.domElement.style.display = 'none';\n },\n\n /**\n * Shows the GUI.\n */\n show: function() {\n this.domElement.style.display = '';\n },\n\n\n onResize: function() {\n // we debounce this function to prevent performance issues when rotating on tablet/mobile\n const root = this.getRoot();\n if (root.scrollable) {\n const top = dom.getOffset(root.__ul).top;\n let h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n\n onResizeDebounced: common.debounce(function() { this.onResize(); }, 50),\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {...Object} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n * @ignore\n */\n remember: function() {\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n\n const _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n let gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n const toReturn = this.load;\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n },\n\n save: function() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n\n saveAs: function(presetName) {\n if (!this.load.remembered) {\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n\n revert: function(gui) {\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n\n // fire onFinishChange callback\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n\n listen: function(controller) {\n const init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n\n updateDisplay: function() {\n common.each(this.__controllers, function(controller) {\n controller.updateDisplay();\n });\n common.each(this.__folders, function(folder) {\n folder.updateDisplay();\n });\n }\n }\n);\n\n/**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [newDom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n *\n * @ignore\n */\nfunction addRow(gui, newDom, liBefore) {\n const li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\n\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\n\nfunction markPresetModified(gui, modified) {\n const opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\n\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, /** @lends Controller.prototype */ {\n /**\n * @param {Array|Object} options\n * @return {Controller}\n */\n options: function(options) {\n if (arguments.length > 1) {\n const nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: nextSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n const nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: nextSibling,\n factoryArgs: [options]\n }\n );\n }\n },\n\n /**\n * Sets the name of the controller.\n * @param {string} name\n * @return {Controller}\n */\n name: function(name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = name;\n return controller;\n },\n\n /**\n * Sets controller to listen for changes on its underlying object.\n * @return {Controller}\n */\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n /**\n * Removes the controller from its parent GUI.\n * @return {Controller}\n */\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n const box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function(method) {\n const pc = controller[method];\n const pb = box[method];\n controller[method] = box[method] = function() {\n const args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n const r = function(returned) {\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n // Well, then lets just replace this with a slider.\n\n // lets remember if the old controller had a specific name or was listening\n const oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n const wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n\n controller.remove();\n const newController = add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n newController.name(oldName);\n if (wasListening) newController.listen();\n\n return newController;\n }\n\n return returned;\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n }\n\n controller.setValue = common.compose(function(val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n\n return val;\n }, controller.setValue);\n}\n\nfunction recallSavedValue(gui, controller) {\n // Find the topmost GUI, that's where remembered objects live.\n const root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n const matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matchedIndex !== -1) {\n // Let me fetch a map of controllers for thcommon.isObject.\n let controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] =\n controllerMap;\n }\n\n // Keep track of this controller\n controllerMap[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n const presetMap = root.load.remembered;\n\n // Which preset are we trying to load?\n let preset;\n\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n // Uhh, you can have the default instead?\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n // Nada.\n return;\n }\n\n // Did the loaded object remember thcommon.isObject? && Did we remember this particular property?\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n // We did remember something for this guy ...\n const value = preset[matchedIndex][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\n\nfunction add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error(`Object \"${object}\" has no property \"${property}\"`);\n }\n\n let controller;\n\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n const factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n const name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n const container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n const li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, typeof controller.getValue());\n }\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n}\n\nfunction getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n}\n\nfunction addPresetOption(gui, name, setSelected) {\n const opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\n\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\n\nfunction addSaveMenu(gui) {\n const div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n const gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n const button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n const button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n const button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n const select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n for (let index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n const explain = document.getElementById('dg-local-explain');\n const localStorageCheckBox = document.getElementById('dg-local-storage');\n const saveLocally = document.getElementById('dg-save-locally');\n\n saveLocally.style.display = 'block';\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n showHideExplain(gui, explain);\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n\n const newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n const presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n // div.appendChild(button2);\n}\n\nfunction addResizeHandle(gui) {\n let pmouseX;\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n // border: '1px solid blue'\n\n });\n\n function drag(e) {\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n }\n\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n\n function dragStart(e) {\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n }\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\n\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\n\nfunction getCurrentPreset(gui, useInitialValues) {\n const toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n const savedValues = {};\n\n // The controllers I've made for thcommon.isObject by property\n const controllerMap =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controllerMap, function(controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = savedValues;\n });\n\n return toReturn;\n}\n\nfunction setPresetSelectIndex(gui) {\n for (let index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\n\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame.call(window, function() {\n updateDisplays(controllerArray);\n });\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n}\n\nexport default GUI;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Color from './color/Color';\nimport math from './color/math';\nimport interpret from './color/interpret';\n\nimport Controller from './controllers/Controller';\nimport BooleanController from './controllers/BooleanController';\nimport OptionController from './controllers/OptionController';\nimport StringController from './controllers/StringController';\nimport NumberController from './controllers/NumberController';\nimport NumberControllerBox from './controllers/NumberControllerBox';\nimport NumberControllerSlider from './controllers/NumberControllerSlider';\nimport FunctionController from './controllers/FunctionController';\nimport ColorController from './controllers/ColorController';\n\nimport domImport from './dom/dom';\nimport GUIImport from './gui/GUI';\n\nexport const color = {\n Color: Color,\n math: math,\n interpret: interpret\n};\n\nexport const controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\n\nexport const dom = { dom: domImport };\n\nexport const gui = { GUI: GUIImport };\n\nexport const GUI = GUIImport;\n\nexport default {\n color,\n controllers,\n dom,\n gui,\n GUI\n};\n"],"names":["color","forceCSSHex","colorFormat","__state","conversionName","toString","r","Math","round","g","b","a","h","s","toFixed","v","str","hex","length","ARR_EACH","Array","prototype","forEach","ARR_SLICE","slice","Common","target","each","call","arguments","obj","keys","isObject","Object","key","isUndefined","bind","toCall","args","i","apply","itr","scope","l","BREAK","fnc","func","threshold","callImmediately","timeout","delayed","callNow","setTimeout","toArray","undefined","isNaN","isArray","constructor","INTERPRETATIONS","common","isString","original","test","match","parseInt","parseFloat","isNumber","result","toReturn","interpret","family","litmus","conversions","conversion","read","tmpComponent","ColorMath","hi","floor","f","p","q","t","c","min","max","delta","NaN","hex_with_component","componentIndex","value","Color","Error","colorToString","write","defineRGBComponent","component","componentHexIndex","defineProperty","space","recalculateRGB","defineHSVComponent","recalculateHSV","math","component_from_hex","extend","hsv_to_rgb","rgb_to_hsv","COMPONENTS","rgb_to_hex","Controller","object","property","initialValue","domElement","document","createElement","__onChange","__onFinishChange","newValue","updateDisplay","getValue","EVENT_MAP","EVENT_MAP_INV","k","e","CSS_VALUE_PIXELS","cssValueToPixels","val","isNull","dom","elem","selectable","style","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","hor","vert","vertical","horizontal","position","left","right","top","bottom","eventType","pars","aux","params","className","evt","createEvent","clientX","x","clientY","y","initMouseEvent","bubbles","cancelable","window","clickCount","init","initKeyboardEvent","initKeyEvent","defaults","ctrlKey","altKey","shiftKey","metaKey","keyCode","charCode","initEvent","dispatchEvent","event","newBool","bool","addEventListener","attachEvent","removeEventListener","detachEvent","classes","split","indexOf","push","join","replace","removeAttribute","index","splice","RegExp","getComputedStyle","width","height","el","offset","offsetParent","offsetLeft","offsetTop","activeElement","type","href","BooleanController","_this","__prev","__checkbox","setAttribute","onChange","setValue","appendChild","checked","OptionController","opts","options","__select","map","element","opt","innerHTML","desiredValue","selectedIndex","isActive","StringController","__input","onBlur","blur","numDecimals","_x","NumberController","_params","__min","__max","__step","step","__impliedStep","pow","log","abs","LN10","__precision","_v","minValue","maxValue","stepValue","roundToDecimal","decimals","tenTo","NumberControllerBox","__truncationSuspended","prevY","attempted","onFinish","onMouseDrag","diff","onMouseUp","unbind","onMouseDown","i1","i2","o1","o2","NumberControllerSlider","__background","__foreground","onTouchStart","addClass","preventDefault","bgRect","getBoundingClientRect","touches","onTouchMove","onTouchEnd","pct","FunctionController","text","__button","fire","ColorController","__color","__temp","makeSelectable","__selector","__saturation_field","__field_knob","__field_knob_border","__hue_knob","__hue_field","__input_textShadow","removeClass","valueField","fieldDown","fieldDownH","setSV","fieldUpSV","setH","fieldUpH","toOriginal","fieldRect","mismatch","flip","_flip","toHexString","marginTop","vendors","linearGradient","background","vendor","cssText","hueGradient","css","url","indoc","doc","link","rel","getElementsByTagName","cssContent","injected","head","saveDialogContents","ControllerFactory","isFunction","isBoolean","requestAnimationFrame","callback","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","CenteredDiv","backgroundElement","makeFullscreen","body","hide","display","opacity","webkitTransform","layout","defer","innerWidth","getWidth","innerHeight","getHeight","inject","styleSheet","CSS_NAMESPACE","HIDE_KEY_CODE","CLOSE_BUTTON_HEIGHT","DEFAULT_DEFAULT_PRESET_NAME","SUPPORTS_LOCAL_STORAGE","localStorage","SAVE_DIALOGUE","autoPlaceVirgin","autoPlaceContainer","hideableGuis","GUI","__ul","__folders","__controllers","__rememberedObjects","__rememberedObjectIndecesToControllers","__listening","DEFAULT_WIDTH","autoPlace","load","preset","parent","hideable","resizable","scrollable","useLocalStorage","getItem","getLocalStorageHash","saveToLocalStorage","titleRow","defineProperties","closeOnTop","getRoot","revert","name","closed","CLASS_CLOSED","onResize","__closeButton","TEXT_OPEN","TEXT_CLOSED","setItem","CLASS_MAIN","savedGui","JSON","parse","CLASS_CLOSE_BUTTON","CLASS_CLOSE_TOP","insertBefore","childNodes","CLASS_CLOSE_BOTTOM","titleRowName","createTextNode","addRow","onClickTitle","CLASS_AUTO_PLACE_CONTAINER","CLASS_AUTO_PLACE","__resizeHandler","onResizeDebounced","stringify","getSaveObject","saveToLocalStorageIfPossible","resetWidth","root","toggleHide","gui","CLASS_CONTROLLER_ROW","CLASS_TOO_TALL","CLASS_DRAG","_keydownHandler","which","add","controller","removeChild","__li","subfolder","removeFolder","newGuiParams","folders","li","folder","parentElement","getOffset","node","__save_row","__resize_handle","offsetHeight","debounce","saveDialogueContents","remembered","getCurrentPreset","presetName","newDom","liBefore","removeListeners","markPresetModified","modified","__preset_select","augmentController","__gui","nextSibling","nextElementSibling","remove","firstElementChild","listen","box","method","pc","pb","returned","oldName","wasListening","newController","compose","fakeEvent","stopPropagation","borderLeftColor","isModified","recallSavedValue","matchedIndex","controllerMap","presetMap","factoryArgs","concat","before","container","location","addPresetOption","setSelected","showHideExplain","explain","addSaveMenu","div","firstChild","gears","button","button2","button3","select","getElementById","localStorageCheckBox","saveLocally","newConstructorTextArea","show","focus","save","prompt","saveAs","addResizeHandle","pmouseX","drag","dragStop","dragStart","setWidth","w","useInitialValues","savedValues","setPresetSelectIndex","updateDisplays","controllerArray","controllers","domImport","GUIImport"],"mappings":"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"} \ No newline at end of file diff --git a/public/build/dat.gui.min.js b/public/build/dat.gui.min.js deleted file mode 100644 index 1398e14ab..000000000 --- a/public/build/dat.gui.min.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.dat={})}(this,function(e){"use strict";function t(e,t){var n=e.__state.conversionName.toString(),o=Math.round(e.r),i=Math.round(e.g),r=Math.round(e.b),s=e.a,a=Math.round(e.h),l=e.s.toFixed(1),d=e.v.toFixed(1);if(t||"THREE_CHAR_HEX"===n||"SIX_CHAR_HEX"===n){for(var c=e.hex.toString(16);c.length<6;)c="0"+c;return"#"+c}return"CSS_RGB"===n?"rgb("+o+","+i+","+r+")":"CSS_RGBA"===n?"rgba("+o+","+i+","+r+","+s+")":"HEX"===n?"0x"+e.hex.toString(16):"RGB_ARRAY"===n?"["+o+","+i+","+r+"]":"RGBA_ARRAY"===n?"["+o+","+i+","+r+","+s+"]":"RGB_OBJ"===n?"{r:"+o+",g:"+i+",b:"+r+"}":"RGBA_OBJ"===n?"{r:"+o+",g:"+i+",b:"+r+",a:"+s+"}":"HSV_OBJ"===n?"{h:"+a+",s:"+l+",v:"+d+"}":"HSVA_OBJ"===n?"{h:"+a+",s:"+l+",v:"+d+",a:"+s+"}":"unknown format"}function n(e,t,n){Object.defineProperty(e,t,{get:function(){return"RGB"===this.__state.space?this.__state[t]:(I.recalculateRGB(this,t,n),this.__state[t])},set:function(e){"RGB"!==this.__state.space&&(I.recalculateRGB(this,t,n),this.__state.space="RGB"),this.__state[t]=e}})}function o(e,t){Object.defineProperty(e,t,{get:function(){return"HSV"===this.__state.space?this.__state[t]:(I.recalculateHSV(this),this.__state[t])},set:function(e){"HSV"!==this.__state.space&&(I.recalculateHSV(this),this.__state.space="HSV"),this.__state[t]=e}})}function i(e){if("0"===e||S.isUndefined(e))return 0;var t=e.match(U);return S.isNull(t)?0:parseFloat(t[1])}function r(e){var t=e.toString();return t.indexOf(".")>-1?t.length-t.indexOf(".")-1:0}function s(e,t){var n=Math.pow(10,t);return Math.round(e*n)/n}function a(e,t,n,o,i){return o+(e-t)/(n-t)*(i-o)}function l(e,t,n,o){e.style.background="",S.each(ee,function(i){e.style.cssText+="background: "+i+"linear-gradient("+t+", "+n+" 0%, "+o+" 100%); "})}function d(e){e.style.background="",e.style.cssText+="background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);",e.style.cssText+="background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",e.style.cssText+="background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);"}function c(e,t,n){var o=document.createElement("li");return t&&o.appendChild(t),n?e.__ul.insertBefore(o,n):e.__ul.appendChild(o),e.onResize(),o}function u(e){X.unbind(window,"resize",e.__resizeHandler),e.saveToLocalStorageIfPossible&&X.unbind(window,"unload",e.saveToLocalStorageIfPossible)}function _(e,t){var n=e.__preset_select[e.__preset_select.selectedIndex];n.innerHTML=t?n.value+"*":n.value}function h(e,t,n){if(n.__li=t,n.__gui=e,S.extend(n,{options:function(t){if(arguments.length>1){var o=n.__li.nextElementSibling;return n.remove(),f(e,n.object,n.property,{before:o,factoryArgs:[S.toArray(arguments)]})}if(S.isArray(t)||S.isObject(t)){var i=n.__li.nextElementSibling;return n.remove(),f(e,n.object,n.property,{before:i,factoryArgs:[t]})}},name:function(e){return n.__li.firstElementChild.firstElementChild.innerHTML=e,n},listen:function(){return n.__gui.listen(n),n},remove:function(){return n.__gui.remove(n),n}}),n instanceof q){var o=new Q(n.object,n.property,{min:n.__min,max:n.__max,step:n.__step});S.each(["updateDisplay","onChange","onFinishChange","step","min","max"],function(e){var t=n[e],i=o[e];n[e]=o[e]=function(){var e=Array.prototype.slice.call(arguments);return i.apply(o,e),t.apply(n,e)}}),X.addClass(t,"has-slider"),n.domElement.insertBefore(o.domElement,n.domElement.firstElementChild)}else if(n instanceof Q){var i=function(t){if(S.isNumber(n.__min)&&S.isNumber(n.__max)){var o=n.__li.firstElementChild.firstElementChild.innerHTML,i=n.__gui.__listening.indexOf(n)>-1;n.remove();var r=f(e,n.object,n.property,{before:n.__li.nextElementSibling,factoryArgs:[n.__min,n.__max,n.__step]});return r.name(o),i&&r.listen(),r}return t};n.min=S.compose(i,n.min),n.max=S.compose(i,n.max)}else n instanceof K?(X.bind(t,"click",function(){X.fakeEvent(n.__checkbox,"click")}),X.bind(n.__checkbox,"click",function(e){e.stopPropagation()})):n instanceof Z?(X.bind(t,"click",function(){X.fakeEvent(n.__button,"click")}),X.bind(t,"mouseover",function(){X.addClass(n.__button,"hover")}),X.bind(t,"mouseout",function(){X.removeClass(n.__button,"hover")})):n instanceof $&&(X.addClass(t,"color"),n.updateDisplay=S.compose(function(e){return t.style.borderLeftColor=n.__color.toString(),e},n.updateDisplay),n.updateDisplay());n.setValue=S.compose(function(t){return e.getRoot().__preset_select&&n.isModified()&&_(e.getRoot(),!0),t},n.setValue)}function p(e,t){var n=e.getRoot(),o=n.__rememberedObjects.indexOf(t.object);if(-1!==o){var i=n.__rememberedObjectIndecesToControllers[o];if(void 0===i&&(i={},n.__rememberedObjectIndecesToControllers[o]=i),i[t.property]=t,n.load&&n.load.remembered){var r=n.load.remembered,s=void 0;if(r[e.preset])s=r[e.preset];else{if(!r[se])return;s=r[se]}if(s[o]&&void 0!==s[o][t.property]){var a=s[o][t.property];t.initialValue=a,t.setValue(a)}}}}function f(e,t,n,o){if(void 0===t[n])throw new Error('Object "'+t+'" has no property "'+n+'"');var i=void 0;if(o.color)i=new $(t,n);else{var r=[t,n].concat(o.factoryArgs);i=ne.apply(e,r)}o.before instanceof z&&(o.before=o.before.__li),p(e,i),X.addClass(i.domElement,"c");var s=document.createElement("span");X.addClass(s,"property-name"),s.innerHTML=i.property;var a=document.createElement("div");a.appendChild(s),a.appendChild(i.domElement);var l=c(e,a,o.before);return X.addClass(l,he.CLASS_CONTROLLER_ROW),i instanceof $?X.addClass(l,"color"):X.addClass(l,H(i.getValue())),h(e,l,i),e.__controllers.push(i),i}function m(e,t){return document.location.href+"."+t}function g(e,t,n){var o=document.createElement("option");o.innerHTML=t,o.value=t,e.__preset_select.appendChild(o),n&&(e.__preset_select.selectedIndex=e.__preset_select.length-1)}function b(e,t){t.style.display=e.useLocalStorage?"block":"none"}function v(e){var t=e.__save_row=document.createElement("li");X.addClass(e.domElement,"has-save"),e.__ul.insertBefore(t,e.__ul.firstChild),X.addClass(t,"save-row");var n=document.createElement("span");n.innerHTML=" ",X.addClass(n,"button gears");var o=document.createElement("span");o.innerHTML="Save",X.addClass(o,"button"),X.addClass(o,"save");var i=document.createElement("span");i.innerHTML="New",X.addClass(i,"button"),X.addClass(i,"save-as");var r=document.createElement("span");r.innerHTML="Revert",X.addClass(r,"button"),X.addClass(r,"revert");var s=e.__preset_select=document.createElement("select");if(e.load&&e.load.remembered?S.each(e.load.remembered,function(t,n){g(e,n,n===e.preset)}):g(e,se,!1),X.bind(s,"change",function(){for(var t=0;t=0;n--)t=[e[n].apply(this,t)];return t[0]}},each:function(e,t,n){if(e)if(A&&e.forEach&&e.forEach===A)e.forEach(t,n);else if(e.length===e.length+0){var o=void 0,i=void 0;for(o=0,i=e.length;o1?S.toArray(arguments):arguments[0];return S.each(O,function(t){if(t.litmus(e))return S.each(t.conversions,function(t,n){if(T=t.read(e),!1===L&&!1!==T)return L=T,T.conversionName=n,T.conversion=t,S.BREAK}),S.BREAK}),L},B=void 0,N={hsv_to_rgb:function(e,t,n){var o=Math.floor(e/60)%6,i=e/60-Math.floor(e/60),r=n*(1-t),s=n*(1-i*t),a=n*(1-(1-i)*t),l=[[n,a,r],[s,n,r],[r,n,a],[r,s,n],[a,r,n],[n,r,s]][o];return{r:255*l[0],g:255*l[1],b:255*l[2]}},rgb_to_hsv:function(e,t,n){var o=Math.min(e,t,n),i=Math.max(e,t,n),r=i-o,s=void 0,a=void 0;return 0===i?{h:NaN,s:0,v:0}:(a=r/i,s=e===i?(t-n)/r:t===i?2+(n-e)/r:4+(e-t)/r,(s/=6)<0&&(s+=1),{h:360*s,s:a,v:i/255})},rgb_to_hex:function(e,t,n){var o=this.hex_with_component(0,2,e);return o=this.hex_with_component(o,1,t),o=this.hex_with_component(o,0,n)},component_from_hex:function(e,t){return e>>8*t&255},hex_with_component:function(e,t,n){return n<<(B=8*t)|e&~(255<this.__max&&(n=this.__max),void 0!==this.__step&&n%this.__step!=0&&(n=Math.round(n/this.__step)*this.__step),j(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"setValue",this).call(this,n)}},{key:"min",value:function(e){return this.__min=e,this}},{key:"max",value:function(e){return this.__max=e,this}},{key:"step",value:function(e){return this.__step=e,this.__impliedStep=e,this.__precision=r(e),this}}]),t}(),Q=function(e){function t(e,n,o){function i(){l.__onFinishChange&&l.__onFinishChange.call(l,l.getValue())}function r(e){var t=d-e.clientY;l.setValue(l.getValue()+t*l.__impliedStep),d=e.clientY}function s(){X.unbind(window,"mousemove",r),X.unbind(window,"mouseup",s),i()}F(this,t);var a=V(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n,o));a.__truncationSuspended=!1;var l=a,d=void 0;return a.__input=document.createElement("input"),a.__input.setAttribute("type","text"),X.bind(a.__input,"change",function(){var e=parseFloat(l.__input.value);S.isNaN(e)||l.setValue(e)}),X.bind(a.__input,"blur",function(){i()}),X.bind(a.__input,"mousedown",function(e){X.bind(window,"mousemove",r),X.bind(window,"mouseup",s),d=e.clientY}),X.bind(a.__input,"keydown",function(e){13===e.keyCode&&(l.__truncationSuspended=!0,this.blur(),l.__truncationSuspended=!1,i())}),a.updateDisplay(),a.domElement.appendChild(a.__input),a}return D(t,W),P(t,[{key:"updateDisplay",value:function(){return this.__input.value=this.__truncationSuspended?this.getValue():s(this.getValue(),this.__precision),j(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}(),q=function(e){function t(e,n,o,i,r){function s(e){e.preventDefault();var t=_.__background.getBoundingClientRect();return _.setValue(a(e.clientX,t.left,t.right,_.__min,_.__max)),!1}function l(){X.unbind(window,"mousemove",s),X.unbind(window,"mouseup",l),_.__onFinishChange&&_.__onFinishChange.call(_,_.getValue())}function d(e){var t=e.touches[0].clientX,n=_.__background.getBoundingClientRect();_.setValue(a(t,n.left,n.right,_.__min,_.__max))}function c(){X.unbind(window,"touchmove",d),X.unbind(window,"touchend",c),_.__onFinishChange&&_.__onFinishChange.call(_,_.getValue())}F(this,t);var u=V(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n,{min:o,max:i,step:r})),_=u;return u.__background=document.createElement("div"),u.__foreground=document.createElement("div"),X.bind(u.__background,"mousedown",function(e){document.activeElement.blur(),X.bind(window,"mousemove",s),X.bind(window,"mouseup",l),s(e)}),X.bind(u.__background,"touchstart",function(e){1===e.touches.length&&(X.bind(window,"touchmove",d),X.bind(window,"touchend",c),d(e))}),X.addClass(u.__background,"slider"),X.addClass(u.__foreground,"slider-fg"),u.updateDisplay(),u.__background.appendChild(u.__foreground),u.domElement.appendChild(u.__background),u}return D(t,W),P(t,[{key:"updateDisplay",value:function(){var e=(this.getValue()-this.__min)/(this.__max-this.__min);return this.__foreground.style.width=100*e+"%",j(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}(),Z=function(e){function t(e,n,o){F(this,t);var i=V(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n)),r=i;return i.__button=document.createElement("div"),i.__button.innerHTML=void 0===o?"Fire":o,X.bind(i.__button,"click",function(e){return e.preventDefault(),r.fire(),!1}),X.addClass(i.__button,"button"),i.domElement.appendChild(i.__button),i}return D(t,z),P(t,[{key:"fire",value:function(){this.__onChange&&this.__onChange.call(this),this.getValue().call(this.object),this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue())}}]),t}(),$=function(e){function t(e,n){function o(e){u(e),X.bind(window,"mousemove",u),X.bind(window,"touchmove",u),X.bind(window,"mouseup",r),X.bind(window,"touchend",r)}function i(e){_(e),X.bind(window,"mousemove",_),X.bind(window,"touchmove",_),X.bind(window,"mouseup",s),X.bind(window,"touchend",s)}function r(){X.unbind(window,"mousemove",u),X.unbind(window,"touchmove",u),X.unbind(window,"mouseup",r),X.unbind(window,"touchend",r),c()}function s(){X.unbind(window,"mousemove",_),X.unbind(window,"touchmove",_),X.unbind(window,"mouseup",s),X.unbind(window,"touchend",s),c()}function a(){var e=R(this.value);!1!==e?(p.__color.__state=e,p.setValue(p.__color.toOriginal())):this.value=p.__color.toString()}function c(){p.__onFinishChange&&p.__onFinishChange.call(p,p.__color.toOriginal())}function u(e){-1===e.type.indexOf("touch")&&e.preventDefault();var t=p.__saturation_field.getBoundingClientRect(),n=e.touches&&e.touches[0]||e,o=n.clientX,i=n.clientY,r=(o-t.left)/(t.right-t.left),s=1-(i-t.top)/(t.bottom-t.top);return s>1?s=1:s<0&&(s=0),r>1?r=1:r<0&&(r=0),p.__color.v=s,p.__color.s=r,p.setValue(p.__color.toOriginal()),!1}function _(e){-1===e.type.indexOf("touch")&&e.preventDefault();var t=p.__hue_field.getBoundingClientRect(),n=1-((e.touches&&e.touches[0]||e).clientY-t.top)/(t.bottom-t.top);return n>1?n=1:n<0&&(n=0),p.__color.h=360*n,p.setValue(p.__color.toOriginal()),!1}F(this,t);var h=V(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n));h.__color=new I(h.getValue()),h.__temp=new I(0);var p=h;h.domElement=document.createElement("div"),X.makeSelectable(h.domElement,!1),h.__selector=document.createElement("div"),h.__selector.className="selector",h.__saturation_field=document.createElement("div"),h.__saturation_field.className="saturation-field",h.__field_knob=document.createElement("div"),h.__field_knob.className="field-knob",h.__field_knob_border="2px solid ",h.__hue_knob=document.createElement("div"),h.__hue_knob.className="hue-knob",h.__hue_field=document.createElement("div"),h.__hue_field.className="hue-field",h.__input=document.createElement("input"),h.__input.type="text",h.__input_textShadow="0 1px 1px ",X.bind(h.__input,"keydown",function(e){13===e.keyCode&&a.call(this)}),X.bind(h.__input,"blur",a),X.bind(h.__selector,"mousedown",function(){X.addClass(this,"drag").bind(window,"mouseup",function(){X.removeClass(p.__selector,"drag")})}),X.bind(h.__selector,"touchstart",function(){X.addClass(this,"drag").bind(window,"touchend",function(){X.removeClass(p.__selector,"drag")})});var f=document.createElement("div");return S.extend(h.__selector.style,{width:"122px",height:"102px",padding:"3px",backgroundColor:"#222",boxShadow:"0px 1px 3px rgba(0,0,0,0.3)"}),S.extend(h.__field_knob.style,{position:"absolute",width:"12px",height:"12px",border:h.__field_knob_border+(h.__color.v<.5?"#fff":"#000"),boxShadow:"0px 1px 3px rgba(0,0,0,0.5)",borderRadius:"12px",zIndex:1}),S.extend(h.__hue_knob.style,{position:"absolute",width:"15px",height:"2px",borderRight:"4px solid #fff",zIndex:1}),S.extend(h.__saturation_field.style,{width:"100px",height:"100px",border:"1px solid #555",marginRight:"3px",display:"inline-block",cursor:"pointer"}),S.extend(f.style,{width:"100%",height:"100%",background:"none"}),l(f,"top","rgba(0,0,0,0)","#000"),S.extend(h.__hue_field.style,{width:"15px",height:"100px",border:"1px solid #555",cursor:"ns-resize",position:"absolute",top:"3px",right:"3px"}),d(h.__hue_field),S.extend(h.__input.style,{outline:"none",textAlign:"center",color:"#fff",border:0,fontWeight:"bold",textShadow:h.__input_textShadow+"rgba(0,0,0,0.7)"}),X.bind(h.__saturation_field,"mousedown",o),X.bind(h.__saturation_field,"touchstart",o),X.bind(h.__field_knob,"mousedown",o),X.bind(h.__field_knob,"touchstart",o),X.bind(h.__hue_field,"mousedown",i),X.bind(h.__hue_field,"touchstart",i),h.__saturation_field.appendChild(f),h.__selector.appendChild(h.__field_knob),h.__selector.appendChild(h.__saturation_field),h.__selector.appendChild(h.__hue_field),h.__hue_field.appendChild(h.__hue_knob),h.domElement.appendChild(h.__input),h.domElement.appendChild(h.__selector),h.updateDisplay(),h}return D(t,z),P(t,[{key:"updateDisplay",value:function(){var e=R(this.getValue());if(!1!==e){var t=!1;S.each(I.COMPONENTS,function(n){if(!S.isUndefined(e[n])&&!S.isUndefined(this.__color.__state[n])&&e[n]!==this.__color.__state[n])return t=!0,{}},this),t&&S.extend(this.__color.__state,e)}S.extend(this.__temp.__state,this.__color.__state),this.__temp.a=1;var n=this.__color.v<.5||this.__color.s>.5?255:0,o=255-n;S.extend(this.__field_knob.style,{marginLeft:100*this.__color.s-7+"px",marginTop:100*(1-this.__color.v)-7+"px",backgroundColor:this.__temp.toHexString(),border:this.__field_knob_border+"rgb("+n+","+n+","+n+")"}),this.__hue_knob.style.marginTop=100*(1-this.__color.h/360)+"px",this.__temp.s=1,this.__temp.v=1,l(this.__saturation_field,"left","#fff",this.__temp.toHexString()),this.__input.value=this.__color.toString(),S.extend(this.__input.style,{backgroundColor:this.__color.toHexString(),color:"rgb("+n+","+n+","+n+")",textShadow:this.__input_textShadow+"rgba("+o+","+o+","+o+",.7)"})}}]),t}(),ee=["-moz-","-o-","-webkit-","-ms-",""],te={load:function(e,t){var n=t||document,o=n.createElement("link");o.type="text/css",o.rel="stylesheet",o.href=e,n.getElementsByTagName("head")[0].appendChild(o)},inject:function(e,t){var n=t||document,o=document.createElement("style");o.type="text/css",o.innerHTML=e;var i=n.getElementsByTagName("head")[0];try{i.appendChild(o)}catch(e){}}},ne=function(e,t){var n=e[t];return S.isArray(arguments[2])||S.isObject(arguments[2])?new Y(e,t,arguments[2]):S.isNumber(n)?S.isNumber(arguments[2])&&S.isNumber(arguments[3])?S.isNumber(arguments[4])?new q(e,t,arguments[2],arguments[3],arguments[4]):new q(e,t,arguments[2],arguments[3]):S.isNumber(arguments[4])?new Q(e,t,{min:arguments[2],max:arguments[3],step:arguments[4]}):new Q(e,t,{min:arguments[2],max:arguments[3]}):S.isString(n)?new J(e,t):S.isFunction(n)?new Z(e,t,""):S.isBoolean(n)?new K(e,t):null},oe=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){setTimeout(e,1e3/60)},ie=function(){function e(){F(this,e),this.backgroundElement=document.createElement("div"),S.extend(this.backgroundElement.style,{backgroundColor:"rgba(0,0,0,0.8)",top:0,left:0,display:"none",zIndex:"1000",opacity:0,WebkitTransition:"opacity 0.2s linear",transition:"opacity 0.2s linear"}),X.makeFullscreen(this.backgroundElement),this.backgroundElement.style.position="fixed",this.domElement=document.createElement("div"),S.extend(this.domElement.style,{position:"fixed",display:"none",zIndex:"1001",opacity:0,WebkitTransition:"-webkit-transform 0.2s ease-out, opacity 0.2s linear",transition:"transform 0.2s ease-out, opacity 0.2s linear"}),document.body.appendChild(this.backgroundElement),document.body.appendChild(this.domElement);var t=this;X.bind(this.backgroundElement,"click",function(){t.hide()})}return P(e,[{key:"show",value:function(){var e=this;this.backgroundElement.style.display="block",this.domElement.style.display="block",this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)",this.layout(),S.defer(function(){e.backgroundElement.style.opacity=1,e.domElement.style.opacity=1,e.domElement.style.webkitTransform="scale(1)"})}},{key:"hide",value:function(){var e=this,t=function t(){e.domElement.style.display="none",e.backgroundElement.style.display="none",X.unbind(e.domElement,"webkitTransitionEnd",t),X.unbind(e.domElement,"transitionend",t),X.unbind(e.domElement,"oTransitionEnd",t)};X.bind(this.domElement,"webkitTransitionEnd",t),X.bind(this.domElement,"transitionend",t),X.bind(this.domElement,"oTransitionEnd",t),this.backgroundElement.style.opacity=0,this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)"}},{key:"layout",value:function(){this.domElement.style.left=window.innerWidth/2-X.getWidth(this.domElement)/2+"px",this.domElement.style.top=window.innerHeight/2-X.getHeight(this.domElement)/2+"px"}}]),e}(),re=function(e){if(e&&"undefined"!=typeof window){var t=document.createElement("style");return t.setAttribute("type","text/css"),t.innerHTML=e,document.head.appendChild(t),e}}(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n");te.inject(re);var se="Default",ae=function(){try{return!!window.localStorage}catch(e){return!1}}(),le=void 0,de=!0,ce=void 0,ue=!1,_e=[],he=function e(t){var n=this,o=t||{};this.domElement=document.createElement("div"),this.__ul=document.createElement("ul"),this.domElement.appendChild(this.__ul),X.addClass(this.domElement,"dg"),this.__folders={},this.__controllers=[],this.__rememberedObjects=[],this.__rememberedObjectIndecesToControllers=[],this.__listening=[],o=S.defaults(o,{closeOnTop:!1,autoPlace:!0,width:e.DEFAULT_WIDTH}),o=S.defaults(o,{resizable:o.autoPlace,hideable:o.autoPlace}),S.isUndefined(o.load)?o.load={preset:se}:o.preset&&(o.load.preset=o.preset),S.isUndefined(o.parent)&&o.hideable&&_e.push(this),o.resizable=S.isUndefined(o.parent)&&o.resizable,o.autoPlace&&S.isUndefined(o.scrollable)&&(o.scrollable=!0);var i=ae&&"true"===localStorage.getItem(m(this,"isLocal")),r=void 0,s=void 0;if(Object.defineProperties(this,{parent:{get:function(){return o.parent}},scrollable:{get:function(){return o.scrollable}},autoPlace:{get:function(){return o.autoPlace}},closeOnTop:{get:function(){return o.closeOnTop}},preset:{get:function(){return n.parent?n.getRoot().preset:o.load.preset},set:function(e){n.parent?n.getRoot().preset=e:o.load.preset=e,E(this),n.revert()}},width:{get:function(){return o.width},set:function(e){o.width=e,w(n,e)}},name:{get:function(){return o.name},set:function(e){o.name=e,s&&(s.innerHTML=o.name)}},closed:{get:function(){return o.closed},set:function(t){o.closed=t,o.closed?X.addClass(n.__ul,e.CLASS_CLOSED):X.removeClass(n.__ul,e.CLASS_CLOSED),this.onResize(),n.__closeButton&&(n.__closeButton.innerHTML=t?e.TEXT_OPEN:e.TEXT_CLOSED)}},load:{get:function(){return o.load}},useLocalStorage:{get:function(){return i},set:function(e){ae&&(i=e,e?X.bind(window,"unload",r):X.unbind(window,"unload",r),localStorage.setItem(m(n,"isLocal"),e))}}}),S.isUndefined(o.parent)){if(this.closed=o.closed||!1,X.addClass(this.domElement,e.CLASS_MAIN),X.makeSelectable(this.domElement,!1),ae&&i){n.useLocalStorage=!0;var a=localStorage.getItem(m(this,"gui"));a&&(o.load=JSON.parse(a))}this.__closeButton=document.createElement("div"),this.__closeButton.innerHTML=e.TEXT_CLOSED,X.addClass(this.__closeButton,e.CLASS_CLOSE_BUTTON),o.closeOnTop?(X.addClass(this.__closeButton,e.CLASS_CLOSE_TOP),this.domElement.insertBefore(this.__closeButton,this.domElement.childNodes[0])):(X.addClass(this.__closeButton,e.CLASS_CLOSE_BOTTOM),this.domElement.appendChild(this.__closeButton)),X.bind(this.__closeButton,"click",function(){n.closed=!n.closed})}else{void 0===o.closed&&(o.closed=!0);var l=document.createTextNode(o.name);X.addClass(l,"controller-name"),s=c(n,l);X.addClass(this.__ul,e.CLASS_CLOSED),X.addClass(s,"title"),X.bind(s,"click",function(e){return e.preventDefault(),n.closed=!n.closed,!1}),o.closed||(this.closed=!1)}o.autoPlace&&(S.isUndefined(o.parent)&&(de&&(ce=document.createElement("div"),X.addClass(ce,"dg"),X.addClass(ce,e.CLASS_AUTO_PLACE_CONTAINER),document.body.appendChild(ce),de=!1),ce.appendChild(this.domElement),X.addClass(this.domElement,e.CLASS_AUTO_PLACE)),this.parent||w(n,o.width)),this.__resizeHandler=function(){n.onResizeDebounced()},X.bind(window,"resize",this.__resizeHandler),X.bind(this.__ul,"webkitTransitionEnd",this.__resizeHandler),X.bind(this.__ul,"transitionend",this.__resizeHandler),X.bind(this.__ul,"oTransitionEnd",this.__resizeHandler),this.onResize(),o.resizable&&y(this),r=function(){ae&&"true"===localStorage.getItem(m(n,"isLocal"))&&localStorage.setItem(m(n,"gui"),JSON.stringify(n.getSaveObject()))},this.saveToLocalStorageIfPossible=r,o.parent||function(){var e=n.getRoot();e.width+=1,S.defer(function(){e.width-=1})}()};he.toggleHide=function(){ue=!ue,S.each(_e,function(e){e.domElement.style.display=ue?"none":""})},he.CLASS_AUTO_PLACE="a",he.CLASS_AUTO_PLACE_CONTAINER="ac",he.CLASS_MAIN="main",he.CLASS_CONTROLLER_ROW="cr",he.CLASS_TOO_TALL="taller-than-window",he.CLASS_CLOSED="closed",he.CLASS_CLOSE_BUTTON="close-button",he.CLASS_CLOSE_TOP="close-top",he.CLASS_CLOSE_BOTTOM="close-bottom",he.CLASS_DRAG="drag",he.DEFAULT_WIDTH=245,he.TEXT_CLOSED="Close Controls",he.TEXT_OPEN="Open Controls",he._keydownHandler=function(e){"text"===document.activeElement.type||72!==e.which&&72!==e.keyCode||he.toggleHide()},X.bind(window,"keydown",he._keydownHandler,!1),S.extend(he.prototype,{add:function(e,t){return f(this,e,t,{factoryArgs:Array.prototype.slice.call(arguments,2)})},addColor:function(e,t){return f(this,e,t,{color:!0})},remove:function(e){this.__ul.removeChild(e.__li),this.__controllers.splice(this.__controllers.indexOf(e),1);var t=this;S.defer(function(){t.onResize()})},destroy:function(){if(this.parent)throw new Error("Only the root GUI should be removed with .destroy(). For subfolders, use gui.removeFolder(folder) instead.");this.autoPlace&&ce.removeChild(this.domElement);var e=this;S.each(this.__folders,function(t){e.removeFolder(t)}),X.unbind(window,"keydown",he._keydownHandler,!1),u(this)},addFolder:function(e){if(void 0!==this.__folders[e])throw new Error('You already have a folder in this GUI by the name "'+e+'"');var t={name:e,parent:this};t.autoPlace=this.autoPlace,this.load&&this.load.folders&&this.load.folders[e]&&(t.closed=this.load.folders[e].closed,t.load=this.load.folders[e]);var n=new he(t);this.__folders[e]=n;var o=c(this,n.domElement);return X.addClass(o,"folder"),n},removeFolder:function(e){this.__ul.removeChild(e.domElement.parentElement),delete this.__folders[e.name],this.load&&this.load.folders&&this.load.folders[e.name]&&delete this.load.folders[e.name],u(e);var t=this;S.each(e.__folders,function(t){e.removeFolder(t)}),S.defer(function(){t.onResize()})},open:function(){this.closed=!1},close:function(){this.closed=!0},hide:function(){this.domElement.style.display="none"},show:function(){this.domElement.style.display=""},onResize:function(){var e=this.getRoot();if(e.scrollable){var t=X.getOffset(e.__ul).top,n=0;S.each(e.__ul.childNodes,function(t){e.autoPlace&&t===e.__save_row||(n+=X.getHeight(t))}),window.innerHeight-t-20GUI\'s constructor:\n\n \n\n
        \n\n Automatically save\n values to localStorage on exit.\n\n
        The values saved to localStorage will\n override those passed to dat.GUI\'s constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
        \n\n
        \n\n'),this.parent)throw new Error("You can only call remember on a top level GUI.");var e=this;S.each(Array.prototype.slice.call(arguments),function(t){0===e.__rememberedObjects.length&&v(e),-1===e.__rememberedObjects.indexOf(t)&&e.__rememberedObjects.push(t)}),this.autoPlace&&w(this,this.width)},getRoot:function(){for(var e=this;e.parent;)e=e.parent;return e},getSaveObject:function(){var e=this.load;return e.closed=this.closed,this.__rememberedObjects.length>0&&(e.preset=this.preset,e.remembered||(e.remembered={}),e.remembered[this.preset]=x(this)),e.folders={},S.each(this.__folders,function(t,n){e.folders[n]=t.getSaveObject()}),e},save:function(){this.load.remembered||(this.load.remembered={}),this.load.remembered[this.preset]=x(this),_(this,!1),this.saveToLocalStorageIfPossible()},saveAs:function(e){this.load.remembered||(this.load.remembered={},this.load.remembered[se]=x(this,!0)),this.load.remembered[e]=x(this),this.preset=e,g(this,e,!0),this.saveToLocalStorageIfPossible()},revert:function(e){S.each(this.__controllers,function(t){this.getRoot().load.remembered?p(e||this.getRoot(),t):t.setValue(t.initialValue),t.__onFinishChange&&t.__onFinishChange.call(t,t.getValue())},this),S.each(this.__folders,function(e){e.revert(e)}),e||_(this.getRoot(),!1)},listen:function(e){var t=0===this.__listening.length;this.__listening.push(e),t&&C(this.__listening)},updateDisplay:function(){S.each(this.__controllers,function(e){e.updateDisplay()}),S.each(this.__folders,function(e){e.updateDisplay()})}});var pe={Color:I,math:N,interpret:R},fe={Controller:z,BooleanController:K,OptionController:Y,StringController:J,NumberController:W,NumberControllerBox:Q,NumberControllerSlider:q,FunctionController:Z,ColorController:$},me={dom:X},ge={GUI:he},be=he,ve={color:pe,controllers:fe,dom:me,gui:ge,GUI:be};e.color=pe,e.controllers=fe,e.dom=me,e.gui=ge,e.GUI=be,e.default=ve,Object.defineProperty(e,"__esModule",{value:!0})}); diff --git a/public/build/dat.gui.module.js b/public/build/dat.gui.module.js deleted file mode 100644 index b067e9b8e..000000000 --- a/public/build/dat.gui.module.js +++ /dev/null @@ -1,2523 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -function ___$insertStyle(css) { - if (!css) { - return; - } - if (typeof window === 'undefined') { - return; - } - - var style = document.createElement('style'); - - style.setAttribute('type', 'text/css'); - style.innerHTML = css; - document.head.appendChild(style); - - return css; -} - -function colorToString (color, forceCSSHex) { - var colorFormat = color.__state.conversionName.toString(); - var r = Math.round(color.r); - var g = Math.round(color.g); - var b = Math.round(color.b); - var a = color.a; - var h = Math.round(color.h); - var s = color.s.toFixed(1); - var v = color.v.toFixed(1); - if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') { - var str = color.hex.toString(16); - while (str.length < 6) { - str = '0' + str; - } - return '#' + str; - } else if (colorFormat === 'CSS_RGB') { - return 'rgb(' + r + ',' + g + ',' + b + ')'; - } else if (colorFormat === 'CSS_RGBA') { - return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; - } else if (colorFormat === 'HEX') { - return '0x' + color.hex.toString(16); - } else if (colorFormat === 'RGB_ARRAY') { - return '[' + r + ',' + g + ',' + b + ']'; - } else if (colorFormat === 'RGBA_ARRAY') { - return '[' + r + ',' + g + ',' + b + ',' + a + ']'; - } else if (colorFormat === 'RGB_OBJ') { - return '{r:' + r + ',g:' + g + ',b:' + b + '}'; - } else if (colorFormat === 'RGBA_OBJ') { - return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}'; - } else if (colorFormat === 'HSV_OBJ') { - return '{h:' + h + ',s:' + s + ',v:' + v + '}'; - } else if (colorFormat === 'HSVA_OBJ') { - return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}'; - } - return 'unknown format'; -} - -var ARR_EACH = Array.prototype.forEach; -var ARR_SLICE = Array.prototype.slice; -var Common = { - BREAK: {}, - extend: function extend(target) { - this.each(ARR_SLICE.call(arguments, 1), function (obj) { - var keys = this.isObject(obj) ? Object.keys(obj) : []; - keys.forEach(function (key) { - if (!this.isUndefined(obj[key])) { - target[key] = obj[key]; - } - }.bind(this)); - }, this); - return target; - }, - defaults: function defaults(target) { - this.each(ARR_SLICE.call(arguments, 1), function (obj) { - var keys = this.isObject(obj) ? Object.keys(obj) : []; - keys.forEach(function (key) { - if (this.isUndefined(target[key])) { - target[key] = obj[key]; - } - }.bind(this)); - }, this); - return target; - }, - compose: function compose() { - var toCall = ARR_SLICE.call(arguments); - return function () { - var args = ARR_SLICE.call(arguments); - for (var i = toCall.length - 1; i >= 0; i--) { - args = [toCall[i].apply(this, args)]; - } - return args[0]; - }; - }, - each: function each(obj, itr, scope) { - if (!obj) { - return; - } - if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) { - obj.forEach(itr, scope); - } else if (obj.length === obj.length + 0) { - var key = void 0; - var l = void 0; - for (key = 0, l = obj.length; key < l; key++) { - if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) { - return; - } - } - } else { - for (var _key in obj) { - if (itr.call(scope, obj[_key], _key) === this.BREAK) { - return; - } - } - } - }, - defer: function defer(fnc) { - setTimeout(fnc, 0); - }, - debounce: function debounce(func, threshold, callImmediately) { - var timeout = void 0; - return function () { - var obj = this; - var args = arguments; - function delayed() { - timeout = null; - if (!callImmediately) func.apply(obj, args); - } - var callNow = callImmediately || !timeout; - clearTimeout(timeout); - timeout = setTimeout(delayed, threshold); - if (callNow) { - func.apply(obj, args); - } - }; - }, - toArray: function toArray(obj) { - if (obj.toArray) return obj.toArray(); - return ARR_SLICE.call(obj); - }, - isUndefined: function isUndefined(obj) { - return obj === undefined; - }, - isNull: function isNull(obj) { - return obj === null; - }, - isNaN: function (_isNaN) { - function isNaN(_x) { - return _isNaN.apply(this, arguments); - } - isNaN.toString = function () { - return _isNaN.toString(); - }; - return isNaN; - }(function (obj) { - return isNaN(obj); - }), - isArray: Array.isArray || function (obj) { - return obj.constructor === Array; - }, - isObject: function isObject(obj) { - return obj === Object(obj); - }, - isNumber: function isNumber(obj) { - return obj === obj + 0; - }, - isString: function isString(obj) { - return obj === obj + ''; - }, - isBoolean: function isBoolean(obj) { - return obj === false || obj === true; - }, - isFunction: function isFunction(obj) { - return Object.prototype.toString.call(obj) === '[object Function]'; - } -}; - -var INTERPRETATIONS = [ -{ - litmus: Common.isString, - conversions: { - THREE_CHAR_HEX: { - read: function read(original) { - var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); - if (test === null) { - return false; - } - return { - space: 'HEX', - hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0) - }; - }, - write: colorToString - }, - SIX_CHAR_HEX: { - read: function read(original) { - var test = original.match(/^#([A-F0-9]{6})$/i); - if (test === null) { - return false; - } - return { - space: 'HEX', - hex: parseInt('0x' + test[1].toString(), 0) - }; - }, - write: colorToString - }, - CSS_RGB: { - read: function read(original) { - var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); - if (test === null) { - return false; - } - return { - space: 'RGB', - r: parseFloat(test[1]), - g: parseFloat(test[2]), - b: parseFloat(test[3]) - }; - }, - write: colorToString - }, - CSS_RGBA: { - read: function read(original) { - var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); - if (test === null) { - return false; - } - return { - space: 'RGB', - r: parseFloat(test[1]), - g: parseFloat(test[2]), - b: parseFloat(test[3]), - a: parseFloat(test[4]) - }; - }, - write: colorToString - } - } -}, -{ - litmus: Common.isNumber, - conversions: { - HEX: { - read: function read(original) { - return { - space: 'HEX', - hex: original, - conversionName: 'HEX' - }; - }, - write: function write(color) { - return color.hex; - } - } - } -}, -{ - litmus: Common.isArray, - conversions: { - RGB_ARRAY: { - read: function read(original) { - if (original.length !== 3) { - return false; - } - return { - space: 'RGB', - r: original[0], - g: original[1], - b: original[2] - }; - }, - write: function write(color) { - return [color.r, color.g, color.b]; - } - }, - RGBA_ARRAY: { - read: function read(original) { - if (original.length !== 4) return false; - return { - space: 'RGB', - r: original[0], - g: original[1], - b: original[2], - a: original[3] - }; - }, - write: function write(color) { - return [color.r, color.g, color.b, color.a]; - } - } - } -}, -{ - litmus: Common.isObject, - conversions: { - RGBA_OBJ: { - read: function read(original) { - if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) { - return { - space: 'RGB', - r: original.r, - g: original.g, - b: original.b, - a: original.a - }; - } - return false; - }, - write: function write(color) { - return { - r: color.r, - g: color.g, - b: color.b, - a: color.a - }; - } - }, - RGB_OBJ: { - read: function read(original) { - if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) { - return { - space: 'RGB', - r: original.r, - g: original.g, - b: original.b - }; - } - return false; - }, - write: function write(color) { - return { - r: color.r, - g: color.g, - b: color.b - }; - } - }, - HSVA_OBJ: { - read: function read(original) { - if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) { - return { - space: 'HSV', - h: original.h, - s: original.s, - v: original.v, - a: original.a - }; - } - return false; - }, - write: function write(color) { - return { - h: color.h, - s: color.s, - v: color.v, - a: color.a - }; - } - }, - HSV_OBJ: { - read: function read(original) { - if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) { - return { - space: 'HSV', - h: original.h, - s: original.s, - v: original.v - }; - } - return false; - }, - write: function write(color) { - return { - h: color.h, - s: color.s, - v: color.v - }; - } - } - } -}]; -var result = void 0; -var toReturn = void 0; -var interpret = function interpret() { - toReturn = false; - var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0]; - Common.each(INTERPRETATIONS, function (family) { - if (family.litmus(original)) { - Common.each(family.conversions, function (conversion, conversionName) { - result = conversion.read(original); - if (toReturn === false && result !== false) { - toReturn = result; - result.conversionName = conversionName; - result.conversion = conversion; - return Common.BREAK; - } - }); - return Common.BREAK; - } - }); - return toReturn; -}; - -var tmpComponent = void 0; -var ColorMath = { - hsv_to_rgb: function hsv_to_rgb(h, s, v) { - var hi = Math.floor(h / 60) % 6; - var f = h / 60 - Math.floor(h / 60); - var p = v * (1.0 - s); - var q = v * (1.0 - f * s); - var t = v * (1.0 - (1.0 - f) * s); - var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi]; - return { - r: c[0] * 255, - g: c[1] * 255, - b: c[2] * 255 - }; - }, - rgb_to_hsv: function rgb_to_hsv(r, g, b) { - var min = Math.min(r, g, b); - var max = Math.max(r, g, b); - var delta = max - min; - var h = void 0; - var s = void 0; - if (max !== 0) { - s = delta / max; - } else { - return { - h: NaN, - s: 0, - v: 0 - }; - } - if (r === max) { - h = (g - b) / delta; - } else if (g === max) { - h = 2 + (b - r) / delta; - } else { - h = 4 + (r - g) / delta; - } - h /= 6; - if (h < 0) { - h += 1; - } - return { - h: h * 360, - s: s, - v: max / 255 - }; - }, - rgb_to_hex: function rgb_to_hex(r, g, b) { - var hex = this.hex_with_component(0, 2, r); - hex = this.hex_with_component(hex, 1, g); - hex = this.hex_with_component(hex, 0, b); - return hex; - }, - component_from_hex: function component_from_hex(hex, componentIndex) { - return hex >> componentIndex * 8 & 0xFF; - }, - hex_with_component: function hex_with_component(hex, componentIndex, value) { - return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent); - } -}; - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { - return typeof obj; -} : function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; -}; - - - - - - - - - - - -var classCallCheck = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}; - -var createClass = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; -}(); - - - - - - - -var get = function get(object, property, receiver) { - if (object === null) object = Function.prototype; - var desc = Object.getOwnPropertyDescriptor(object, property); - - if (desc === undefined) { - var parent = Object.getPrototypeOf(object); - - if (parent === null) { - return undefined; - } else { - return get(parent, property, receiver); - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get; - - if (getter === undefined) { - return undefined; - } - - return getter.call(receiver); - } -}; - -var inherits = function (subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: false, - writable: true, - configurable: true - } - }); - if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -}; - - - - - - - - - - - -var possibleConstructorReturn = function (self, call) { - if (!self) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return call && (typeof call === "object" || typeof call === "function") ? call : self; -}; - -var Color = function () { - function Color() { - classCallCheck(this, Color); - this.__state = interpret.apply(this, arguments); - if (this.__state === false) { - throw new Error('Failed to interpret color arguments'); - } - this.__state.a = this.__state.a || 1; - } - createClass(Color, [{ - key: 'toString', - value: function toString() { - return colorToString(this); - } - }, { - key: 'toHexString', - value: function toHexString() { - return colorToString(this, true); - } - }, { - key: 'toOriginal', - value: function toOriginal() { - return this.__state.conversion.write(this); - } - }]); - return Color; -}(); -function defineRGBComponent(target, component, componentHexIndex) { - Object.defineProperty(target, component, { - get: function get$$1() { - if (this.__state.space === 'RGB') { - return this.__state[component]; - } - Color.recalculateRGB(this, component, componentHexIndex); - return this.__state[component]; - }, - set: function set$$1(v) { - if (this.__state.space !== 'RGB') { - Color.recalculateRGB(this, component, componentHexIndex); - this.__state.space = 'RGB'; - } - this.__state[component] = v; - } - }); -} -function defineHSVComponent(target, component) { - Object.defineProperty(target, component, { - get: function get$$1() { - if (this.__state.space === 'HSV') { - return this.__state[component]; - } - Color.recalculateHSV(this); - return this.__state[component]; - }, - set: function set$$1(v) { - if (this.__state.space !== 'HSV') { - Color.recalculateHSV(this); - this.__state.space = 'HSV'; - } - this.__state[component] = v; - } - }); -} -Color.recalculateRGB = function (color, component, componentHexIndex) { - if (color.__state.space === 'HEX') { - color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex); - } else if (color.__state.space === 'HSV') { - Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); - } else { - throw new Error('Corrupted color state'); - } -}; -Color.recalculateHSV = function (color) { - var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b); - Common.extend(color.__state, { - s: result.s, - v: result.v - }); - if (!Common.isNaN(result.h)) { - color.__state.h = result.h; - } else if (Common.isUndefined(color.__state.h)) { - color.__state.h = 0; - } -}; -Color.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a']; -defineRGBComponent(Color.prototype, 'r', 2); -defineRGBComponent(Color.prototype, 'g', 1); -defineRGBComponent(Color.prototype, 'b', 0); -defineHSVComponent(Color.prototype, 'h'); -defineHSVComponent(Color.prototype, 's'); -defineHSVComponent(Color.prototype, 'v'); -Object.defineProperty(Color.prototype, 'a', { - get: function get$$1() { - return this.__state.a; - }, - set: function set$$1(v) { - this.__state.a = v; - } -}); -Object.defineProperty(Color.prototype, 'hex', { - get: function get$$1() { - if (!this.__state.space !== 'HEX') { - this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b); - } - return this.__state.hex; - }, - set: function set$$1(v) { - this.__state.space = 'HEX'; - this.__state.hex = v; - } -}); - -var Controller = function () { - function Controller(object, property) { - classCallCheck(this, Controller); - this.initialValue = object[property]; - this.domElement = document.createElement('div'); - this.object = object; - this.property = property; - this.__onChange = undefined; - this.__onFinishChange = undefined; - } - createClass(Controller, [{ - key: 'onChange', - value: function onChange(fnc) { - this.__onChange = fnc; - return this; - } - }, { - key: 'onFinishChange', - value: function onFinishChange(fnc) { - this.__onFinishChange = fnc; - return this; - } - }, { - key: 'setValue', - value: function setValue(newValue) { - this.object[this.property] = newValue; - if (this.__onChange) { - this.__onChange.call(this, newValue); - } - this.updateDisplay(); - return this; - } - }, { - key: 'getValue', - value: function getValue() { - return this.object[this.property]; - } - }, { - key: 'updateDisplay', - value: function updateDisplay() { - return this; - } - }, { - key: 'isModified', - value: function isModified() { - return this.initialValue !== this.getValue(); - } - }]); - return Controller; -}(); - -var EVENT_MAP = { - HTMLEvents: ['change'], - MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'], - KeyboardEvents: ['keydown'] -}; -var EVENT_MAP_INV = {}; -Common.each(EVENT_MAP, function (v, k) { - Common.each(v, function (e) { - EVENT_MAP_INV[e] = k; - }); -}); -var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; -function cssValueToPixels(val) { - if (val === '0' || Common.isUndefined(val)) { - return 0; - } - var match = val.match(CSS_VALUE_PIXELS); - if (!Common.isNull(match)) { - return parseFloat(match[1]); - } - return 0; -} -var dom = { - makeSelectable: function makeSelectable(elem, selectable) { - if (elem === undefined || elem.style === undefined) return; - elem.onselectstart = selectable ? function () { - return false; - } : function () {}; - elem.style.MozUserSelect = selectable ? 'auto' : 'none'; - elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; - elem.unselectable = selectable ? 'on' : 'off'; - }, - makeFullscreen: function makeFullscreen(elem, hor, vert) { - var vertical = vert; - var horizontal = hor; - if (Common.isUndefined(horizontal)) { - horizontal = true; - } - if (Common.isUndefined(vertical)) { - vertical = true; - } - elem.style.position = 'absolute'; - if (horizontal) { - elem.style.left = 0; - elem.style.right = 0; - } - if (vertical) { - elem.style.top = 0; - elem.style.bottom = 0; - } - }, - fakeEvent: function fakeEvent(elem, eventType, pars, aux) { - var params = pars || {}; - var className = EVENT_MAP_INV[eventType]; - if (!className) { - throw new Error('Event type ' + eventType + ' not supported.'); - } - var evt = document.createEvent(className); - switch (className) { - case 'MouseEvents': - { - var clientX = params.x || params.clientX || 0; - var clientY = params.y || params.clientY || 0; - evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0, - 0, - clientX, - clientY, - false, false, false, false, 0, null); - break; - } - case 'KeyboardEvents': - { - var init = evt.initKeyboardEvent || evt.initKeyEvent; - Common.defaults(params, { - cancelable: true, - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false, - keyCode: undefined, - charCode: undefined - }); - init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode); - break; - } - default: - { - evt.initEvent(eventType, params.bubbles || false, params.cancelable || true); - break; - } - } - Common.defaults(evt, aux); - elem.dispatchEvent(evt); - }, - bind: function bind(elem, event, func, newBool) { - var bool = newBool || false; - if (elem.addEventListener) { - elem.addEventListener(event, func, bool); - } else if (elem.attachEvent) { - elem.attachEvent('on' + event, func); - } - return dom; - }, - unbind: function unbind(elem, event, func, newBool) { - var bool = newBool || false; - if (elem.removeEventListener) { - elem.removeEventListener(event, func, bool); - } else if (elem.detachEvent) { - elem.detachEvent('on' + event, func); - } - return dom; - }, - addClass: function addClass(elem, className) { - if (elem.className === undefined) { - elem.className = className; - } else if (elem.className !== className) { - var classes = elem.className.split(/ +/); - if (classes.indexOf(className) === -1) { - classes.push(className); - elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); - } - } - return dom; - }, - removeClass: function removeClass(elem, className) { - if (className) { - if (elem.className === className) { - elem.removeAttribute('class'); - } else { - var classes = elem.className.split(/ +/); - var index = classes.indexOf(className); - if (index !== -1) { - classes.splice(index, 1); - elem.className = classes.join(' '); - } - } - } else { - elem.className = undefined; - } - return dom; - }, - hasClass: function hasClass(elem, className) { - return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; - }, - getWidth: function getWidth(elem) { - var style = getComputedStyle(elem); - return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width); - }, - getHeight: function getHeight(elem) { - var style = getComputedStyle(elem); - return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height); - }, - getOffset: function getOffset(el) { - var elem = el; - var offset = { left: 0, top: 0 }; - if (elem.offsetParent) { - do { - offset.left += elem.offsetLeft; - offset.top += elem.offsetTop; - elem = elem.offsetParent; - } while (elem); - } - return offset; - }, - isActive: function isActive(elem) { - return elem === document.activeElement && (elem.type || elem.href); - } -}; - -var BooleanController = function (_Controller) { - inherits(BooleanController, _Controller); - function BooleanController(object, property) { - classCallCheck(this, BooleanController); - var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property)); - var _this = _this2; - _this2.__prev = _this2.getValue(); - _this2.__checkbox = document.createElement('input'); - _this2.__checkbox.setAttribute('type', 'checkbox'); - function onChange() { - _this.setValue(!_this.__prev); - } - dom.bind(_this2.__checkbox, 'change', onChange, false); - _this2.domElement.appendChild(_this2.__checkbox); - _this2.updateDisplay(); - return _this2; - } - createClass(BooleanController, [{ - key: 'setValue', - value: function setValue(v) { - var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - this.__prev = this.getValue(); - return toReturn; - } - }, { - key: 'updateDisplay', - value: function updateDisplay() { - if (this.getValue() === true) { - this.__checkbox.setAttribute('checked', 'checked'); - this.__checkbox.checked = true; - this.__prev = true; - } else { - this.__checkbox.checked = false; - this.__prev = false; - } - return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this); - } - }]); - return BooleanController; -}(Controller); - -var OptionController = function (_Controller) { - inherits(OptionController, _Controller); - function OptionController(object, property, opts) { - classCallCheck(this, OptionController); - var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property)); - var options = opts; - var _this = _this2; - _this2.__select = document.createElement('select'); - if (Common.isArray(options)) { - var map = {}; - Common.each(options, function (element) { - map[element] = element; - }); - options = map; - } - Common.each(options, function (value, key) { - var opt = document.createElement('option'); - opt.innerHTML = key; - opt.setAttribute('value', value); - _this.__select.appendChild(opt); - }); - _this2.updateDisplay(); - dom.bind(_this2.__select, 'change', function () { - var desiredValue = this.options[this.selectedIndex].value; - _this.setValue(desiredValue); - }); - _this2.domElement.appendChild(_this2.__select); - return _this2; - } - createClass(OptionController, [{ - key: 'setValue', - value: function setValue(v) { - var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - return toReturn; - } - }, { - key: 'updateDisplay', - value: function updateDisplay() { - if (dom.isActive(this.__select)) return this; - this.__select.value = this.getValue(); - return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this); - } - }]); - return OptionController; -}(Controller); - -var StringController = function (_Controller) { - inherits(StringController, _Controller); - function StringController(object, property) { - classCallCheck(this, StringController); - var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property)); - var _this = _this2; - function onChange() { - _this.setValue(_this.__input.value); - } - function onBlur() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - _this2.__input = document.createElement('input'); - _this2.__input.setAttribute('type', 'text'); - dom.bind(_this2.__input, 'keyup', onChange); - dom.bind(_this2.__input, 'change', onChange); - dom.bind(_this2.__input, 'blur', onBlur); - dom.bind(_this2.__input, 'keydown', function (e) { - if (e.keyCode === 13) { - this.blur(); - } - }); - _this2.updateDisplay(); - _this2.domElement.appendChild(_this2.__input); - return _this2; - } - createClass(StringController, [{ - key: 'updateDisplay', - value: function updateDisplay() { - if (!dom.isActive(this.__input)) { - this.__input.value = this.getValue(); - } - return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this); - } - }]); - return StringController; -}(Controller); - -function numDecimals(x) { - var _x = x.toString(); - if (_x.indexOf('.') > -1) { - return _x.length - _x.indexOf('.') - 1; - } - return 0; -} -var NumberController = function (_Controller) { - inherits(NumberController, _Controller); - function NumberController(object, property, params) { - classCallCheck(this, NumberController); - var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property)); - var _params = params || {}; - _this.__min = _params.min; - _this.__max = _params.max; - _this.__step = _params.step; - if (Common.isUndefined(_this.__step)) { - if (_this.initialValue === 0) { - _this.__impliedStep = 1; - } else { - _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10; - } - } else { - _this.__impliedStep = _this.__step; - } - _this.__precision = numDecimals(_this.__impliedStep); - return _this; - } - createClass(NumberController, [{ - key: 'setValue', - value: function setValue(v) { - var _v = v; - if (this.__min !== undefined && _v < this.__min) { - _v = this.__min; - } else if (this.__max !== undefined && _v > this.__max) { - _v = this.__max; - } - if (this.__step !== undefined && _v % this.__step !== 0) { - _v = Math.round(_v / this.__step) * this.__step; - } - return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v); - } - }, { - key: 'min', - value: function min(minValue) { - this.__min = minValue; - return this; - } - }, { - key: 'max', - value: function max(maxValue) { - this.__max = maxValue; - return this; - } - }, { - key: 'step', - value: function step(stepValue) { - this.__step = stepValue; - this.__impliedStep = stepValue; - this.__precision = numDecimals(stepValue); - return this; - } - }]); - return NumberController; -}(Controller); - -function roundToDecimal(value, decimals) { - var tenTo = Math.pow(10, decimals); - return Math.round(value * tenTo) / tenTo; -} -var NumberControllerBox = function (_NumberController) { - inherits(NumberControllerBox, _NumberController); - function NumberControllerBox(object, property, params) { - classCallCheck(this, NumberControllerBox); - var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params)); - _this2.__truncationSuspended = false; - var _this = _this2; - var prevY = void 0; - function onChange() { - var attempted = parseFloat(_this.__input.value); - if (!Common.isNaN(attempted)) { - _this.setValue(attempted); - } - } - function onFinish() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - function onBlur() { - onFinish(); - } - function onMouseDrag(e) { - var diff = prevY - e.clientY; - _this.setValue(_this.getValue() + diff * _this.__impliedStep); - prevY = e.clientY; - } - function onMouseUp() { - dom.unbind(window, 'mousemove', onMouseDrag); - dom.unbind(window, 'mouseup', onMouseUp); - onFinish(); - } - function onMouseDown(e) { - dom.bind(window, 'mousemove', onMouseDrag); - dom.bind(window, 'mouseup', onMouseUp); - prevY = e.clientY; - } - _this2.__input = document.createElement('input'); - _this2.__input.setAttribute('type', 'text'); - dom.bind(_this2.__input, 'change', onChange); - dom.bind(_this2.__input, 'blur', onBlur); - dom.bind(_this2.__input, 'mousedown', onMouseDown); - dom.bind(_this2.__input, 'keydown', function (e) { - if (e.keyCode === 13) { - _this.__truncationSuspended = true; - this.blur(); - _this.__truncationSuspended = false; - onFinish(); - } - }); - _this2.updateDisplay(); - _this2.domElement.appendChild(_this2.__input); - return _this2; - } - createClass(NumberControllerBox, [{ - key: 'updateDisplay', - value: function updateDisplay() { - this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); - return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this); - } - }]); - return NumberControllerBox; -}(NumberController); - -function map(v, i1, i2, o1, o2) { - return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); -} -var NumberControllerSlider = function (_NumberController) { - inherits(NumberControllerSlider, _NumberController); - function NumberControllerSlider(object, property, min, max, step) { - classCallCheck(this, NumberControllerSlider); - var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step })); - var _this = _this2; - _this2.__background = document.createElement('div'); - _this2.__foreground = document.createElement('div'); - dom.bind(_this2.__background, 'mousedown', onMouseDown); - dom.bind(_this2.__background, 'touchstart', onTouchStart); - dom.addClass(_this2.__background, 'slider'); - dom.addClass(_this2.__foreground, 'slider-fg'); - function onMouseDown(e) { - document.activeElement.blur(); - dom.bind(window, 'mousemove', onMouseDrag); - dom.bind(window, 'mouseup', onMouseUp); - onMouseDrag(e); - } - function onMouseDrag(e) { - e.preventDefault(); - var bgRect = _this.__background.getBoundingClientRect(); - _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); - return false; - } - function onMouseUp() { - dom.unbind(window, 'mousemove', onMouseDrag); - dom.unbind(window, 'mouseup', onMouseUp); - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - function onTouchStart(e) { - if (e.touches.length !== 1) { - return; - } - dom.bind(window, 'touchmove', onTouchMove); - dom.bind(window, 'touchend', onTouchEnd); - onTouchMove(e); - } - function onTouchMove(e) { - var clientX = e.touches[0].clientX; - var bgRect = _this.__background.getBoundingClientRect(); - _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); - } - function onTouchEnd() { - dom.unbind(window, 'touchmove', onTouchMove); - dom.unbind(window, 'touchend', onTouchEnd); - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - _this2.updateDisplay(); - _this2.__background.appendChild(_this2.__foreground); - _this2.domElement.appendChild(_this2.__background); - return _this2; - } - createClass(NumberControllerSlider, [{ - key: 'updateDisplay', - value: function updateDisplay() { - var pct = (this.getValue() - this.__min) / (this.__max - this.__min); - this.__foreground.style.width = pct * 100 + '%'; - return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this); - } - }]); - return NumberControllerSlider; -}(NumberController); - -var FunctionController = function (_Controller) { - inherits(FunctionController, _Controller); - function FunctionController(object, property, text) { - classCallCheck(this, FunctionController); - var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property)); - var _this = _this2; - _this2.__button = document.createElement('div'); - _this2.__button.innerHTML = text === undefined ? 'Fire' : text; - dom.bind(_this2.__button, 'click', function (e) { - e.preventDefault(); - _this.fire(); - return false; - }); - dom.addClass(_this2.__button, 'button'); - _this2.domElement.appendChild(_this2.__button); - return _this2; - } - createClass(FunctionController, [{ - key: 'fire', - value: function fire() { - if (this.__onChange) { - this.__onChange.call(this); - } - this.getValue().call(this.object); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - } - }]); - return FunctionController; -}(Controller); - -var ColorController = function (_Controller) { - inherits(ColorController, _Controller); - function ColorController(object, property) { - classCallCheck(this, ColorController); - var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property)); - _this2.__color = new Color(_this2.getValue()); - _this2.__temp = new Color(0); - var _this = _this2; - _this2.domElement = document.createElement('div'); - dom.makeSelectable(_this2.domElement, false); - _this2.__selector = document.createElement('div'); - _this2.__selector.className = 'selector'; - _this2.__saturation_field = document.createElement('div'); - _this2.__saturation_field.className = 'saturation-field'; - _this2.__field_knob = document.createElement('div'); - _this2.__field_knob.className = 'field-knob'; - _this2.__field_knob_border = '2px solid '; - _this2.__hue_knob = document.createElement('div'); - _this2.__hue_knob.className = 'hue-knob'; - _this2.__hue_field = document.createElement('div'); - _this2.__hue_field.className = 'hue-field'; - _this2.__input = document.createElement('input'); - _this2.__input.type = 'text'; - _this2.__input_textShadow = '0 1px 1px '; - dom.bind(_this2.__input, 'keydown', function (e) { - if (e.keyCode === 13) { - onBlur.call(this); - } - }); - dom.bind(_this2.__input, 'blur', onBlur); - dom.bind(_this2.__selector, 'mousedown', function () { - dom.addClass(this, 'drag').bind(window, 'mouseup', function () { - dom.removeClass(_this.__selector, 'drag'); - }); - }); - dom.bind(_this2.__selector, 'touchstart', function () { - dom.addClass(this, 'drag').bind(window, 'touchend', function () { - dom.removeClass(_this.__selector, 'drag'); - }); - }); - var valueField = document.createElement('div'); - Common.extend(_this2.__selector.style, { - width: '122px', - height: '102px', - padding: '3px', - backgroundColor: '#222', - boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' - }); - Common.extend(_this2.__field_knob.style, { - position: 'absolute', - width: '12px', - height: '12px', - border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'), - boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', - borderRadius: '12px', - zIndex: 1 - }); - Common.extend(_this2.__hue_knob.style, { - position: 'absolute', - width: '15px', - height: '2px', - borderRight: '4px solid #fff', - zIndex: 1 - }); - Common.extend(_this2.__saturation_field.style, { - width: '100px', - height: '100px', - border: '1px solid #555', - marginRight: '3px', - display: 'inline-block', - cursor: 'pointer' - }); - Common.extend(valueField.style, { - width: '100%', - height: '100%', - background: 'none' - }); - linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000'); - Common.extend(_this2.__hue_field.style, { - width: '15px', - height: '100px', - border: '1px solid #555', - cursor: 'ns-resize', - position: 'absolute', - top: '3px', - right: '3px' - }); - hueGradient(_this2.__hue_field); - Common.extend(_this2.__input.style, { - outline: 'none', - textAlign: 'center', - color: '#fff', - border: 0, - fontWeight: 'bold', - textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)' - }); - dom.bind(_this2.__saturation_field, 'mousedown', fieldDown); - dom.bind(_this2.__saturation_field, 'touchstart', fieldDown); - dom.bind(_this2.__field_knob, 'mousedown', fieldDown); - dom.bind(_this2.__field_knob, 'touchstart', fieldDown); - dom.bind(_this2.__hue_field, 'mousedown', fieldDownH); - dom.bind(_this2.__hue_field, 'touchstart', fieldDownH); - function fieldDown(e) { - setSV(e); - dom.bind(window, 'mousemove', setSV); - dom.bind(window, 'touchmove', setSV); - dom.bind(window, 'mouseup', fieldUpSV); - dom.bind(window, 'touchend', fieldUpSV); - } - function fieldDownH(e) { - setH(e); - dom.bind(window, 'mousemove', setH); - dom.bind(window, 'touchmove', setH); - dom.bind(window, 'mouseup', fieldUpH); - dom.bind(window, 'touchend', fieldUpH); - } - function fieldUpSV() { - dom.unbind(window, 'mousemove', setSV); - dom.unbind(window, 'touchmove', setSV); - dom.unbind(window, 'mouseup', fieldUpSV); - dom.unbind(window, 'touchend', fieldUpSV); - onFinish(); - } - function fieldUpH() { - dom.unbind(window, 'mousemove', setH); - dom.unbind(window, 'touchmove', setH); - dom.unbind(window, 'mouseup', fieldUpH); - dom.unbind(window, 'touchend', fieldUpH); - onFinish(); - } - function onBlur() { - var i = interpret(this.value); - if (i !== false) { - _this.__color.__state = i; - _this.setValue(_this.__color.toOriginal()); - } else { - this.value = _this.__color.toString(); - } - } - function onFinish() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.__color.toOriginal()); - } - } - _this2.__saturation_field.appendChild(valueField); - _this2.__selector.appendChild(_this2.__field_knob); - _this2.__selector.appendChild(_this2.__saturation_field); - _this2.__selector.appendChild(_this2.__hue_field); - _this2.__hue_field.appendChild(_this2.__hue_knob); - _this2.domElement.appendChild(_this2.__input); - _this2.domElement.appendChild(_this2.__selector); - _this2.updateDisplay(); - function setSV(e) { - if (e.type.indexOf('touch') === -1) { - e.preventDefault(); - } - var fieldRect = _this.__saturation_field.getBoundingClientRect(); - var _ref = e.touches && e.touches[0] || e, - clientX = _ref.clientX, - clientY = _ref.clientY; - var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left); - var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); - if (v > 1) { - v = 1; - } else if (v < 0) { - v = 0; - } - if (s > 1) { - s = 1; - } else if (s < 0) { - s = 0; - } - _this.__color.v = v; - _this.__color.s = s; - _this.setValue(_this.__color.toOriginal()); - return false; - } - function setH(e) { - if (e.type.indexOf('touch') === -1) { - e.preventDefault(); - } - var fieldRect = _this.__hue_field.getBoundingClientRect(); - var _ref2 = e.touches && e.touches[0] || e, - clientY = _ref2.clientY; - var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); - if (h > 1) { - h = 1; - } else if (h < 0) { - h = 0; - } - _this.__color.h = h * 360; - _this.setValue(_this.__color.toOriginal()); - return false; - } - return _this2; - } - createClass(ColorController, [{ - key: 'updateDisplay', - value: function updateDisplay() { - var i = interpret(this.getValue()); - if (i !== false) { - var mismatch = false; - Common.each(Color.COMPONENTS, function (component) { - if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) { - mismatch = true; - return {}; - } - }, this); - if (mismatch) { - Common.extend(this.__color.__state, i); - } - } - Common.extend(this.__temp.__state, this.__color.__state); - this.__temp.a = 1; - var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0; - var _flip = 255 - flip; - Common.extend(this.__field_knob.style, { - marginLeft: 100 * this.__color.s - 7 + 'px', - marginTop: 100 * (1 - this.__color.v) - 7 + 'px', - backgroundColor: this.__temp.toHexString(), - border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')' - }); - this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'; - this.__temp.s = 1; - this.__temp.v = 1; - linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString()); - this.__input.value = this.__color.toString(); - Common.extend(this.__input.style, { - backgroundColor: this.__color.toHexString(), - color: 'rgb(' + flip + ',' + flip + ',' + flip + ')', - textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)' - }); - } - }]); - return ColorController; -}(Controller); -var vendors = ['-moz-', '-o-', '-webkit-', '-ms-', '']; -function linearGradient(elem, x, a, b) { - elem.style.background = ''; - Common.each(vendors, function (vendor) { - elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); '; - }); -} -function hueGradient(elem) { - elem.style.background = ''; - elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'; - elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; -} - -var css = { - load: function load(url, indoc) { - var doc = indoc || document; - var link = doc.createElement('link'); - link.type = 'text/css'; - link.rel = 'stylesheet'; - link.href = url; - doc.getElementsByTagName('head')[0].appendChild(link); - }, - inject: function inject(cssContent, indoc) { - var doc = indoc || document; - var injected = document.createElement('style'); - injected.type = 'text/css'; - injected.innerHTML = cssContent; - var head = doc.getElementsByTagName('head')[0]; - try { - head.appendChild(injected); - } catch (e) { - } - } -}; - -var saveDialogContents = "
        \n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
        \n\n Automatically save\n values to localStorage on exit.\n\n
        The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
        \n\n
        \n\n
        "; - -var ControllerFactory = function ControllerFactory(object, property) { - var initialValue = object[property]; - if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) { - return new OptionController(object, property, arguments[2]); - } - if (Common.isNumber(initialValue)) { - if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) { - if (Common.isNumber(arguments[4])) { - return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]); - } - return new NumberControllerSlider(object, property, arguments[2], arguments[3]); - } - if (Common.isNumber(arguments[4])) { - return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] }); - } - return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); - } - if (Common.isString(initialValue)) { - return new StringController(object, property); - } - if (Common.isFunction(initialValue)) { - return new FunctionController(object, property, ''); - } - if (Common.isBoolean(initialValue)) { - return new BooleanController(object, property); - } - return null; -}; - -function requestAnimationFrame(callback) { - setTimeout(callback, 1000 / 60); -} -var requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame; - -var CenteredDiv = function () { - function CenteredDiv() { - classCallCheck(this, CenteredDiv); - this.backgroundElement = document.createElement('div'); - Common.extend(this.backgroundElement.style, { - backgroundColor: 'rgba(0,0,0,0.8)', - top: 0, - left: 0, - display: 'none', - zIndex: '1000', - opacity: 0, - WebkitTransition: 'opacity 0.2s linear', - transition: 'opacity 0.2s linear' - }); - dom.makeFullscreen(this.backgroundElement); - this.backgroundElement.style.position = 'fixed'; - this.domElement = document.createElement('div'); - Common.extend(this.domElement.style, { - position: 'fixed', - display: 'none', - zIndex: '1001', - opacity: 0, - WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear', - transition: 'transform 0.2s ease-out, opacity 0.2s linear' - }); - document.body.appendChild(this.backgroundElement); - document.body.appendChild(this.domElement); - var _this = this; - dom.bind(this.backgroundElement, 'click', function () { - _this.hide(); - }); - } - createClass(CenteredDiv, [{ - key: 'show', - value: function show() { - var _this = this; - this.backgroundElement.style.display = 'block'; - this.domElement.style.display = 'block'; - this.domElement.style.opacity = 0; - this.domElement.style.webkitTransform = 'scale(1.1)'; - this.layout(); - Common.defer(function () { - _this.backgroundElement.style.opacity = 1; - _this.domElement.style.opacity = 1; - _this.domElement.style.webkitTransform = 'scale(1)'; - }); - } - }, { - key: 'hide', - value: function hide() { - var _this = this; - var hide = function hide() { - _this.domElement.style.display = 'none'; - _this.backgroundElement.style.display = 'none'; - dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); - dom.unbind(_this.domElement, 'transitionend', hide); - dom.unbind(_this.domElement, 'oTransitionEnd', hide); - }; - dom.bind(this.domElement, 'webkitTransitionEnd', hide); - dom.bind(this.domElement, 'transitionend', hide); - dom.bind(this.domElement, 'oTransitionEnd', hide); - this.backgroundElement.style.opacity = 0; - this.domElement.style.opacity = 0; - this.domElement.style.webkitTransform = 'scale(1.1)'; - } - }, { - key: 'layout', - value: function layout() { - this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px'; - this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px'; - } - }]); - return CenteredDiv; -}(); - -var styleSheet = ___$insertStyle(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"); - -css.inject(styleSheet); -var CSS_NAMESPACE = 'dg'; -var HIDE_KEY_CODE = 72; -var CLOSE_BUTTON_HEIGHT = 20; -var DEFAULT_DEFAULT_PRESET_NAME = 'Default'; -var SUPPORTS_LOCAL_STORAGE = function () { - try { - return !!window.localStorage; - } catch (e) { - return false; - } -}(); -var SAVE_DIALOGUE = void 0; -var autoPlaceVirgin = true; -var autoPlaceContainer = void 0; -var hide = false; -var hideableGuis = []; -var GUI = function GUI(pars) { - var _this = this; - var params = pars || {}; - this.domElement = document.createElement('div'); - this.__ul = document.createElement('ul'); - this.domElement.appendChild(this.__ul); - dom.addClass(this.domElement, CSS_NAMESPACE); - this.__folders = {}; - this.__controllers = []; - this.__rememberedObjects = []; - this.__rememberedObjectIndecesToControllers = []; - this.__listening = []; - params = Common.defaults(params, { - closeOnTop: false, - autoPlace: true, - width: GUI.DEFAULT_WIDTH - }); - params = Common.defaults(params, { - resizable: params.autoPlace, - hideable: params.autoPlace - }); - if (!Common.isUndefined(params.load)) { - if (params.preset) { - params.load.preset = params.preset; - } - } else { - params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; - } - if (Common.isUndefined(params.parent) && params.hideable) { - hideableGuis.push(this); - } - params.resizable = Common.isUndefined(params.parent) && params.resizable; - if (params.autoPlace && Common.isUndefined(params.scrollable)) { - params.scrollable = true; - } - var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; - var saveToLocalStorage = void 0; - var titleRow = void 0; - Object.defineProperties(this, - { - parent: { - get: function get$$1() { - return params.parent; - } - }, - scrollable: { - get: function get$$1() { - return params.scrollable; - } - }, - autoPlace: { - get: function get$$1() { - return params.autoPlace; - } - }, - closeOnTop: { - get: function get$$1() { - return params.closeOnTop; - } - }, - preset: { - get: function get$$1() { - if (_this.parent) { - return _this.getRoot().preset; - } - return params.load.preset; - }, - set: function set$$1(v) { - if (_this.parent) { - _this.getRoot().preset = v; - } else { - params.load.preset = v; - } - setPresetSelectIndex(this); - _this.revert(); - } - }, - width: { - get: function get$$1() { - return params.width; - }, - set: function set$$1(v) { - params.width = v; - setWidth(_this, v); - } - }, - name: { - get: function get$$1() { - return params.name; - }, - set: function set$$1(v) { - params.name = v; - if (titleRow) { - titleRow.innerHTML = params.name; - } - } - }, - closed: { - get: function get$$1() { - return params.closed; - }, - set: function set$$1(v) { - params.closed = v; - if (params.closed) { - dom.addClass(_this.__ul, GUI.CLASS_CLOSED); - } else { - dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); - } - this.onResize(); - if (_this.__closeButton) { - _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; - } - } - }, - load: { - get: function get$$1() { - return params.load; - } - }, - useLocalStorage: { - get: function get$$1() { - return useLocalStorage; - }, - set: function set$$1(bool) { - if (SUPPORTS_LOCAL_STORAGE) { - useLocalStorage = bool; - if (bool) { - dom.bind(window, 'unload', saveToLocalStorage); - } else { - dom.unbind(window, 'unload', saveToLocalStorage); - } - localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); - } - } - } - }); - if (Common.isUndefined(params.parent)) { - this.closed = params.closed || false; - dom.addClass(this.domElement, GUI.CLASS_MAIN); - dom.makeSelectable(this.domElement, false); - if (SUPPORTS_LOCAL_STORAGE) { - if (useLocalStorage) { - _this.useLocalStorage = true; - var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui')); - if (savedGui) { - params.load = JSON.parse(savedGui); - } - } - } - this.__closeButton = document.createElement('div'); - this.__closeButton.innerHTML = GUI.TEXT_CLOSED; - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); - if (params.closeOnTop) { - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP); - this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]); - } else { - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM); - this.domElement.appendChild(this.__closeButton); - } - dom.bind(this.__closeButton, 'click', function () { - _this.closed = !_this.closed; - }); - } else { - if (params.closed === undefined) { - params.closed = true; - } - var titleRowName = document.createTextNode(params.name); - dom.addClass(titleRowName, 'controller-name'); - titleRow = addRow(_this, titleRowName); - var onClickTitle = function onClickTitle(e) { - e.preventDefault(); - _this.closed = !_this.closed; - return false; - }; - dom.addClass(this.__ul, GUI.CLASS_CLOSED); - dom.addClass(titleRow, 'title'); - dom.bind(titleRow, 'click', onClickTitle); - if (!params.closed) { - this.closed = false; - } - } - if (params.autoPlace) { - if (Common.isUndefined(params.parent)) { - if (autoPlaceVirgin) { - autoPlaceContainer = document.createElement('div'); - dom.addClass(autoPlaceContainer, CSS_NAMESPACE); - dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER); - document.body.appendChild(autoPlaceContainer); - autoPlaceVirgin = false; - } - autoPlaceContainer.appendChild(this.domElement); - dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); - } - if (!this.parent) { - setWidth(_this, params.width); - } - } - this.__resizeHandler = function () { - _this.onResizeDebounced(); - }; - dom.bind(window, 'resize', this.__resizeHandler); - dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler); - dom.bind(this.__ul, 'transitionend', this.__resizeHandler); - dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler); - this.onResize(); - if (params.resizable) { - addResizeHandle(this); - } - saveToLocalStorage = function saveToLocalStorage() { - if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') { - localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); - } - }; - this.saveToLocalStorageIfPossible = saveToLocalStorage; - function resetWidth() { - var root = _this.getRoot(); - root.width += 1; - Common.defer(function () { - root.width -= 1; - }); - } - if (!params.parent) { - resetWidth(); - } -}; -GUI.toggleHide = function () { - hide = !hide; - Common.each(hideableGuis, function (gui) { - gui.domElement.style.display = hide ? 'none' : ''; - }); -}; -GUI.CLASS_AUTO_PLACE = 'a'; -GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; -GUI.CLASS_MAIN = 'main'; -GUI.CLASS_CONTROLLER_ROW = 'cr'; -GUI.CLASS_TOO_TALL = 'taller-than-window'; -GUI.CLASS_CLOSED = 'closed'; -GUI.CLASS_CLOSE_BUTTON = 'close-button'; -GUI.CLASS_CLOSE_TOP = 'close-top'; -GUI.CLASS_CLOSE_BOTTOM = 'close-bottom'; -GUI.CLASS_DRAG = 'drag'; -GUI.DEFAULT_WIDTH = 245; -GUI.TEXT_CLOSED = 'Close Controls'; -GUI.TEXT_OPEN = 'Open Controls'; -GUI._keydownHandler = function (e) { - if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) { - GUI.toggleHide(); - } -}; -dom.bind(window, 'keydown', GUI._keydownHandler, false); -Common.extend(GUI.prototype, -{ - add: function add(object, property) { - return _add(this, object, property, { - factoryArgs: Array.prototype.slice.call(arguments, 2) - }); - }, - addColor: function addColor(object, property) { - return _add(this, object, property, { - color: true - }); - }, - remove: function remove(controller) { - this.__ul.removeChild(controller.__li); - this.__controllers.splice(this.__controllers.indexOf(controller), 1); - var _this = this; - Common.defer(function () { - _this.onResize(); - }); - }, - destroy: function destroy() { - if (this.parent) { - throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.'); - } - if (this.autoPlace) { - autoPlaceContainer.removeChild(this.domElement); - } - var _this = this; - Common.each(this.__folders, function (subfolder) { - _this.removeFolder(subfolder); - }); - dom.unbind(window, 'keydown', GUI._keydownHandler, false); - removeListeners(this); - }, - addFolder: function addFolder(name) { - if (this.__folders[name] !== undefined) { - throw new Error('You already have a folder in this GUI by the' + ' name "' + name + '"'); - } - var newGuiParams = { name: name, parent: this }; - newGuiParams.autoPlace = this.autoPlace; - if (this.load && - this.load.folders && - this.load.folders[name]) { - newGuiParams.closed = this.load.folders[name].closed; - newGuiParams.load = this.load.folders[name]; - } - var gui = new GUI(newGuiParams); - this.__folders[name] = gui; - var li = addRow(this, gui.domElement); - dom.addClass(li, 'folder'); - return gui; - }, - removeFolder: function removeFolder(folder) { - this.__ul.removeChild(folder.domElement.parentElement); - delete this.__folders[folder.name]; - if (this.load && - this.load.folders && - this.load.folders[folder.name]) { - delete this.load.folders[folder.name]; - } - removeListeners(folder); - var _this = this; - Common.each(folder.__folders, function (subfolder) { - folder.removeFolder(subfolder); - }); - Common.defer(function () { - _this.onResize(); - }); - }, - open: function open() { - this.closed = false; - }, - close: function close() { - this.closed = true; - }, - hide: function hide() { - this.domElement.style.display = 'none'; - }, - show: function show() { - this.domElement.style.display = ''; - }, - onResize: function onResize() { - var root = this.getRoot(); - if (root.scrollable) { - var top = dom.getOffset(root.__ul).top; - var h = 0; - Common.each(root.__ul.childNodes, function (node) { - if (!(root.autoPlace && node === root.__save_row)) { - h += dom.getHeight(node); - } - }); - if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { - dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); - root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; - } else { - dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); - root.__ul.style.height = 'auto'; - } - } - if (root.__resize_handle) { - Common.defer(function () { - root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; - }); - } - if (root.__closeButton) { - root.__closeButton.style.width = root.width + 'px'; - } - }, - onResizeDebounced: Common.debounce(function () { - this.onResize(); - }, 50), - remember: function remember() { - if (Common.isUndefined(SAVE_DIALOGUE)) { - SAVE_DIALOGUE = new CenteredDiv(); - SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents; - } - if (this.parent) { - throw new Error('You can only call remember on a top level GUI.'); - } - var _this = this; - Common.each(Array.prototype.slice.call(arguments), function (object) { - if (_this.__rememberedObjects.length === 0) { - addSaveMenu(_this); - } - if (_this.__rememberedObjects.indexOf(object) === -1) { - _this.__rememberedObjects.push(object); - } - }); - if (this.autoPlace) { - setWidth(this, this.width); - } - }, - getRoot: function getRoot() { - var gui = this; - while (gui.parent) { - gui = gui.parent; - } - return gui; - }, - getSaveObject: function getSaveObject() { - var toReturn = this.load; - toReturn.closed = this.closed; - if (this.__rememberedObjects.length > 0) { - toReturn.preset = this.preset; - if (!toReturn.remembered) { - toReturn.remembered = {}; - } - toReturn.remembered[this.preset] = getCurrentPreset(this); - } - toReturn.folders = {}; - Common.each(this.__folders, function (element, key) { - toReturn.folders[key] = element.getSaveObject(); - }); - return toReturn; - }, - save: function save() { - if (!this.load.remembered) { - this.load.remembered = {}; - } - this.load.remembered[this.preset] = getCurrentPreset(this); - markPresetModified(this, false); - this.saveToLocalStorageIfPossible(); - }, - saveAs: function saveAs(presetName) { - if (!this.load.remembered) { - this.load.remembered = {}; - this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); - } - this.load.remembered[presetName] = getCurrentPreset(this); - this.preset = presetName; - addPresetOption(this, presetName, true); - this.saveToLocalStorageIfPossible(); - }, - revert: function revert(gui) { - Common.each(this.__controllers, function (controller) { - if (!this.getRoot().load.remembered) { - controller.setValue(controller.initialValue); - } else { - recallSavedValue(gui || this.getRoot(), controller); - } - if (controller.__onFinishChange) { - controller.__onFinishChange.call(controller, controller.getValue()); - } - }, this); - Common.each(this.__folders, function (folder) { - folder.revert(folder); - }); - if (!gui) { - markPresetModified(this.getRoot(), false); - } - }, - listen: function listen(controller) { - var init = this.__listening.length === 0; - this.__listening.push(controller); - if (init) { - updateDisplays(this.__listening); - } - }, - updateDisplay: function updateDisplay() { - Common.each(this.__controllers, function (controller) { - controller.updateDisplay(); - }); - Common.each(this.__folders, function (folder) { - folder.updateDisplay(); - }); - } -}); -function addRow(gui, newDom, liBefore) { - var li = document.createElement('li'); - if (newDom) { - li.appendChild(newDom); - } - if (liBefore) { - gui.__ul.insertBefore(li, liBefore); - } else { - gui.__ul.appendChild(li); - } - gui.onResize(); - return li; -} -function removeListeners(gui) { - dom.unbind(window, 'resize', gui.__resizeHandler); - if (gui.saveToLocalStorageIfPossible) { - dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible); - } -} -function markPresetModified(gui, modified) { - var opt = gui.__preset_select[gui.__preset_select.selectedIndex]; - if (modified) { - opt.innerHTML = opt.value + '*'; - } else { - opt.innerHTML = opt.value; - } -} -function augmentController(gui, li, controller) { - controller.__li = li; - controller.__gui = gui; - Common.extend(controller, { - options: function options(_options) { - if (arguments.length > 1) { - var nextSibling = controller.__li.nextElementSibling; - controller.remove(); - return _add(gui, controller.object, controller.property, { - before: nextSibling, - factoryArgs: [Common.toArray(arguments)] - }); - } - if (Common.isArray(_options) || Common.isObject(_options)) { - var _nextSibling = controller.__li.nextElementSibling; - controller.remove(); - return _add(gui, controller.object, controller.property, { - before: _nextSibling, - factoryArgs: [_options] - }); - } - }, - name: function name(_name) { - controller.__li.firstElementChild.firstElementChild.innerHTML = _name; - return controller; - }, - listen: function listen() { - controller.__gui.listen(controller); - return controller; - }, - remove: function remove() { - controller.__gui.remove(controller); - return controller; - } - }); - if (controller instanceof NumberControllerSlider) { - var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step }); - Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) { - var pc = controller[method]; - var pb = box[method]; - controller[method] = box[method] = function () { - var args = Array.prototype.slice.call(arguments); - pb.apply(box, args); - return pc.apply(controller, args); - }; - }); - dom.addClass(li, 'has-slider'); - controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); - } else if (controller instanceof NumberControllerBox) { - var r = function r(returned) { - if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) { - var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML; - var wasListening = controller.__gui.__listening.indexOf(controller) > -1; - controller.remove(); - var newController = _add(gui, controller.object, controller.property, { - before: controller.__li.nextElementSibling, - factoryArgs: [controller.__min, controller.__max, controller.__step] - }); - newController.name(oldName); - if (wasListening) newController.listen(); - return newController; - } - return returned; - }; - controller.min = Common.compose(r, controller.min); - controller.max = Common.compose(r, controller.max); - } else if (controller instanceof BooleanController) { - dom.bind(li, 'click', function () { - dom.fakeEvent(controller.__checkbox, 'click'); - }); - dom.bind(controller.__checkbox, 'click', function (e) { - e.stopPropagation(); - }); - } else if (controller instanceof FunctionController) { - dom.bind(li, 'click', function () { - dom.fakeEvent(controller.__button, 'click'); - }); - dom.bind(li, 'mouseover', function () { - dom.addClass(controller.__button, 'hover'); - }); - dom.bind(li, 'mouseout', function () { - dom.removeClass(controller.__button, 'hover'); - }); - } else if (controller instanceof ColorController) { - dom.addClass(li, 'color'); - controller.updateDisplay = Common.compose(function (val) { - li.style.borderLeftColor = controller.__color.toString(); - return val; - }, controller.updateDisplay); - controller.updateDisplay(); - } - controller.setValue = Common.compose(function (val) { - if (gui.getRoot().__preset_select && controller.isModified()) { - markPresetModified(gui.getRoot(), true); - } - return val; - }, controller.setValue); -} -function recallSavedValue(gui, controller) { - var root = gui.getRoot(); - var matchedIndex = root.__rememberedObjects.indexOf(controller.object); - if (matchedIndex !== -1) { - var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex]; - if (controllerMap === undefined) { - controllerMap = {}; - root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap; - } - controllerMap[controller.property] = controller; - if (root.load && root.load.remembered) { - var presetMap = root.load.remembered; - var preset = void 0; - if (presetMap[gui.preset]) { - preset = presetMap[gui.preset]; - } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) { - preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME]; - } else { - return; - } - if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) { - var value = preset[matchedIndex][controller.property]; - controller.initialValue = value; - controller.setValue(value); - } - } - } -} -function _add(gui, object, property, params) { - if (object[property] === undefined) { - throw new Error('Object "' + object + '" has no property "' + property + '"'); - } - var controller = void 0; - if (params.color) { - controller = new ColorController(object, property); - } else { - var factoryArgs = [object, property].concat(params.factoryArgs); - controller = ControllerFactory.apply(gui, factoryArgs); - } - if (params.before instanceof Controller) { - params.before = params.before.__li; - } - recallSavedValue(gui, controller); - dom.addClass(controller.domElement, 'c'); - var name = document.createElement('span'); - dom.addClass(name, 'property-name'); - name.innerHTML = controller.property; - var container = document.createElement('div'); - container.appendChild(name); - container.appendChild(controller.domElement); - var li = addRow(gui, container, params.before); - dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); - if (controller instanceof ColorController) { - dom.addClass(li, 'color'); - } else { - dom.addClass(li, _typeof(controller.getValue())); - } - augmentController(gui, li, controller); - gui.__controllers.push(controller); - return controller; -} -function getLocalStorageHash(gui, key) { - return document.location.href + '.' + key; -} -function addPresetOption(gui, name, setSelected) { - var opt = document.createElement('option'); - opt.innerHTML = name; - opt.value = name; - gui.__preset_select.appendChild(opt); - if (setSelected) { - gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; - } -} -function showHideExplain(gui, explain) { - explain.style.display = gui.useLocalStorage ? 'block' : 'none'; -} -function addSaveMenu(gui) { - var div = gui.__save_row = document.createElement('li'); - dom.addClass(gui.domElement, 'has-save'); - gui.__ul.insertBefore(div, gui.__ul.firstChild); - dom.addClass(div, 'save-row'); - var gears = document.createElement('span'); - gears.innerHTML = ' '; - dom.addClass(gears, 'button gears'); - var button = document.createElement('span'); - button.innerHTML = 'Save'; - dom.addClass(button, 'button'); - dom.addClass(button, 'save'); - var button2 = document.createElement('span'); - button2.innerHTML = 'New'; - dom.addClass(button2, 'button'); - dom.addClass(button2, 'save-as'); - var button3 = document.createElement('span'); - button3.innerHTML = 'Revert'; - dom.addClass(button3, 'button'); - dom.addClass(button3, 'revert'); - var select = gui.__preset_select = document.createElement('select'); - if (gui.load && gui.load.remembered) { - Common.each(gui.load.remembered, function (value, key) { - addPresetOption(gui, key, key === gui.preset); - }); - } else { - addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); - } - dom.bind(select, 'change', function () { - for (var index = 0; index < gui.__preset_select.length; index++) { - gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; - } - gui.preset = this.value; - }); - div.appendChild(select); - div.appendChild(gears); - div.appendChild(button); - div.appendChild(button2); - div.appendChild(button3); - if (SUPPORTS_LOCAL_STORAGE) { - var explain = document.getElementById('dg-local-explain'); - var localStorageCheckBox = document.getElementById('dg-local-storage'); - var saveLocally = document.getElementById('dg-save-locally'); - saveLocally.style.display = 'block'; - if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { - localStorageCheckBox.setAttribute('checked', 'checked'); - } - showHideExplain(gui, explain); - dom.bind(localStorageCheckBox, 'change', function () { - gui.useLocalStorage = !gui.useLocalStorage; - showHideExplain(gui, explain); - }); - } - var newConstructorTextArea = document.getElementById('dg-new-constructor'); - dom.bind(newConstructorTextArea, 'keydown', function (e) { - if (e.metaKey && (e.which === 67 || e.keyCode === 67)) { - SAVE_DIALOGUE.hide(); - } - }); - dom.bind(gears, 'click', function () { - newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); - SAVE_DIALOGUE.show(); - newConstructorTextArea.focus(); - newConstructorTextArea.select(); - }); - dom.bind(button, 'click', function () { - gui.save(); - }); - dom.bind(button2, 'click', function () { - var presetName = prompt('Enter a new preset name.'); - if (presetName) { - gui.saveAs(presetName); - } - }); - dom.bind(button3, 'click', function () { - gui.revert(); - }); -} -function addResizeHandle(gui) { - var pmouseX = void 0; - gui.__resize_handle = document.createElement('div'); - Common.extend(gui.__resize_handle.style, { - width: '6px', - marginLeft: '-3px', - height: '200px', - cursor: 'ew-resize', - position: 'absolute' - }); - function drag(e) { - e.preventDefault(); - gui.width += pmouseX - e.clientX; - gui.onResize(); - pmouseX = e.clientX; - return false; - } - function dragStop() { - dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); - dom.unbind(window, 'mousemove', drag); - dom.unbind(window, 'mouseup', dragStop); - } - function dragStart(e) { - e.preventDefault(); - pmouseX = e.clientX; - dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); - dom.bind(window, 'mousemove', drag); - dom.bind(window, 'mouseup', dragStop); - return false; - } - dom.bind(gui.__resize_handle, 'mousedown', dragStart); - dom.bind(gui.__closeButton, 'mousedown', dragStart); - gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); -} -function setWidth(gui, w) { - gui.domElement.style.width = w + 'px'; - if (gui.__save_row && gui.autoPlace) { - gui.__save_row.style.width = w + 'px'; - } - if (gui.__closeButton) { - gui.__closeButton.style.width = w + 'px'; - } -} -function getCurrentPreset(gui, useInitialValues) { - var toReturn = {}; - Common.each(gui.__rememberedObjects, function (val, index) { - var savedValues = {}; - var controllerMap = gui.__rememberedObjectIndecesToControllers[index]; - Common.each(controllerMap, function (controller, property) { - savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue(); - }); - toReturn[index] = savedValues; - }); - return toReturn; -} -function setPresetSelectIndex(gui) { - for (var index = 0; index < gui.__preset_select.length; index++) { - if (gui.__preset_select[index].value === gui.preset) { - gui.__preset_select.selectedIndex = index; - } - } -} -function updateDisplays(controllerArray) { - if (controllerArray.length !== 0) { - requestAnimationFrame$1.call(window, function () { - updateDisplays(controllerArray); - }); - } - Common.each(controllerArray, function (c) { - c.updateDisplay(); - }); -} - -var color = { - Color: Color, - math: ColorMath, - interpret: interpret -}; -var controllers = { - Controller: Controller, - BooleanController: BooleanController, - OptionController: OptionController, - StringController: StringController, - NumberController: NumberController, - NumberControllerBox: NumberControllerBox, - NumberControllerSlider: NumberControllerSlider, - FunctionController: FunctionController, - ColorController: ColorController -}; -var dom$1 = { dom: dom }; -var gui = { GUI: GUI }; -var GUI$1 = GUI; -var index = { - color: color, - controllers: controllers, - dom: dom$1, - gui: gui, - GUI: GUI$1 -}; - -export { color, controllers, dom$1 as dom, gui, GUI$1 as GUI }; -export default index; -//# sourceMappingURL=dat.gui.module.js.map diff --git a/public/build/dat.gui.module.js.map b/public/build/dat.gui.module.js.map deleted file mode 100644 index 15c522a3f..000000000 --- a/public/build/dat.gui.module.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dat.gui.module.js","sources":["../src/dat/color/toString.js","../src/dat/utils/common.js","../src/dat/color/interpret.js","../src/dat/color/math.js","../src/dat/color/Color.js","../src/dat/controllers/Controller.js","../src/dat/dom/dom.js","../src/dat/controllers/BooleanController.js","../src/dat/controllers/OptionController.js","../src/dat/controllers/StringController.js","../src/dat/controllers/NumberController.js","../src/dat/controllers/NumberControllerBox.js","../src/dat/controllers/NumberControllerSlider.js","../src/dat/controllers/FunctionController.js","../src/dat/controllers/ColorController.js","../src/dat/utils/css.js","../src/dat/gui/saveDialogue.html.js","../src/dat/controllers/ControllerFactory.js","../src/dat/utils/requestAnimationFrame.js","../src/dat/dom/CenteredDiv.js","../src/dat/gui/GUI.js","../src/dat/index.js"],"sourcesContent":["/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nexport default function(color, forceCSSHex) {\n const colorFormat = color.__state.conversionName.toString();\n\n const r = Math.round(color.r);\n const g = Math.round(color.g);\n const b = Math.round(color.b);\n const a = color.a;\n const h = Math.round(color.h);\n const s = color.s.toFixed(1);\n const v = color.v.toFixed(1);\n\n if (forceCSSHex || (colorFormat === 'THREE_CHAR_HEX') || (colorFormat === 'SIX_CHAR_HEX')) {\n let str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n\n return 'unknown format';\n}\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nconst ARR_EACH = Array.prototype.forEach;\nconst ARR_SLICE = Array.prototype.slice;\n\n/**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\nconst Common = {\n BREAK: {},\n\n extend: function(target) {\n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n const keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function(key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n\n return target;\n },\n\n defaults: function(target) {\n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n const keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function(key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n\n return target;\n },\n\n compose: function() {\n const toCall = ARR_SLICE.call(arguments);\n return function() {\n let args = ARR_SLICE.call(arguments);\n for (let i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n\n each: function(obj, itr, scope) {\n if (!obj) {\n return;\n }\n\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n let key;\n let l;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (const key in obj) {\n if (itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n }\n },\n\n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n\n // if the function is called repeatedly, wait until threshold passes until we execute the function\n debounce: function(func, threshold, callImmediately) {\n let timeout;\n\n return function() {\n const obj = this;\n const args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n\n const callNow = callImmediately || !timeout;\n\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n\n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n\n isNull: function(obj) {\n return obj === null;\n },\n\n isNaN: function(obj) {\n return isNaN(obj);\n },\n\n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n\n isObject: function(obj) {\n return obj === Object(obj);\n },\n\n isNumber: function(obj) {\n return obj === obj + 0;\n },\n\n isString: function(obj) {\n return obj === obj + '';\n },\n\n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n\n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n\n};\n\nexport default Common;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport toString from './toString';\nimport common from '../utils/common';\n\nconst INTERPRETATIONS = [\n // Strings\n {\n litmus: common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function(original) {\n const test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString(), 0)\n };\n },\n\n write: toString\n },\n\n SIX_CHAR_HEX: {\n read: function(original) {\n const test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n\n write: toString\n },\n\n CSS_RGB: {\n read: function(original) {\n const test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n\n write: toString\n },\n\n CSS_RGBA: {\n read: function(original) {\n const test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n\n write: toString\n }\n }\n },\n\n // Numbers\n {\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n litmus: common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function(original) {\n if (original.length !== 3) {\n return false;\n }\n\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n },\n\n // Objects\n {\n litmus: common.isObject,\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n }\n];\n\nlet result;\nlet toReturn;\n\nconst interpret = function() {\n toReturn = false;\n\n const original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n common.each(INTERPRETATIONS, function(family) {\n if (family.litmus(original)) {\n common.each(family.conversions, function(conversion, conversionName) {\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n }\n });\n\n return common.BREAK;\n }\n });\n\n return toReturn;\n};\n\nexport default interpret;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nlet tmpComponent;\n\nconst ColorMath = {\n hsv_to_rgb: function(h, s, v) {\n const hi = Math.floor(h / 60) % 6;\n\n const f = h / 60 - Math.floor(h / 60);\n const p = v * (1.0 - s);\n const q = v * (1.0 - (f * s));\n const t = v * (1.0 - ((1.0 - f) * s));\n\n const c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n\n rgb_to_hsv: function(r, g, b) {\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n const delta = max - min;\n let h;\n let s;\n\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n let hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~(0xFF << tmpComponent));\n }\n};\n\nexport default ColorMath;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport interpret from './interpret';\nimport math from './math';\nimport colorToString from './toString';\nimport common from '../utils/common';\n\nclass Color {\n constructor() {\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n\n this.__state.a = this.__state.a || 1;\n }\n\n toString() {\n return colorToString(this);\n }\n\n toHexString() {\n return colorToString(this, true);\n }\n\n toOriginal() {\n return this.__state.conversion.write(this);\n }\n}\n\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n Color.recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n },\n\n set: function(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n }\n });\n}\n\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n\n Color.recalculateHSV(this);\n\n return this.__state[component];\n },\n\n set: function(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n }\n });\n}\n\n\nColor.recalculateRGB = function(color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\n\nColor.recalculateHSV = function(color) {\n const result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\n\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\n\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\n\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\n\nObject.defineProperty(Color.prototype, 'a', {\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n});\n\nObject.defineProperty(Color.prototype, 'hex', {\n get: function() {\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n },\n\n set: function(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nexport default Color;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass Controller {\n constructor(object, property) {\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n }\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {Controller} this\n */\n onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {Controller} this\n */\n onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n\n this.updateDisplay();\n return this;\n }\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue() {\n return this.object[this.property];\n }\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {Controller} this\n */\n updateDisplay() {\n return this;\n }\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified() {\n return this.initialValue !== this.getValue();\n }\n}\n\nexport default Controller;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport common from '../utils/common';\n\nconst EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\n\nconst EVENT_MAP_INV = {};\ncommon.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n});\n\nconst CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\nfunction cssValueToPixels(val) {\n if (val === '0' || common.isUndefined(val)) {\n return 0;\n }\n\n const match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n}\n\n/**\n * @namespace\n * @member dat.dom\n */\nconst dom = {\n\n /**\n *\n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vert\n */\n makeFullscreen: function(elem, hor, vert) {\n let vertical = vert;\n let horizontal = hor;\n\n if (common.isUndefined(horizontal)) {\n horizontal = true;\n }\n\n if (common.isUndefined(vertical)) {\n vertical = true;\n }\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, pars, aux) {\n const params = pars || {};\n const className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n const evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n const clientX = params.x || params.clientX || 0;\n const clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, // screen X\n 0, // screen Y\n clientX, // client X\n clientY, // client Y\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n const init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, newBool) {\n const bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, newBool) {\n const bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n const classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n const classes = elem.className.split(/ +/);\n const index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n const style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style.width);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n const style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style.height);\n },\n\n /**\n *\n * @param el\n */\n getOffset: function(el) {\n let elem = el;\n const offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n *\n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n\n};\n\nexport default dom;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a checkbox input to alter the boolean property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass BooleanController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n const _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n }\n\n setValue(v) {\n const toReturn = super.setValue(v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n\n updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n\n return super.updateDisplay();\n }\n}\n\nexport default BooleanController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\n/**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n */\nclass OptionController extends Controller {\n constructor(object, property, opts) {\n super(object, property);\n\n let options = opts;\n\n const _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n const map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n const opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n const desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n }\n\n setValue(v) {\n const toReturn = super.setValue(v);\n\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n\n updateDisplay() {\n if (dom.isActive(this.__select)) return this; // prevent number from updating if user is trying to manually update\n this.__select.value = this.getValue();\n return super.updateDisplay();\n }\n}\n\nexport default OptionController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass StringController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n const _this = this;\n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n }\n\n updateDisplay() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return super.updateDisplay();\n }\n}\n\nexport default StringController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport common from '../utils/common';\n\nfunction numDecimals(x) {\n const _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n\n return 0;\n}\n\n/**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n */\nclass NumberController extends Controller {\n constructor(object, property, params) {\n super(object, property);\n\n const _params = params || {};\n\n this.__min = _params.min;\n this.__max = _params.max;\n this.__step = _params.step;\n\n if (common.isUndefined(this.__step)) {\n if (this.initialValue === 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n this.__impliedStep = this.__step;\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n }\n\n setValue(v) {\n let _v = v;\n\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n\n return super.setValue(_v);\n }\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min(minValue) {\n this.__min = minValue;\n return this;\n }\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n}\n\nexport default NumberController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport NumberController from './NumberController';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nfunction roundToDecimal(value, decimals) {\n const tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\n\n/**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n */\nclass NumberControllerBox extends NumberController {\n constructor(object, property, params) {\n super(object, property, params);\n\n this.__truncationSuspended = false;\n\n const _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n let prevY;\n\n function onChange() {\n const attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onBlur() {\n onFinish();\n }\n\n function onMouseDrag(e) {\n const diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prevY = e.clientY;\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n // When pressing enter, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n }\n\n updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return super.updateDisplay();\n }\n}\n\nexport default NumberControllerBox;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport NumberController from './NumberController';\nimport dom from '../dom/dom';\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\n\n/**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n */\nclass NumberControllerSlider extends NumberController {\n constructor(object, property, min, max, step) {\n super(object, property, { min: min, max: max, step: step });\n\n const _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n dom.bind(this.__background, 'touchstart', onTouchStart);\n\n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n document.activeElement.blur();\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n e.preventDefault();\n\n const bgRect = _this.__background.getBoundingClientRect();\n\n _this.setValue(\n map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)\n );\n\n return false;\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onTouchStart(e) {\n if (e.touches.length !== 1) { return; }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n\n function onTouchMove(e) {\n const clientX = e.touches[0].clientX;\n const bgRect = _this.__background.getBoundingClientRect();\n\n _this.setValue(\n map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)\n );\n }\n\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n }\n\n updateDisplay() {\n const pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return super.updateDisplay();\n }\n}\n\nexport default NumberControllerSlider;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\n\n/**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n */\nclass FunctionController extends Controller {\n constructor(object, property, text) {\n super(object, property);\n\n const _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n }\n\n fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n}\n\nexport default FunctionController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Controller from './Controller';\nimport dom from '../dom/dom';\nimport Color from '../color/Color';\nimport interpret from '../color/interpret';\nimport common from '../utils/common';\n\n/**\n * @class Represents a given property of an object that is a color.\n * @param {Object} object\n * @param {string} property\n */\nclass ColorController extends Controller {\n constructor(object, property) {\n super(object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n const _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(/* e */) {\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(/* e */) {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n\n dom.bind(this.__selector, 'touchstart', function(/* e */) {\n dom\n .addClass(this, 'drag')\n .bind(window, 'touchend', function(/* e */) {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n\n const valueField = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n\n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__saturation_field, 'touchstart', fieldDown);\n\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'touchstart', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', fieldDownH);\n dom.bind(this.__hue_field, 'touchstart', fieldDownH);\n\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n\n function onBlur() {\n const i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n\n this.__saturation_field.appendChild(valueField);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) { e.preventDefault(); }\n\n const fieldRect = _this.__saturation_field.getBoundingClientRect();\n const { clientX, clientY } = (e.touches && e.touches[0]) || e;\n let s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n let v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n }\n\n function setH(e) {\n if (e.type.indexOf('touch') === -1) { e.preventDefault(); }\n\n const fieldRect = _this.__hue_field.getBoundingClientRect();\n const { clientY } = (e.touches && e.touches[0]) || e;\n let h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n }\n }\n\n updateDisplay() {\n const i = interpret(this.getValue());\n\n if (i !== false) {\n let mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) && !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n const flip = (this.__color.v < 0.5 || this.__color.s > 0.5) ? 255 : 0;\n const _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n\n this.__input.value = this.__color.toString();\n\n common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n}\n\nconst vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\n\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\n\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nexport default ColorController;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nconst css = {\n load: function(url, indoc) {\n const doc = indoc || document;\n const link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n\n inject: function(cssContent, indoc) {\n const doc = indoc || document;\n const injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n const head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) { // Unable to inject CSS, probably because of a Content Security Policy\n }\n }\n};\n\nexport default css;\n","const saveDialogContents = `
        \n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
        \n\n Automatically save\n values to localStorage on exit.\n\n
        The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
        \n\n
        \n\n
        `;\n\nexport default saveDialogContents;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport OptionController from './OptionController';\nimport NumberControllerBox from './NumberControllerBox';\nimport NumberControllerSlider from './NumberControllerSlider';\nimport StringController from './StringController';\nimport FunctionController from './FunctionController';\nimport BooleanController from './BooleanController';\nimport common from '../utils/common';\n\nconst ControllerFactory = function(object, property) {\n const initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n if (common.isNumber(initialValue)) {\n // Has min and max? (slider)\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n // has step?\n if (common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property,\n arguments[2], arguments[3], arguments[4]);\n }\n\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n\n // number box\n if (common.isNumber(arguments[4])) { // has step\n return new NumberControllerBox(object, property,\n { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n return null;\n};\n\nexport default ControllerFactory;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\n\nexport default window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n requestAnimationFrame;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nclass CenteredDiv {\n constructor() {\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n const _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n }\n\n show() {\n const _this = this;\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n\n /**\n * Hide centered div\n */\n hide() {\n const _this = this;\n\n const hide = function() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n\n layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n}\n\nexport default CenteredDiv;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport css from '../utils/css';\nimport saveDialogueContents from './saveDialogue.html';\nimport ControllerFactory from '../controllers/ControllerFactory';\nimport Controller from '../controllers/Controller';\nimport BooleanController from '../controllers/BooleanController';\nimport FunctionController from '../controllers/FunctionController';\nimport NumberControllerBox from '../controllers/NumberControllerBox';\nimport NumberControllerSlider from '../controllers/NumberControllerSlider';\nimport ColorController from '../controllers/ColorController';\nimport requestAnimationFrame from '../utils/requestAnimationFrame';\nimport CenteredDiv from '../dom/CenteredDiv';\nimport dom from '../dom/dom';\nimport common from '../utils/common';\n\nimport styleSheet from './style.scss'; // CSS to embed in build\n\ncss.inject(styleSheet);\n\n/** @ignore Outer-most className for GUI's */\nconst CSS_NAMESPACE = 'dg';\n\nconst HIDE_KEY_CODE = 72;\n\n/** @ignore The only value shared between the JS and SCSS. Use caution. */\nconst CLOSE_BUTTON_HEIGHT = 20;\n\nconst DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\nconst SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}());\n\nlet SAVE_DIALOGUE;\n\n/** @ignore Have we yet to create an autoPlace GUI? */\nlet autoPlaceVirgin = true;\n\n/** @ignore Fixed position div that auto place GUI's go inside */\nlet autoPlaceContainer;\n\n/** @ignore Are we hiding the GUI's ? */\nlet hide = false;\n\n/** @private GUI's which should be hidden */\nconst hideableGuis = [];\n\n/**\n * @class A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n *\n * @typicalname gui\n *\n * @example\n * // Creating a GUI with options.\n * var gui = new dat.GUI({name: 'My GUI'});\n *\n * @example\n * // Creating a GUI and a subfolder.\n * var gui = new dat.GUI();\n * var folder1 = gui.addFolder('Flow Field');\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.autoPlace=true]\n * @param {Boolean} [params.hideable=true] If true, GUI is shown/hidden by h keypress.\n * @param {Boolean} [params.closed=false] If true, starts closed\n * @param {Boolean} [params.closeOnTop=false] If true, close/open button shows on top of the GUI\n */\nconst GUI = function(pars) {\n const _this = this;\n\n let params = pars || {};\n\n /**\n * Outermost DOM Element\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n // Default parameters\n params = common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n if (!common.isUndefined(params.load)) {\n // Explicit preset\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n let useLocalStorage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n let saveToLocalStorage;\n let titleRow;\n\n Object.defineProperties(this,\n /** @lends GUI.prototype */\n {\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * Handles GUI's position of open/close button\n * @type Boolean\n */\n closeOnTop: {\n get: function() {\n return params.closeOnTop;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n\n return params.load.preset;\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return useLocalStorage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n\n const savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n\n dom.bind(this.__closeButton, 'click', function() {\n _this.closed = !_this.closed;\n });\n // Oh, you're a nested GUI!\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n const titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n\n titleRow = addRow(_this, titleRowName);\n\n const onClickTitle = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n\n if (!params.closed) {\n this.closed = false;\n }\n }\n\n if (params.autoPlace) {\n if (common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n\n // Put it in the dom for you.\n autoPlaceContainer.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n\n\n // Make it not elastic.\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n\n this.__resizeHandler = function() {\n _this.onResizeDebounced();\n };\n\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n saveToLocalStorage = function() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n\n // expose this method publicly\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n\n function resetWidth() {\n const root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n};\n\nGUI.toggleHide = function() {\n hide = !hide;\n common.each(hideableGuis, function(gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\n\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\n\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\n\nGUI._keydownHandler = function(e) {\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\n\ncommon.extend(\n GUI.prototype,\n\n /** @lends GUI.prototype */\n {\n\n /**\n * Adds a new {@link Controller} to the GUI. The type of controller created\n * is inferred from the initial value of object[property]. For\n * color properties, see {@link addColor}.\n *\n * @param {Object} object The object to be manipulated\n * @param {String} property The name of the property to be manipulated\n * @param {Number} [min] Minimum allowed value\n * @param {Number} [max] Maximum allowed value\n * @param {Number} [step] Increment by which to change value\n * @returns {Controller} The controller that was added to the GUI.\n * @instance\n *\n * @example\n * // Add a string controller.\n * var person = {name: 'Sam'};\n * gui.add(person, 'name');\n *\n * @example\n * // Add a number controller slider.\n * var person = {age: 45};\n * gui.add(person, 'age', 0, 100);\n */\n add: function(object, property) {\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n },\n\n /**\n * Adds a new color controller to the GUI.\n *\n * @param object\n * @param property\n * @returns {Controller} The controller that was added to the GUI.\n * @instance\n *\n * @example\n * var palette = {\n * color1: '#FF0000', // CSS string\n * color2: [ 0, 128, 255 ], // RGB array\n * color3: [ 0, 128, 255, 0.3 ], // RGB with alpha\n * color4: { h: 350, s: 0.9, v: 0.3 } // Hue, saturation, value\n * };\n * gui.addColor(palette, 'color1');\n * gui.addColor(palette, 'color2');\n * gui.addColor(palette, 'color3');\n * gui.addColor(palette, 'color4');\n */\n addColor: function(object, property) {\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n },\n\n /**\n * Removes the given controller from the GUI.\n * @param {Controller} controller\n * @instance\n */\n remove: function(controller) {\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n const _this = this;\n common.defer(function() {\n _this.onResize();\n });\n },\n\n /**\n * Removes the root GUI from the document and unbinds all event listeners.\n * For subfolders, use `gui.removeFolder(folder)` instead.\n * @instance\n */\n destroy: function() {\n if (this.parent) {\n throw new Error(\n 'Only the root GUI should be removed with .destroy(). ' +\n 'For subfolders, use gui.removeFolder(folder) instead.'\n );\n }\n\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n\n const _this = this;\n common.each(this.__folders, function(subfolder) {\n _this.removeFolder(subfolder);\n });\n\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n\n removeListeners(this);\n },\n\n /**\n * Creates a new subfolder GUI instance.\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n const newGuiParams = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n newGuiParams.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n // Start me closed if I was closed\n newGuiParams.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n newGuiParams.load = this.load.folders[name];\n }\n\n const gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n\n const li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n\n /**\n * Removes a subfolder GUI instance.\n * @param {dat.gui.GUI} folder The folder to remove.\n * @instance\n */\n removeFolder: function(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n\n delete this.__folders[folder.name];\n\n // Do we have saved appearance data for this folder?\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n\n removeListeners(folder);\n\n const _this = this;\n\n common.each(folder.__folders, function(subfolder) {\n folder.removeFolder(subfolder);\n });\n\n common.defer(function() {\n _this.onResize();\n });\n },\n\n /**\n * Opens the GUI.\n */\n open: function() {\n this.closed = false;\n },\n\n /**\n * Closes the GUI.\n */\n close: function() {\n this.closed = true;\n },\n\n /**\n * Hides the GUI.\n */\n hide: function() {\n this.domElement.style.display = 'none';\n },\n\n /**\n * Shows the GUI.\n */\n show: function() {\n this.domElement.style.display = '';\n },\n\n\n onResize: function() {\n // we debounce this function to prevent performance issues when rotating on tablet/mobile\n const root = this.getRoot();\n if (root.scrollable) {\n const top = dom.getOffset(root.__ul).top;\n let h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n\n onResizeDebounced: common.debounce(function() { this.onResize(); }, 50),\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {...Object} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n * @ignore\n */\n remember: function() {\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n\n const _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n let gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n const toReturn = this.load;\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n },\n\n save: function() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n\n saveAs: function(presetName) {\n if (!this.load.remembered) {\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n\n revert: function(gui) {\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n\n // fire onFinishChange callback\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n\n listen: function(controller) {\n const init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n\n updateDisplay: function() {\n common.each(this.__controllers, function(controller) {\n controller.updateDisplay();\n });\n common.each(this.__folders, function(folder) {\n folder.updateDisplay();\n });\n }\n }\n);\n\n/**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [newDom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n *\n * @ignore\n */\nfunction addRow(gui, newDom, liBefore) {\n const li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\n\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\n\nfunction markPresetModified(gui, modified) {\n const opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\n\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, /** @lends Controller.prototype */ {\n /**\n * @param {Array|Object} options\n * @return {Controller}\n */\n options: function(options) {\n if (arguments.length > 1) {\n const nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: nextSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n const nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: nextSibling,\n factoryArgs: [options]\n }\n );\n }\n },\n\n /**\n * Sets the name of the controller.\n * @param {string} name\n * @return {Controller}\n */\n name: function(name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = name;\n return controller;\n },\n\n /**\n * Sets controller to listen for changes on its underlying object.\n * @return {Controller}\n */\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n /**\n * Removes the controller from its parent GUI.\n * @return {Controller}\n */\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n const box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function(method) {\n const pc = controller[method];\n const pb = box[method];\n controller[method] = box[method] = function() {\n const args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n const r = function(returned) {\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n // Well, then lets just replace this with a slider.\n\n // lets remember if the old controller had a specific name or was listening\n const oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n const wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n\n controller.remove();\n const newController = add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n newController.name(oldName);\n if (wasListening) newController.listen();\n\n return newController;\n }\n\n return returned;\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n }\n\n controller.setValue = common.compose(function(val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n\n return val;\n }, controller.setValue);\n}\n\nfunction recallSavedValue(gui, controller) {\n // Find the topmost GUI, that's where remembered objects live.\n const root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n const matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matchedIndex !== -1) {\n // Let me fetch a map of controllers for thcommon.isObject.\n let controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] =\n controllerMap;\n }\n\n // Keep track of this controller\n controllerMap[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n const presetMap = root.load.remembered;\n\n // Which preset are we trying to load?\n let preset;\n\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n // Uhh, you can have the default instead?\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n // Nada.\n return;\n }\n\n // Did the loaded object remember thcommon.isObject? && Did we remember this particular property?\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n // We did remember something for this guy ...\n const value = preset[matchedIndex][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\n\nfunction add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error(`Object \"${object}\" has no property \"${property}\"`);\n }\n\n let controller;\n\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n const factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n const name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n const container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n const li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, typeof controller.getValue());\n }\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n}\n\nfunction getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n}\n\nfunction addPresetOption(gui, name, setSelected) {\n const opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\n\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\n\nfunction addSaveMenu(gui) {\n const div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n const gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n const button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n const button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n const button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n const select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n for (let index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n const explain = document.getElementById('dg-local-explain');\n const localStorageCheckBox = document.getElementById('dg-local-storage');\n const saveLocally = document.getElementById('dg-save-locally');\n\n saveLocally.style.display = 'block';\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n showHideExplain(gui, explain);\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n\n const newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n const presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n // div.appendChild(button2);\n}\n\nfunction addResizeHandle(gui) {\n let pmouseX;\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n // border: '1px solid blue'\n\n });\n\n function drag(e) {\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n }\n\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n\n function dragStart(e) {\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n }\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\n\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\n\nfunction getCurrentPreset(gui, useInitialValues) {\n const toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n const savedValues = {};\n\n // The controllers I've made for thcommon.isObject by property\n const controllerMap =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controllerMap, function(controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = savedValues;\n });\n\n return toReturn;\n}\n\nfunction setPresetSelectIndex(gui) {\n for (let index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\n\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame.call(window, function() {\n updateDisplays(controllerArray);\n });\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n}\n\nexport default GUI;\n","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport Color from './color/Color';\nimport math from './color/math';\nimport interpret from './color/interpret';\n\nimport Controller from './controllers/Controller';\nimport BooleanController from './controllers/BooleanController';\nimport OptionController from './controllers/OptionController';\nimport StringController from './controllers/StringController';\nimport NumberController from './controllers/NumberController';\nimport NumberControllerBox from './controllers/NumberControllerBox';\nimport NumberControllerSlider from './controllers/NumberControllerSlider';\nimport FunctionController from './controllers/FunctionController';\nimport ColorController from './controllers/ColorController';\n\nimport domImport from './dom/dom';\nimport GUIImport from './gui/GUI';\n\nexport const color = {\n Color: Color,\n math: math,\n interpret: interpret\n};\n\nexport const controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\n\nexport const dom = { dom: domImport };\n\nexport const gui = { GUI: GUIImport };\n\nexport const GUI = GUIImport;\n\nexport default {\n color,\n controllers,\n dom,\n gui,\n GUI\n};\n"],"names":["color","forceCSSHex","colorFormat","__state","conversionName","toString","r","Math","round","g","b","a","h","s","toFixed","v","str","hex","length","ARR_EACH","Array","prototype","forEach","ARR_SLICE","slice","Common","target","each","call","arguments","obj","keys","isObject","Object","key","isUndefined","bind","toCall","args","i","apply","itr","scope","l","BREAK","fnc","func","threshold","callImmediately","timeout","delayed","callNow","setTimeout","toArray","undefined","isNaN","isArray","constructor","INTERPRETATIONS","common","isString","original","test","match","parseInt","parseFloat","isNumber","result","toReturn","interpret","family","litmus","conversions","conversion","read","tmpComponent","ColorMath","hi","floor","f","p","q","t","c","min","max","delta","NaN","hex_with_component","componentIndex","value","Color","Error","colorToString","write","defineRGBComponent","component","componentHexIndex","defineProperty","space","recalculateRGB","defineHSVComponent","recalculateHSV","math","component_from_hex","extend","hsv_to_rgb","rgb_to_hsv","COMPONENTS","rgb_to_hex","Controller","object","property","initialValue","domElement","document","createElement","__onChange","__onFinishChange","newValue","updateDisplay","getValue","EVENT_MAP","EVENT_MAP_INV","k","e","CSS_VALUE_PIXELS","cssValueToPixels","val","isNull","dom","elem","selectable","style","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","hor","vert","vertical","horizontal","position","left","right","top","bottom","eventType","pars","aux","params","className","evt","createEvent","clientX","x","clientY","y","initMouseEvent","bubbles","cancelable","window","clickCount","init","initKeyboardEvent","initKeyEvent","defaults","ctrlKey","altKey","shiftKey","metaKey","keyCode","charCode","initEvent","dispatchEvent","event","newBool","bool","addEventListener","attachEvent","removeEventListener","detachEvent","classes","split","indexOf","push","join","replace","removeAttribute","index","splice","RegExp","getComputedStyle","width","height","el","offset","offsetParent","offsetLeft","offsetTop","activeElement","type","href","BooleanController","_this","__prev","__checkbox","setAttribute","onChange","setValue","appendChild","checked","OptionController","opts","options","__select","map","element","opt","innerHTML","desiredValue","selectedIndex","isActive","StringController","__input","onBlur","blur","numDecimals","_x","NumberController","_params","__min","__max","__step","step","__impliedStep","pow","log","abs","LN10","__precision","_v","minValue","maxValue","stepValue","roundToDecimal","decimals","tenTo","NumberControllerBox","__truncationSuspended","prevY","attempted","onFinish","onMouseDrag","diff","onMouseUp","unbind","onMouseDown","i1","i2","o1","o2","NumberControllerSlider","__background","__foreground","onTouchStart","addClass","preventDefault","bgRect","getBoundingClientRect","touches","onTouchMove","onTouchEnd","pct","FunctionController","text","__button","fire","ColorController","__color","__temp","makeSelectable","__selector","__saturation_field","__field_knob","__field_knob_border","__hue_knob","__hue_field","__input_textShadow","removeClass","valueField","fieldDown","fieldDownH","setSV","fieldUpSV","setH","fieldUpH","toOriginal","fieldRect","mismatch","flip","_flip","toHexString","marginTop","vendors","linearGradient","background","vendor","cssText","hueGradient","css","url","indoc","doc","link","rel","getElementsByTagName","cssContent","injected","head","saveDialogContents","ControllerFactory","isFunction","isBoolean","requestAnimationFrame","callback","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","CenteredDiv","backgroundElement","makeFullscreen","body","hide","display","opacity","webkitTransform","layout","defer","innerWidth","getWidth","innerHeight","getHeight","inject","styleSheet","CSS_NAMESPACE","HIDE_KEY_CODE","CLOSE_BUTTON_HEIGHT","DEFAULT_DEFAULT_PRESET_NAME","SUPPORTS_LOCAL_STORAGE","localStorage","SAVE_DIALOGUE","autoPlaceVirgin","autoPlaceContainer","hideableGuis","GUI","__ul","__folders","__controllers","__rememberedObjects","__rememberedObjectIndecesToControllers","__listening","DEFAULT_WIDTH","autoPlace","load","preset","parent","hideable","resizable","scrollable","useLocalStorage","getItem","getLocalStorageHash","saveToLocalStorage","titleRow","defineProperties","closeOnTop","getRoot","revert","name","closed","CLASS_CLOSED","onResize","__closeButton","TEXT_OPEN","TEXT_CLOSED","setItem","CLASS_MAIN","savedGui","JSON","parse","CLASS_CLOSE_BUTTON","CLASS_CLOSE_TOP","insertBefore","childNodes","CLASS_CLOSE_BOTTOM","titleRowName","createTextNode","addRow","onClickTitle","CLASS_AUTO_PLACE_CONTAINER","CLASS_AUTO_PLACE","__resizeHandler","onResizeDebounced","stringify","getSaveObject","saveToLocalStorageIfPossible","resetWidth","root","toggleHide","gui","CLASS_CONTROLLER_ROW","CLASS_TOO_TALL","CLASS_DRAG","_keydownHandler","which","add","controller","removeChild","__li","subfolder","removeFolder","newGuiParams","folders","li","folder","parentElement","getOffset","node","__save_row","__resize_handle","offsetHeight","debounce","saveDialogueContents","remembered","getCurrentPreset","presetName","newDom","liBefore","removeListeners","markPresetModified","modified","__preset_select","augmentController","__gui","nextSibling","nextElementSibling","remove","firstElementChild","listen","box","method","pc","pb","returned","oldName","wasListening","newController","compose","fakeEvent","stopPropagation","borderLeftColor","isModified","recallSavedValue","matchedIndex","controllerMap","presetMap","factoryArgs","concat","before","container","location","addPresetOption","setSelected","showHideExplain","explain","addSaveMenu","div","firstChild","gears","button","button2","button3","select","getElementById","localStorageCheckBox","saveLocally","newConstructorTextArea","show","focus","save","prompt","saveAs","addResizeHandle","pmouseX","drag","dragStop","dragStart","setWidth","w","useInitialValues","savedValues","setPresetSelectIndex","updateDisplays","controllerArray","controllers","domImport","GUIImport"],"mappings":"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"} \ No newline at end of file diff --git a/public/js/myGui.js b/public/js/myGui.js index 210b03ac9..5fd7ae48d 100644 --- a/public/js/myGui.js +++ b/public/js/myGui.js @@ -1,6 +1,8 @@ +const dat = require('dat.gui'); + window.onload = function() { var text = new FizzyText(); - var gui = new DAT.GUI({ + var gui = new dat.GUI({ height : 5 * 32 - 1 }); gui.add(text, 'message'); From 722fefb616edc18da1362038e278afe279e84c46 Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 22:16:11 -0400 Subject: [PATCH 32/54] modularized --- package.json | 3 +- public/index.html | 16 ++++--- public/js/audio.js | 112 ------------------------------------------- public/js/myGui.js | 18 +++---- public/js/scripts.js | 3 ++ 5 files changed, 24 insertions(+), 128 deletions(-) delete mode 100644 public/js/audio.js diff --git a/package.json b/package.json index 9db957ace..93b2fd8d3 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,8 @@ "description": "Assignment 3 - Persistence: Two-tier Web Application with Flat File Database, Express server, and CSS template\r ===", "author": "Hunter Caouette", "scripts": { - "start": "node index.js" + "start": "npm-run-all browserify node index.js" + "browserify": "browserify -r dat.gui -r /public/js/myGui.js:myGui -r /public/js/scripts.js:loadScript -o bundle.js" }, "dependencies": { "body-parser": "^1.19.0", diff --git a/public/index.html b/public/index.html index 2fc67ac03..9fd15520a 100644 --- a/public/index.html +++ b/public/index.html @@ -13,16 +13,18 @@ - - - - - + + + + creative coding -- a4-hcaouette -- CS4241 Assignment 4 - +
        @@ -40,7 +42,7 @@ diff --git a/public/js/audio.js b/public/js/audio.js deleted file mode 100644 index 1de0f7e11..000000000 --- a/public/js/audio.js +++ /dev/null @@ -1,112 +0,0 @@ -$(document).ready(() => { - let audioContext = null - let audioIntervalId = null - - // Create a socket object for communicating information about the markov chain - const socket = io() - - $('.button-loading').hide() - let processing = false - - $('.video-input-form').submit(() => { - if (!processing) { - $('.button-loading').show() - $('.button-idle').hide() - $('.video-url-input').prop('disabled', 'disabled') - processing = true - - // Create an AudioContext for output - if (audioContext) { - audioContext.close() - clearInterval(audioIntervalId) - } - audioContext = new AudioContext() - const audioContextTimestamp = Date.now() - const bufferSource = audioContext.createBufferSource() - const resonanceAudio = new ResonanceAudio(audioContext) - resonanceAudio.output.connect(audioContext.destination) - - // Open an XMLHttpRequest to stream audio data from YouTube - const videoUrl = $('.video-url-input').val() - let videoId = '' - try { - videoId = videoUrl.split('=')[1] - } catch (error) { - // eslint-disable-next-line no-console - console.error('Unable to parse video ID. Our code is also really bad.') - processing = false - return - } - const request = new XMLHttpRequest() - request.open('POST', `/stream/${videoId}`, true) - request.responseType = 'arraybuffer' - request.onload = function() { - // Decode the arraybuffer from the XMLHttpRequest - audioContext.decodeAudioData(request.response, buffer => { - // Process the audio stream for spatialization - calculateSpatialVectors(buffer, peaks => { - $('.button-loading').hide() - $('.button-idle').show() - $('.video-url-input').removeAttr('disabled') - processing = false - // Connect the audio buffer to the AudioContext for output - const source = resonanceAudio.createSource() - bufferSource.buffer = buffer - bufferSource.connect(source.input) - bufferSource.start() - const audioContextDelay = Date.now() - audioContextTimestamp - - // Request the current state of the markov chain from the server - socket.emit('get-markov', pdf => { - const sequence = new Sequence(pdf, peaks) - const positionVector = sequence.getPointList() - audioIntervalId = setInterval(() => { - const frame = Math.round( - audioContext.currentTime * 1000 - audioContextDelay) - source.setPosition(...positionVector[frame]) - }, UPDATE_RATE) - - bufferSource.onended = () => { - clearInterval(audioIntervalId) - } - - $('.pause').off().on('click', () => { - audioContext.suspend() - }) - - $('.resume').off().on('click', () => { - audioContext.resume() - }) - - $('.upvote').off().on('click', () => { - alert('Sequence upvoted!') - socket.emit('update-markov', { - direction: 1, - sequence: sequence - }) - }) - - $('.downvote').off().on('click', () => { - alert('Sequence downvoted!') - socket.emit('update-markov', { - direction: -1, - sequence: sequence - }) - }) - }) - }) - }, error => { - alert('Unable to process audio stream! Fuck!') - $('.button-loading').hide() - $('.button-idle').show() - $('.video-url-input').removeAttr('disabled') - processing = false - // eslint-disable-next-line no-console - console.error(error) - }) - } - request.send() - } - return false - }) -}) diff --git a/public/js/myGui.js b/public/js/myGui.js index 5fd7ae48d..b7bfc38be 100644 --- a/public/js/myGui.js +++ b/public/js/myGui.js @@ -1,6 +1,6 @@ const dat = require('dat.gui'); -window.onload = function() { +const loadGUI = function() { var text = new FizzyText(); var gui = new dat.GUI({ height : 5 * 32 - 1 @@ -11,10 +11,12 @@ window.onload = function() { gui.add(text, 'explode'); } -let FizzyText = function() { - this.message = 'dat.gui'; - this.speed = 0.8; - this.displayOutline = false; - this.explode = function() { alert('Bang!'); }; - // Define render logic ... -} +// let FizzyText = function() { +// this.message = 'dat.gui'; +// this.speed = 0.8; +// this.displayOutline = false; +// this.explode = function() { alert('Bang!'); }; +// // Define render logic ... +// } + +modules.exports = { loadGUI }; diff --git a/public/js/scripts.js b/public/js/scripts.js index 9d688be7b..e1d7d958c 100644 --- a/public/js/scripts.js +++ b/public/js/scripts.js @@ -77,3 +77,6 @@ const submit = function( e ) { request.send() return false } + + +modules.exports = { submit } From 87b2a0aa21bb26c16211afd4d64c2041548fe28b Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 22:18:27 -0400 Subject: [PATCH 33/54] pckg --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 93b2fd8d3..508ec9a87 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "description": "Assignment 3 - Persistence: Two-tier Web Application with Flat File Database, Express server, and CSS template\r ===", "author": "Hunter Caouette", "scripts": { - "start": "npm-run-all browserify node index.js" + "start": "npm-run-all browserify node index.js", "browserify": "browserify -r dat.gui -r /public/js/myGui.js:myGui -r /public/js/scripts.js:loadScript -o bundle.js" }, "dependencies": { From 5ccc81170ce7f83984b899288f23c0ab7c8e3aa2 Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 22:19:57 -0400 Subject: [PATCH 34/54] npm your reqs --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 508ec9a87..e46009d3d 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "lowdb": "^1.0.0", "mime": "^2.4.4", "morgan": "^1.9.1", + "npm-run-all": "^4.1.5", "passport": "^0.4.0", "passport-google-oauth": "^2.0.0", "passport-local": "^1.0.0", From 7deafba9fefd8ec05c81918943de874df24717ea Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 22:21:25 -0400 Subject: [PATCH 35/54] dont break stuff --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e46009d3d..ba711000d 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,9 @@ "description": "Assignment 3 - Persistence: Two-tier Web Application with Flat File Database, Express server, and CSS template\r ===", "author": "Hunter Caouette", "scripts": { - "start": "npm-run-all browserify node index.js", - "browserify": "browserify -r dat.gui -r /public/js/myGui.js:myGui -r /public/js/scripts.js:loadScript -o bundle.js" + "start": "npm-run-all browserify startserver", + "browserify": "browserify -r dat.gui -r /public/js/myGui.js:myGui -r /public/js/scripts.js:loadScript -o bundle.js", + "startserver": "node index.js" }, "dependencies": { "body-parser": "^1.19.0", From 5bfd4e069c58ed7f5a7f2f141cf1f9534217af90 Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 22:25:04 -0400 Subject: [PATCH 36/54] package? --- .gitignore | 1 - package-lock.json | 2288 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 5 +- 3 files changed, 2291 insertions(+), 3 deletions(-) create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 57195033e..9ba488b6e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ *.DS_Store node_modules/ -package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..231847a47 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2288 @@ +{ + "name": "a4-creativecoding", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "acorn-walk": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz", + "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bowser": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.6.1.tgz", + "integrity": "sha512-hySGUuLhi0KetfxPZpuJOsjM0kRvCiCgPBygBkzGzJNsq/nbJmaO8QJc6xlWfeFFnMvtd/LeKkhDJGVrmVobUA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + } + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + } + } + }, + "browserify": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.0.tgz", + "integrity": "sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw==", + "requires": { + "JSONStream": "^1.0.3", + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "labeled-stream-splicer": "^2.0.0", + "mkdirp": "^0.5.0", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cached-path-relative": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==" + }, + "camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-security-policy-builder": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz", + "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-parser": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.4.tgz", + "integrity": "sha512-lo13tqF3JEtFO7FyA49CqbhaFkskRJ0u/UAiINgrIXeRCY41c88/zxtrECl8AKH3B0hj9q10+h3Kt8I7KlW4tw==", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6" + } + }, + "cookie-session": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/cookie-session/-/cookie-session-1.3.3.tgz", + "integrity": "sha512-GrMdrU1YTQWtmVTo0Rj3peeZRMc2xJrBslFYtZcYTo+hrSLmrcf69OrRkDi84xTfylgCy2wgpRHyY4le6lE5+A==", + "requires": { + "cookies": "0.7.3", + "debug": "2.6.9", + "on-headers": "~1.0.2" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookies": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.3.tgz", + "integrity": "sha512-+gixgxYSgQLTaTIilDHAdlNPZDENDQernEMiIcZpYYP14zgHsCt4Ce1FEjFtcp6GefhozebB6orvhAAWx/IS0A==", + "requires": { + "depd": "~1.1.2", + "keygrip": "~1.0.3" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" + }, + "dasherize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", + "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" + }, + "dat.gui": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.6.tgz", + "integrity": "sha512-9Uqr4aQUvp9q5P2b4y6gK604HXafubOq578OmOS8mjrIkYrBP4EbQ9gz9YRXgyPh7aQi+b9H/jAG7EucmhYpSA==" + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "deps-sort": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", + "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", + "requires": { + "JSONStream": "^1.0.3", + "shasum": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dns-prefetch-control": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.2.0.tgz", + "integrity": "sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q==" + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "dont-sniff-mimetype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", + "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==" + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "^2.0.2" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "elliptic": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", + "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", + "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.0.0", + "string.prototype.trimright": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "expect-ct": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.2.0.tgz", + "integrity": "sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g==" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + } + } + }, + "express-session": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.16.2.tgz", + "integrity": "sha512-oy0sRsdw6n93E9wpCNWKRnSsxYnSDX9Dnr9mhZgqUEEorzcq5nshGYSZ4ZReHFhKQ80WI5iVUUSPW7u3GaKauw==", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.1.2", + "uid-safe": "~2.1.5" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "feature-policy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", + "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==" + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "frameguard": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.1.0.tgz", + "integrity": "sha512-TxgSKM+7LTA6sidjOiSZK9wxY0ffMPY3Wta//MqwmX0nZuEHc8QrkV8Fh3ZhMJeiH+Uyh/tcaarImRy8u77O7g==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "helmet": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.21.1.tgz", + "integrity": "sha512-IC/54Lxvvad2YiUdgLmPlNFKLhNuG++waTF5KPYq/Feo3NNhqMFbcLAlbVkai+9q0+4uxjxGPJ9bNykG+3zZNg==", + "requires": { + "depd": "2.0.0", + "dns-prefetch-control": "0.2.0", + "dont-sniff-mimetype": "1.1.0", + "expect-ct": "0.2.0", + "feature-policy": "0.3.0", + "frameguard": "3.1.0", + "helmet-crossdomain": "0.4.0", + "helmet-csp": "2.9.2", + "hide-powered-by": "1.1.0", + "hpkp": "2.0.0", + "hsts": "2.2.0", + "ienoopen": "1.1.0", + "nocache": "2.1.0", + "referrer-policy": "1.2.0", + "x-xss-protection": "1.3.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "helmet-crossdomain": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz", + "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==" + }, + "helmet-csp": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.9.2.tgz", + "integrity": "sha512-Lt5WqNfbNjEJ6ysD4UNpVktSyjEKfU9LVJ1LaFmPfYseg/xPealPfgHhtqdAdjPDopp5zbg/VWCyp4cluMIckw==", + "requires": { + "bowser": "^2.6.1", + "camelize": "1.0.0", + "content-security-policy-builder": "2.1.0", + "dasherize": "2.0.0" + } + }, + "hide-powered-by": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", + "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==" + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==" + }, + "hpkp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", + "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" + }, + "hsts": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", + "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", + "requires": { + "depd": "2.0.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "ienoopen": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz", + "integrity": "sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "requires": { + "source-map": "~0.5.3" + } + }, + "insert-module-globals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", + "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", + "requires": { + "JSONStream": "^1.0.3", + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + } + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "^1.0.1" + } + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "requires": { + "has-symbols": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "requires": { + "jsonify": "~0.0.0" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "keygrip": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz", + "integrity": "sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==" + }, + "labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "requires": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" + }, + "lowdb": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz", + "integrity": "sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==", + "requires": { + "graceful-fs": "^4.1.3", + "is-promise": "^2.1.0", + "lodash": "4", + "pify": "^3.0.0", + "steno": "^0.4.1" + } + }, + "m3u8stream": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.6.2.tgz", + "integrity": "sha512-WsuM2bd5pPN80xvfrB+1DZqr4M7+kJl8byi6+ZCy6cmVjEiHhmr/desN53Ngsa6Hs13kYumeVgT4wL0oIJ+v6g==", + "requires": { + "miniget": "^1.4.0", + "sax": "^1.2.4" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "miniget": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/miniget/-/miniget-1.5.3.tgz", + "integrity": "sha512-6xiJs3ZGBdrNMlPNlEWirHhY53hSW33nG1Ytub9Cg5+jLhFPn9PGe4FmPZK9WlmDE1N7/8DEL7PGr7r9kbxwgw==" + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "module-deps": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.1.tgz", + "integrity": "sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A==", + "requires": { + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.0.2", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "requires": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "nocache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", + "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + } + }, + "oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "requires": { + "path-platform": "~0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "passport": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", + "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + } + }, + "passport-google-oauth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth/-/passport-google-oauth-2.0.0.tgz", + "integrity": "sha512-JKxZpBx6wBQXX1/a1s7VmdBgwOugohH+IxCy84aPTZNq/iIPX6u7Mqov1zY7MKRz3niFPol0KJz8zPLBoHKtYA==", + "requires": { + "passport-google-oauth1": "1.x.x", + "passport-google-oauth20": "2.x.x" + } + }, + "passport-google-oauth1": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth1/-/passport-google-oauth1-1.0.0.tgz", + "integrity": "sha1-r3SoA99R7GRvZqRNgigr5vEI4Mw=", + "requires": { + "passport-oauth1": "1.x.x" + } + }, + "passport-google-oauth20": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz", + "integrity": "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==", + "requires": { + "passport-oauth2": "1.x.x" + } + }, + "passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", + "requires": { + "passport-strategy": "1.x.x" + } + }, + "passport-oauth": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-oauth/-/passport-oauth-1.0.0.tgz", + "integrity": "sha1-kK/2M4dUDwIImvKM2tOep/gNd98=", + "requires": { + "passport-oauth1": "1.x.x", + "passport-oauth2": "1.x.x" + } + }, + "passport-oauth1": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/passport-oauth1/-/passport-oauth1-1.1.0.tgz", + "integrity": "sha1-p96YiiEfnPRoc3cTDqdN8ycwyRg=", + "requires": { + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "utils-merge": "1.x.x" + } + }, + "passport-oauth2": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.5.0.tgz", + "integrity": "sha512-kqBt6vR/5VlCK8iCx1/KpY42kQ+NEHZwsSyt4Y6STiNjU+wWICG1i8ucc1FapXDGO15C5O5VZz7+7vRzrDPXXQ==", + "requires": { + "base64url": "3.x.x", + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pidtree": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", + "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "requires": { + "readable-stream": "^2.0.2" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "referrer-policy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", + "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==" + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-favicon": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", + "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", + "requires": { + "etag": "~1.8.1", + "fresh": "0.5.2", + "ms": "2.1.1", + "parseurl": "~1.3.2", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "requires": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "steno": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz", + "integrity": "sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs=", + "requires": { + "graceful-fs": "^4.1.3" + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "stream-http": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz", + "integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^3.0.6", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "string.prototype.padend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", + "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" + } + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "requires": { + "minimist": "^1.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "requires": { + "acorn-node": "^1.2.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "requires": { + "process": "~0.11.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" + } + }, + "uid2": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" + }, + "umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==" + }, + "undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "requires": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "x-xss-protection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz", + "integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "ytdl-core": { + "version": "0.29.7", + "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-0.29.7.tgz", + "integrity": "sha512-mqPuZ1UyspT84lyV1FSU1UAoiQ4H5j52ba3sC1LC43OmL8qNaDIRCGffGlpiakQrc69qsplNWsWEZUF+J5bhJA==", + "requires": { + "html-entities": "^1.1.3", + "m3u8stream": "^0.6.2", + "miniget": "^1.5.3", + "sax": "^1.1.3" + } + } + } +} diff --git a/package.json b/package.json index ba711000d..dde33b1a1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "a3-persistence", - "description": "Assignment 3 - Persistence: Two-tier Web Application with Flat File Database, Express server, and CSS template\r ===", + "name": "a4-creativecoding", + "description": "assignment 4 creative coding", "author": "Hunter Caouette", "scripts": { "start": "npm-run-all browserify startserver", @@ -9,6 +9,7 @@ }, "dependencies": { "body-parser": "^1.19.0", + "browserify": "^16.5.0", "compression": "^1.7.4", "cookie-parser": "^1.4.4", "cookie-session": "^1.3.3", From b7f37fbcb434924439a9ac2b120aa25e46008312 Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 22:26:11 -0400 Subject: [PATCH 37/54] pkg --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index dde33b1a1..7b46c04e6 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ }, "dependencies": { "body-parser": "^1.19.0", - "browserify": "^16.5.0", "compression": "^1.7.4", "cookie-parser": "^1.4.4", "cookie-session": "^1.3.3", @@ -30,7 +29,9 @@ }, "version": "1.0.0", "main": "index.js", - "devDependencies": {}, + "devDependencies": { + "browserify": "^16.5.0" + }, "repository": { "type": "git", "url": "git+https://github.com/hcaouette/a3-persistence.git" From 78b40c4c3e0c922b0aa5a99bc6f4e2030672d908 Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 22:27:36 -0400 Subject: [PATCH 38/54] pkg --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7b46c04e6..b3bc6589e 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "author": "Hunter Caouette", "scripts": { "start": "npm-run-all browserify startserver", - "browserify": "browserify -r dat.gui -r /public/js/myGui.js:myGui -r /public/js/scripts.js:loadScript -o bundle.js", + "browserify": "browserify -r dat.gui -r ./public/js/myGui.js:myGui -r ./public/js/scripts.js:loadScript -o ./bundle.js", "startserver": "node index.js" }, "dependencies": { From cb4849977301fef6de18d0be8dcb95bb70de58f2 Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 22:34:16 -0400 Subject: [PATCH 39/54] bundlejs file --- bundle.js | 2648 +++++++++++++++++++++++++++++++++++++++++++++ public/index.html | 2 +- 2 files changed, 2649 insertions(+), 1 deletion(-) create mode 100644 bundle.js diff --git a/bundle.js b/bundle.js new file mode 100644 index 000000000..66b3cb96e --- /dev/null +++ b/bundle.js @@ -0,0 +1,2648 @@ +require=(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i= 0; i--) { + args = [toCall[i].apply(this, args)]; + } + return args[0]; + }; + }, + each: function each(obj, itr, scope) { + if (!obj) { + return; + } + if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) { + obj.forEach(itr, scope); + } else if (obj.length === obj.length + 0) { + var key = void 0; + var l = void 0; + for (key = 0, l = obj.length; key < l; key++) { + if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) { + return; + } + } + } else { + for (var _key in obj) { + if (itr.call(scope, obj[_key], _key) === this.BREAK) { + return; + } + } + } + }, + defer: function defer(fnc) { + setTimeout(fnc, 0); + }, + debounce: function debounce(func, threshold, callImmediately) { + var timeout = void 0; + return function () { + var obj = this; + var args = arguments; + function delayed() { + timeout = null; + if (!callImmediately) func.apply(obj, args); + } + var callNow = callImmediately || !timeout; + clearTimeout(timeout); + timeout = setTimeout(delayed, threshold); + if (callNow) { + func.apply(obj, args); + } + }; + }, + toArray: function toArray(obj) { + if (obj.toArray) return obj.toArray(); + return ARR_SLICE.call(obj); + }, + isUndefined: function isUndefined(obj) { + return obj === undefined; + }, + isNull: function isNull(obj) { + return obj === null; + }, + isNaN: function (_isNaN) { + function isNaN(_x) { + return _isNaN.apply(this, arguments); + } + isNaN.toString = function () { + return _isNaN.toString(); + }; + return isNaN; + }(function (obj) { + return isNaN(obj); + }), + isArray: Array.isArray || function (obj) { + return obj.constructor === Array; + }, + isObject: function isObject(obj) { + return obj === Object(obj); + }, + isNumber: function isNumber(obj) { + return obj === obj + 0; + }, + isString: function isString(obj) { + return obj === obj + ''; + }, + isBoolean: function isBoolean(obj) { + return obj === false || obj === true; + }, + isFunction: function isFunction(obj) { + return Object.prototype.toString.call(obj) === '[object Function]'; + } +}; + +var INTERPRETATIONS = [ +{ + litmus: Common.isString, + conversions: { + THREE_CHAR_HEX: { + read: function read(original) { + var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); + if (test === null) { + return false; + } + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0) + }; + }, + write: colorToString + }, + SIX_CHAR_HEX: { + read: function read(original) { + var test = original.match(/^#([A-F0-9]{6})$/i); + if (test === null) { + return false; + } + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString(), 0) + }; + }, + write: colorToString + }, + CSS_RGB: { + read: function read(original) { + var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) { + return false; + } + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]) + }; + }, + write: colorToString + }, + CSS_RGBA: { + read: function read(original) { + var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) { + return false; + } + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]), + a: parseFloat(test[4]) + }; + }, + write: colorToString + } + } +}, +{ + litmus: Common.isNumber, + conversions: { + HEX: { + read: function read(original) { + return { + space: 'HEX', + hex: original, + conversionName: 'HEX' + }; + }, + write: function write(color) { + return color.hex; + } + } + } +}, +{ + litmus: Common.isArray, + conversions: { + RGB_ARRAY: { + read: function read(original) { + if (original.length !== 3) { + return false; + } + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2] + }; + }, + write: function write(color) { + return [color.r, color.g, color.b]; + } + }, + RGBA_ARRAY: { + read: function read(original) { + if (original.length !== 4) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2], + a: original[3] + }; + }, + write: function write(color) { + return [color.r, color.g, color.b, color.a]; + } + } + } +}, +{ + litmus: Common.isObject, + conversions: { + RGBA_OBJ: { + read: function read(original) { + if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b, + a: original.a + }; + } + return false; + }, + write: function write(color) { + return { + r: color.r, + g: color.g, + b: color.b, + a: color.a + }; + } + }, + RGB_OBJ: { + read: function read(original) { + if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b + }; + } + return false; + }, + write: function write(color) { + return { + r: color.r, + g: color.g, + b: color.b + }; + } + }, + HSVA_OBJ: { + read: function read(original) { + if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v, + a: original.a + }; + } + return false; + }, + write: function write(color) { + return { + h: color.h, + s: color.s, + v: color.v, + a: color.a + }; + } + }, + HSV_OBJ: { + read: function read(original) { + if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v + }; + } + return false; + }, + write: function write(color) { + return { + h: color.h, + s: color.s, + v: color.v + }; + } + } + } +}]; +var result = void 0; +var toReturn = void 0; +var interpret = function interpret() { + toReturn = false; + var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0]; + Common.each(INTERPRETATIONS, function (family) { + if (family.litmus(original)) { + Common.each(family.conversions, function (conversion, conversionName) { + result = conversion.read(original); + if (toReturn === false && result !== false) { + toReturn = result; + result.conversionName = conversionName; + result.conversion = conversion; + return Common.BREAK; + } + }); + return Common.BREAK; + } + }); + return toReturn; +}; + +var tmpComponent = void 0; +var ColorMath = { + hsv_to_rgb: function hsv_to_rgb(h, s, v) { + var hi = Math.floor(h / 60) % 6; + var f = h / 60 - Math.floor(h / 60); + var p = v * (1.0 - s); + var q = v * (1.0 - f * s); + var t = v * (1.0 - (1.0 - f) * s); + var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi]; + return { + r: c[0] * 255, + g: c[1] * 255, + b: c[2] * 255 + }; + }, + rgb_to_hsv: function rgb_to_hsv(r, g, b) { + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h = void 0; + var s = void 0; + if (max !== 0) { + s = delta / max; + } else { + return { + h: NaN, + s: 0, + v: 0 + }; + } + if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else { + h = 4 + (r - g) / delta; + } + h /= 6; + if (h < 0) { + h += 1; + } + return { + h: h * 360, + s: s, + v: max / 255 + }; + }, + rgb_to_hex: function rgb_to_hex(r, g, b) { + var hex = this.hex_with_component(0, 2, r); + hex = this.hex_with_component(hex, 1, g); + hex = this.hex_with_component(hex, 0, b); + return hex; + }, + component_from_hex: function component_from_hex(hex, componentIndex) { + return hex >> componentIndex * 8 & 0xFF; + }, + hex_with_component: function hex_with_component(hex, componentIndex, value) { + return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent); + } +}; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; +}; + + + + + + + + + + + +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + + + + + + + +var get = function get(object, property, receiver) { + if (object === null) object = Function.prototype; + var desc = Object.getOwnPropertyDescriptor(object, property); + + if (desc === undefined) { + var parent = Object.getPrototypeOf(object); + + if (parent === null) { + return undefined; + } else { + return get(parent, property, receiver); + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get; + + if (getter === undefined) { + return undefined; + } + + return getter.call(receiver); + } +}; + +var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +}; + + + + + + + + + + + +var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; +}; + +var Color = function () { + function Color() { + classCallCheck(this, Color); + this.__state = interpret.apply(this, arguments); + if (this.__state === false) { + throw new Error('Failed to interpret color arguments'); + } + this.__state.a = this.__state.a || 1; + } + createClass(Color, [{ + key: 'toString', + value: function toString() { + return colorToString(this); + } + }, { + key: 'toHexString', + value: function toHexString() { + return colorToString(this, true); + } + }, { + key: 'toOriginal', + value: function toOriginal() { + return this.__state.conversion.write(this); + } + }]); + return Color; +}(); +function defineRGBComponent(target, component, componentHexIndex) { + Object.defineProperty(target, component, { + get: function get$$1() { + if (this.__state.space === 'RGB') { + return this.__state[component]; + } + Color.recalculateRGB(this, component, componentHexIndex); + return this.__state[component]; + }, + set: function set$$1(v) { + if (this.__state.space !== 'RGB') { + Color.recalculateRGB(this, component, componentHexIndex); + this.__state.space = 'RGB'; + } + this.__state[component] = v; + } + }); +} +function defineHSVComponent(target, component) { + Object.defineProperty(target, component, { + get: function get$$1() { + if (this.__state.space === 'HSV') { + return this.__state[component]; + } + Color.recalculateHSV(this); + return this.__state[component]; + }, + set: function set$$1(v) { + if (this.__state.space !== 'HSV') { + Color.recalculateHSV(this); + this.__state.space = 'HSV'; + } + this.__state[component] = v; + } + }); +} +Color.recalculateRGB = function (color, component, componentHexIndex) { + if (color.__state.space === 'HEX') { + color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex); + } else if (color.__state.space === 'HSV') { + Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); + } else { + throw new Error('Corrupted color state'); + } +}; +Color.recalculateHSV = function (color) { + var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b); + Common.extend(color.__state, { + s: result.s, + v: result.v + }); + if (!Common.isNaN(result.h)) { + color.__state.h = result.h; + } else if (Common.isUndefined(color.__state.h)) { + color.__state.h = 0; + } +}; +Color.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a']; +defineRGBComponent(Color.prototype, 'r', 2); +defineRGBComponent(Color.prototype, 'g', 1); +defineRGBComponent(Color.prototype, 'b', 0); +defineHSVComponent(Color.prototype, 'h'); +defineHSVComponent(Color.prototype, 's'); +defineHSVComponent(Color.prototype, 'v'); +Object.defineProperty(Color.prototype, 'a', { + get: function get$$1() { + return this.__state.a; + }, + set: function set$$1(v) { + this.__state.a = v; + } +}); +Object.defineProperty(Color.prototype, 'hex', { + get: function get$$1() { + if (!this.__state.space !== 'HEX') { + this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b); + } + return this.__state.hex; + }, + set: function set$$1(v) { + this.__state.space = 'HEX'; + this.__state.hex = v; + } +}); + +var Controller = function () { + function Controller(object, property) { + classCallCheck(this, Controller); + this.initialValue = object[property]; + this.domElement = document.createElement('div'); + this.object = object; + this.property = property; + this.__onChange = undefined; + this.__onFinishChange = undefined; + } + createClass(Controller, [{ + key: 'onChange', + value: function onChange(fnc) { + this.__onChange = fnc; + return this; + } + }, { + key: 'onFinishChange', + value: function onFinishChange(fnc) { + this.__onFinishChange = fnc; + return this; + } + }, { + key: 'setValue', + value: function setValue(newValue) { + this.object[this.property] = newValue; + if (this.__onChange) { + this.__onChange.call(this, newValue); + } + this.updateDisplay(); + return this; + } + }, { + key: 'getValue', + value: function getValue() { + return this.object[this.property]; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + return this; + } + }, { + key: 'isModified', + value: function isModified() { + return this.initialValue !== this.getValue(); + } + }]); + return Controller; +}(); + +var EVENT_MAP = { + HTMLEvents: ['change'], + MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'], + KeyboardEvents: ['keydown'] +}; +var EVENT_MAP_INV = {}; +Common.each(EVENT_MAP, function (v, k) { + Common.each(v, function (e) { + EVENT_MAP_INV[e] = k; + }); +}); +var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; +function cssValueToPixels(val) { + if (val === '0' || Common.isUndefined(val)) { + return 0; + } + var match = val.match(CSS_VALUE_PIXELS); + if (!Common.isNull(match)) { + return parseFloat(match[1]); + } + return 0; +} +var dom = { + makeSelectable: function makeSelectable(elem, selectable) { + if (elem === undefined || elem.style === undefined) return; + elem.onselectstart = selectable ? function () { + return false; + } : function () {}; + elem.style.MozUserSelect = selectable ? 'auto' : 'none'; + elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; + elem.unselectable = selectable ? 'on' : 'off'; + }, + makeFullscreen: function makeFullscreen(elem, hor, vert) { + var vertical = vert; + var horizontal = hor; + if (Common.isUndefined(horizontal)) { + horizontal = true; + } + if (Common.isUndefined(vertical)) { + vertical = true; + } + elem.style.position = 'absolute'; + if (horizontal) { + elem.style.left = 0; + elem.style.right = 0; + } + if (vertical) { + elem.style.top = 0; + elem.style.bottom = 0; + } + }, + fakeEvent: function fakeEvent(elem, eventType, pars, aux) { + var params = pars || {}; + var className = EVENT_MAP_INV[eventType]; + if (!className) { + throw new Error('Event type ' + eventType + ' not supported.'); + } + var evt = document.createEvent(className); + switch (className) { + case 'MouseEvents': + { + var clientX = params.x || params.clientX || 0; + var clientY = params.y || params.clientY || 0; + evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0, + 0, + clientX, + clientY, + false, false, false, false, 0, null); + break; + } + case 'KeyboardEvents': + { + var init = evt.initKeyboardEvent || evt.initKeyEvent; + Common.defaults(params, { + cancelable: true, + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false, + keyCode: undefined, + charCode: undefined + }); + init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode); + break; + } + default: + { + evt.initEvent(eventType, params.bubbles || false, params.cancelable || true); + break; + } + } + Common.defaults(evt, aux); + elem.dispatchEvent(evt); + }, + bind: function bind(elem, event, func, newBool) { + var bool = newBool || false; + if (elem.addEventListener) { + elem.addEventListener(event, func, bool); + } else if (elem.attachEvent) { + elem.attachEvent('on' + event, func); + } + return dom; + }, + unbind: function unbind(elem, event, func, newBool) { + var bool = newBool || false; + if (elem.removeEventListener) { + elem.removeEventListener(event, func, bool); + } else if (elem.detachEvent) { + elem.detachEvent('on' + event, func); + } + return dom; + }, + addClass: function addClass(elem, className) { + if (elem.className === undefined) { + elem.className = className; + } else if (elem.className !== className) { + var classes = elem.className.split(/ +/); + if (classes.indexOf(className) === -1) { + classes.push(className); + elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); + } + } + return dom; + }, + removeClass: function removeClass(elem, className) { + if (className) { + if (elem.className === className) { + elem.removeAttribute('class'); + } else { + var classes = elem.className.split(/ +/); + var index = classes.indexOf(className); + if (index !== -1) { + classes.splice(index, 1); + elem.className = classes.join(' '); + } + } + } else { + elem.className = undefined; + } + return dom; + }, + hasClass: function hasClass(elem, className) { + return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; + }, + getWidth: function getWidth(elem) { + var style = getComputedStyle(elem); + return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width); + }, + getHeight: function getHeight(elem) { + var style = getComputedStyle(elem); + return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height); + }, + getOffset: function getOffset(el) { + var elem = el; + var offset = { left: 0, top: 0 }; + if (elem.offsetParent) { + do { + offset.left += elem.offsetLeft; + offset.top += elem.offsetTop; + elem = elem.offsetParent; + } while (elem); + } + return offset; + }, + isActive: function isActive(elem) { + return elem === document.activeElement && (elem.type || elem.href); + } +}; + +var BooleanController = function (_Controller) { + inherits(BooleanController, _Controller); + function BooleanController(object, property) { + classCallCheck(this, BooleanController); + var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property)); + var _this = _this2; + _this2.__prev = _this2.getValue(); + _this2.__checkbox = document.createElement('input'); + _this2.__checkbox.setAttribute('type', 'checkbox'); + function onChange() { + _this.setValue(!_this.__prev); + } + dom.bind(_this2.__checkbox, 'change', onChange, false); + _this2.domElement.appendChild(_this2.__checkbox); + _this2.updateDisplay(); + return _this2; + } + createClass(BooleanController, [{ + key: 'setValue', + value: function setValue(v) { + var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + this.__prev = this.getValue(); + return toReturn; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + if (this.getValue() === true) { + this.__checkbox.setAttribute('checked', 'checked'); + this.__checkbox.checked = true; + this.__prev = true; + } else { + this.__checkbox.checked = false; + this.__prev = false; + } + return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this); + } + }]); + return BooleanController; +}(Controller); + +var OptionController = function (_Controller) { + inherits(OptionController, _Controller); + function OptionController(object, property, opts) { + classCallCheck(this, OptionController); + var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property)); + var options = opts; + var _this = _this2; + _this2.__select = document.createElement('select'); + if (Common.isArray(options)) { + var map = {}; + Common.each(options, function (element) { + map[element] = element; + }); + options = map; + } + Common.each(options, function (value, key) { + var opt = document.createElement('option'); + opt.innerHTML = key; + opt.setAttribute('value', value); + _this.__select.appendChild(opt); + }); + _this2.updateDisplay(); + dom.bind(_this2.__select, 'change', function () { + var desiredValue = this.options[this.selectedIndex].value; + _this.setValue(desiredValue); + }); + _this2.domElement.appendChild(_this2.__select); + return _this2; + } + createClass(OptionController, [{ + key: 'setValue', + value: function setValue(v) { + var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + return toReturn; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + if (dom.isActive(this.__select)) return this; + this.__select.value = this.getValue(); + return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this); + } + }]); + return OptionController; +}(Controller); + +var StringController = function (_Controller) { + inherits(StringController, _Controller); + function StringController(object, property) { + classCallCheck(this, StringController); + var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property)); + var _this = _this2; + function onChange() { + _this.setValue(_this.__input.value); + } + function onBlur() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + _this2.__input = document.createElement('input'); + _this2.__input.setAttribute('type', 'text'); + dom.bind(_this2.__input, 'keyup', onChange); + dom.bind(_this2.__input, 'change', onChange); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + this.blur(); + } + }); + _this2.updateDisplay(); + _this2.domElement.appendChild(_this2.__input); + return _this2; + } + createClass(StringController, [{ + key: 'updateDisplay', + value: function updateDisplay() { + if (!dom.isActive(this.__input)) { + this.__input.value = this.getValue(); + } + return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this); + } + }]); + return StringController; +}(Controller); + +function numDecimals(x) { + var _x = x.toString(); + if (_x.indexOf('.') > -1) { + return _x.length - _x.indexOf('.') - 1; + } + return 0; +} +var NumberController = function (_Controller) { + inherits(NumberController, _Controller); + function NumberController(object, property, params) { + classCallCheck(this, NumberController); + var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property)); + var _params = params || {}; + _this.__min = _params.min; + _this.__max = _params.max; + _this.__step = _params.step; + if (Common.isUndefined(_this.__step)) { + if (_this.initialValue === 0) { + _this.__impliedStep = 1; + } else { + _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10; + } + } else { + _this.__impliedStep = _this.__step; + } + _this.__precision = numDecimals(_this.__impliedStep); + return _this; + } + createClass(NumberController, [{ + key: 'setValue', + value: function setValue(v) { + var _v = v; + if (this.__min !== undefined && _v < this.__min) { + _v = this.__min; + } else if (this.__max !== undefined && _v > this.__max) { + _v = this.__max; + } + if (this.__step !== undefined && _v % this.__step !== 0) { + _v = Math.round(_v / this.__step) * this.__step; + } + return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v); + } + }, { + key: 'min', + value: function min(minValue) { + this.__min = minValue; + return this; + } + }, { + key: 'max', + value: function max(maxValue) { + this.__max = maxValue; + return this; + } + }, { + key: 'step', + value: function step(stepValue) { + this.__step = stepValue; + this.__impliedStep = stepValue; + this.__precision = numDecimals(stepValue); + return this; + } + }]); + return NumberController; +}(Controller); + +function roundToDecimal(value, decimals) { + var tenTo = Math.pow(10, decimals); + return Math.round(value * tenTo) / tenTo; +} +var NumberControllerBox = function (_NumberController) { + inherits(NumberControllerBox, _NumberController); + function NumberControllerBox(object, property, params) { + classCallCheck(this, NumberControllerBox); + var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params)); + _this2.__truncationSuspended = false; + var _this = _this2; + var prevY = void 0; + function onChange() { + var attempted = parseFloat(_this.__input.value); + if (!Common.isNaN(attempted)) { + _this.setValue(attempted); + } + } + function onFinish() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + function onBlur() { + onFinish(); + } + function onMouseDrag(e) { + var diff = prevY - e.clientY; + _this.setValue(_this.getValue() + diff * _this.__impliedStep); + prevY = e.clientY; + } + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + onFinish(); + } + function onMouseDown(e) { + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + prevY = e.clientY; + } + _this2.__input = document.createElement('input'); + _this2.__input.setAttribute('type', 'text'); + dom.bind(_this2.__input, 'change', onChange); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__input, 'mousedown', onMouseDown); + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + _this.__truncationSuspended = true; + this.blur(); + _this.__truncationSuspended = false; + onFinish(); + } + }); + _this2.updateDisplay(); + _this2.domElement.appendChild(_this2.__input); + return _this2; + } + createClass(NumberControllerBox, [{ + key: 'updateDisplay', + value: function updateDisplay() { + this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); + return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this); + } + }]); + return NumberControllerBox; +}(NumberController); + +function map(v, i1, i2, o1, o2) { + return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); +} +var NumberControllerSlider = function (_NumberController) { + inherits(NumberControllerSlider, _NumberController); + function NumberControllerSlider(object, property, min, max, step) { + classCallCheck(this, NumberControllerSlider); + var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step })); + var _this = _this2; + _this2.__background = document.createElement('div'); + _this2.__foreground = document.createElement('div'); + dom.bind(_this2.__background, 'mousedown', onMouseDown); + dom.bind(_this2.__background, 'touchstart', onTouchStart); + dom.addClass(_this2.__background, 'slider'); + dom.addClass(_this2.__foreground, 'slider-fg'); + function onMouseDown(e) { + document.activeElement.blur(); + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + onMouseDrag(e); + } + function onMouseDrag(e) { + e.preventDefault(); + var bgRect = _this.__background.getBoundingClientRect(); + _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); + return false; + } + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + function onTouchStart(e) { + if (e.touches.length !== 1) { + return; + } + dom.bind(window, 'touchmove', onTouchMove); + dom.bind(window, 'touchend', onTouchEnd); + onTouchMove(e); + } + function onTouchMove(e) { + var clientX = e.touches[0].clientX; + var bgRect = _this.__background.getBoundingClientRect(); + _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); + } + function onTouchEnd() { + dom.unbind(window, 'touchmove', onTouchMove); + dom.unbind(window, 'touchend', onTouchEnd); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + _this2.updateDisplay(); + _this2.__background.appendChild(_this2.__foreground); + _this2.domElement.appendChild(_this2.__background); + return _this2; + } + createClass(NumberControllerSlider, [{ + key: 'updateDisplay', + value: function updateDisplay() { + var pct = (this.getValue() - this.__min) / (this.__max - this.__min); + this.__foreground.style.width = pct * 100 + '%'; + return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this); + } + }]); + return NumberControllerSlider; +}(NumberController); + +var FunctionController = function (_Controller) { + inherits(FunctionController, _Controller); + function FunctionController(object, property, text) { + classCallCheck(this, FunctionController); + var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property)); + var _this = _this2; + _this2.__button = document.createElement('div'); + _this2.__button.innerHTML = text === undefined ? 'Fire' : text; + dom.bind(_this2.__button, 'click', function (e) { + e.preventDefault(); + _this.fire(); + return false; + }); + dom.addClass(_this2.__button, 'button'); + _this2.domElement.appendChild(_this2.__button); + return _this2; + } + createClass(FunctionController, [{ + key: 'fire', + value: function fire() { + if (this.__onChange) { + this.__onChange.call(this); + } + this.getValue().call(this.object); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + } + }]); + return FunctionController; +}(Controller); + +var ColorController = function (_Controller) { + inherits(ColorController, _Controller); + function ColorController(object, property) { + classCallCheck(this, ColorController); + var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property)); + _this2.__color = new Color(_this2.getValue()); + _this2.__temp = new Color(0); + var _this = _this2; + _this2.domElement = document.createElement('div'); + dom.makeSelectable(_this2.domElement, false); + _this2.__selector = document.createElement('div'); + _this2.__selector.className = 'selector'; + _this2.__saturation_field = document.createElement('div'); + _this2.__saturation_field.className = 'saturation-field'; + _this2.__field_knob = document.createElement('div'); + _this2.__field_knob.className = 'field-knob'; + _this2.__field_knob_border = '2px solid '; + _this2.__hue_knob = document.createElement('div'); + _this2.__hue_knob.className = 'hue-knob'; + _this2.__hue_field = document.createElement('div'); + _this2.__hue_field.className = 'hue-field'; + _this2.__input = document.createElement('input'); + _this2.__input.type = 'text'; + _this2.__input_textShadow = '0 1px 1px '; + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + onBlur.call(this); + } + }); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__selector, 'mousedown', function () { + dom.addClass(this, 'drag').bind(window, 'mouseup', function () { + dom.removeClass(_this.__selector, 'drag'); + }); + }); + dom.bind(_this2.__selector, 'touchstart', function () { + dom.addClass(this, 'drag').bind(window, 'touchend', function () { + dom.removeClass(_this.__selector, 'drag'); + }); + }); + var valueField = document.createElement('div'); + Common.extend(_this2.__selector.style, { + width: '122px', + height: '102px', + padding: '3px', + backgroundColor: '#222', + boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' + }); + Common.extend(_this2.__field_knob.style, { + position: 'absolute', + width: '12px', + height: '12px', + border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'), + boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', + borderRadius: '12px', + zIndex: 1 + }); + Common.extend(_this2.__hue_knob.style, { + position: 'absolute', + width: '15px', + height: '2px', + borderRight: '4px solid #fff', + zIndex: 1 + }); + Common.extend(_this2.__saturation_field.style, { + width: '100px', + height: '100px', + border: '1px solid #555', + marginRight: '3px', + display: 'inline-block', + cursor: 'pointer' + }); + Common.extend(valueField.style, { + width: '100%', + height: '100%', + background: 'none' + }); + linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000'); + Common.extend(_this2.__hue_field.style, { + width: '15px', + height: '100px', + border: '1px solid #555', + cursor: 'ns-resize', + position: 'absolute', + top: '3px', + right: '3px' + }); + hueGradient(_this2.__hue_field); + Common.extend(_this2.__input.style, { + outline: 'none', + textAlign: 'center', + color: '#fff', + border: 0, + fontWeight: 'bold', + textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)' + }); + dom.bind(_this2.__saturation_field, 'mousedown', fieldDown); + dom.bind(_this2.__saturation_field, 'touchstart', fieldDown); + dom.bind(_this2.__field_knob, 'mousedown', fieldDown); + dom.bind(_this2.__field_knob, 'touchstart', fieldDown); + dom.bind(_this2.__hue_field, 'mousedown', fieldDownH); + dom.bind(_this2.__hue_field, 'touchstart', fieldDownH); + function fieldDown(e) { + setSV(e); + dom.bind(window, 'mousemove', setSV); + dom.bind(window, 'touchmove', setSV); + dom.bind(window, 'mouseup', fieldUpSV); + dom.bind(window, 'touchend', fieldUpSV); + } + function fieldDownH(e) { + setH(e); + dom.bind(window, 'mousemove', setH); + dom.bind(window, 'touchmove', setH); + dom.bind(window, 'mouseup', fieldUpH); + dom.bind(window, 'touchend', fieldUpH); + } + function fieldUpSV() { + dom.unbind(window, 'mousemove', setSV); + dom.unbind(window, 'touchmove', setSV); + dom.unbind(window, 'mouseup', fieldUpSV); + dom.unbind(window, 'touchend', fieldUpSV); + onFinish(); + } + function fieldUpH() { + dom.unbind(window, 'mousemove', setH); + dom.unbind(window, 'touchmove', setH); + dom.unbind(window, 'mouseup', fieldUpH); + dom.unbind(window, 'touchend', fieldUpH); + onFinish(); + } + function onBlur() { + var i = interpret(this.value); + if (i !== false) { + _this.__color.__state = i; + _this.setValue(_this.__color.toOriginal()); + } else { + this.value = _this.__color.toString(); + } + } + function onFinish() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.__color.toOriginal()); + } + } + _this2.__saturation_field.appendChild(valueField); + _this2.__selector.appendChild(_this2.__field_knob); + _this2.__selector.appendChild(_this2.__saturation_field); + _this2.__selector.appendChild(_this2.__hue_field); + _this2.__hue_field.appendChild(_this2.__hue_knob); + _this2.domElement.appendChild(_this2.__input); + _this2.domElement.appendChild(_this2.__selector); + _this2.updateDisplay(); + function setSV(e) { + if (e.type.indexOf('touch') === -1) { + e.preventDefault(); + } + var fieldRect = _this.__saturation_field.getBoundingClientRect(); + var _ref = e.touches && e.touches[0] || e, + clientX = _ref.clientX, + clientY = _ref.clientY; + var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left); + var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); + if (v > 1) { + v = 1; + } else if (v < 0) { + v = 0; + } + if (s > 1) { + s = 1; + } else if (s < 0) { + s = 0; + } + _this.__color.v = v; + _this.__color.s = s; + _this.setValue(_this.__color.toOriginal()); + return false; + } + function setH(e) { + if (e.type.indexOf('touch') === -1) { + e.preventDefault(); + } + var fieldRect = _this.__hue_field.getBoundingClientRect(); + var _ref2 = e.touches && e.touches[0] || e, + clientY = _ref2.clientY; + var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); + if (h > 1) { + h = 1; + } else if (h < 0) { + h = 0; + } + _this.__color.h = h * 360; + _this.setValue(_this.__color.toOriginal()); + return false; + } + return _this2; + } + createClass(ColorController, [{ + key: 'updateDisplay', + value: function updateDisplay() { + var i = interpret(this.getValue()); + if (i !== false) { + var mismatch = false; + Common.each(Color.COMPONENTS, function (component) { + if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) { + mismatch = true; + return {}; + } + }, this); + if (mismatch) { + Common.extend(this.__color.__state, i); + } + } + Common.extend(this.__temp.__state, this.__color.__state); + this.__temp.a = 1; + var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0; + var _flip = 255 - flip; + Common.extend(this.__field_knob.style, { + marginLeft: 100 * this.__color.s - 7 + 'px', + marginTop: 100 * (1 - this.__color.v) - 7 + 'px', + backgroundColor: this.__temp.toHexString(), + border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')' + }); + this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'; + this.__temp.s = 1; + this.__temp.v = 1; + linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString()); + this.__input.value = this.__color.toString(); + Common.extend(this.__input.style, { + backgroundColor: this.__color.toHexString(), + color: 'rgb(' + flip + ',' + flip + ',' + flip + ')', + textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)' + }); + } + }]); + return ColorController; +}(Controller); +var vendors = ['-moz-', '-o-', '-webkit-', '-ms-', '']; +function linearGradient(elem, x, a, b) { + elem.style.background = ''; + Common.each(vendors, function (vendor) { + elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); '; + }); +} +function hueGradient(elem) { + elem.style.background = ''; + elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'; + elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; +} + +var css = { + load: function load(url, indoc) { + var doc = indoc || document; + var link = doc.createElement('link'); + link.type = 'text/css'; + link.rel = 'stylesheet'; + link.href = url; + doc.getElementsByTagName('head')[0].appendChild(link); + }, + inject: function inject(cssContent, indoc) { + var doc = indoc || document; + var injected = document.createElement('style'); + injected.type = 'text/css'; + injected.innerHTML = cssContent; + var head = doc.getElementsByTagName('head')[0]; + try { + head.appendChild(injected); + } catch (e) { + } + } +}; + +var saveDialogContents = "
        \n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
        \n\n Automatically save\n values to localStorage on exit.\n\n
        The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
        \n\n
        \n\n
        "; + +var ControllerFactory = function ControllerFactory(object, property) { + var initialValue = object[property]; + if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) { + return new OptionController(object, property, arguments[2]); + } + if (Common.isNumber(initialValue)) { + if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) { + if (Common.isNumber(arguments[4])) { + return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]); + } + return new NumberControllerSlider(object, property, arguments[2], arguments[3]); + } + if (Common.isNumber(arguments[4])) { + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] }); + } + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); + } + if (Common.isString(initialValue)) { + return new StringController(object, property); + } + if (Common.isFunction(initialValue)) { + return new FunctionController(object, property, ''); + } + if (Common.isBoolean(initialValue)) { + return new BooleanController(object, property); + } + return null; +}; + +function requestAnimationFrame(callback) { + setTimeout(callback, 1000 / 60); +} +var requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame; + +var CenteredDiv = function () { + function CenteredDiv() { + classCallCheck(this, CenteredDiv); + this.backgroundElement = document.createElement('div'); + Common.extend(this.backgroundElement.style, { + backgroundColor: 'rgba(0,0,0,0.8)', + top: 0, + left: 0, + display: 'none', + zIndex: '1000', + opacity: 0, + WebkitTransition: 'opacity 0.2s linear', + transition: 'opacity 0.2s linear' + }); + dom.makeFullscreen(this.backgroundElement); + this.backgroundElement.style.position = 'fixed'; + this.domElement = document.createElement('div'); + Common.extend(this.domElement.style, { + position: 'fixed', + display: 'none', + zIndex: '1001', + opacity: 0, + WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear', + transition: 'transform 0.2s ease-out, opacity 0.2s linear' + }); + document.body.appendChild(this.backgroundElement); + document.body.appendChild(this.domElement); + var _this = this; + dom.bind(this.backgroundElement, 'click', function () { + _this.hide(); + }); + } + createClass(CenteredDiv, [{ + key: 'show', + value: function show() { + var _this = this; + this.backgroundElement.style.display = 'block'; + this.domElement.style.display = 'block'; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + this.layout(); + Common.defer(function () { + _this.backgroundElement.style.opacity = 1; + _this.domElement.style.opacity = 1; + _this.domElement.style.webkitTransform = 'scale(1)'; + }); + } + }, { + key: 'hide', + value: function hide() { + var _this = this; + var hide = function hide() { + _this.domElement.style.display = 'none'; + _this.backgroundElement.style.display = 'none'; + dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); + dom.unbind(_this.domElement, 'transitionend', hide); + dom.unbind(_this.domElement, 'oTransitionEnd', hide); + }; + dom.bind(this.domElement, 'webkitTransitionEnd', hide); + dom.bind(this.domElement, 'transitionend', hide); + dom.bind(this.domElement, 'oTransitionEnd', hide); + this.backgroundElement.style.opacity = 0; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + } + }, { + key: 'layout', + value: function layout() { + this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px'; + this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px'; + } + }]); + return CenteredDiv; +}(); + +var styleSheet = ___$insertStyle(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"); + +css.inject(styleSheet); +var CSS_NAMESPACE = 'dg'; +var HIDE_KEY_CODE = 72; +var CLOSE_BUTTON_HEIGHT = 20; +var DEFAULT_DEFAULT_PRESET_NAME = 'Default'; +var SUPPORTS_LOCAL_STORAGE = function () { + try { + return !!window.localStorage; + } catch (e) { + return false; + } +}(); +var SAVE_DIALOGUE = void 0; +var autoPlaceVirgin = true; +var autoPlaceContainer = void 0; +var hide = false; +var hideableGuis = []; +var GUI = function GUI(pars) { + var _this = this; + var params = pars || {}; + this.domElement = document.createElement('div'); + this.__ul = document.createElement('ul'); + this.domElement.appendChild(this.__ul); + dom.addClass(this.domElement, CSS_NAMESPACE); + this.__folders = {}; + this.__controllers = []; + this.__rememberedObjects = []; + this.__rememberedObjectIndecesToControllers = []; + this.__listening = []; + params = Common.defaults(params, { + closeOnTop: false, + autoPlace: true, + width: GUI.DEFAULT_WIDTH + }); + params = Common.defaults(params, { + resizable: params.autoPlace, + hideable: params.autoPlace + }); + if (!Common.isUndefined(params.load)) { + if (params.preset) { + params.load.preset = params.preset; + } + } else { + params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; + } + if (Common.isUndefined(params.parent) && params.hideable) { + hideableGuis.push(this); + } + params.resizable = Common.isUndefined(params.parent) && params.resizable; + if (params.autoPlace && Common.isUndefined(params.scrollable)) { + params.scrollable = true; + } + var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; + var saveToLocalStorage = void 0; + var titleRow = void 0; + Object.defineProperties(this, + { + parent: { + get: function get$$1() { + return params.parent; + } + }, + scrollable: { + get: function get$$1() { + return params.scrollable; + } + }, + autoPlace: { + get: function get$$1() { + return params.autoPlace; + } + }, + closeOnTop: { + get: function get$$1() { + return params.closeOnTop; + } + }, + preset: { + get: function get$$1() { + if (_this.parent) { + return _this.getRoot().preset; + } + return params.load.preset; + }, + set: function set$$1(v) { + if (_this.parent) { + _this.getRoot().preset = v; + } else { + params.load.preset = v; + } + setPresetSelectIndex(this); + _this.revert(); + } + }, + width: { + get: function get$$1() { + return params.width; + }, + set: function set$$1(v) { + params.width = v; + setWidth(_this, v); + } + }, + name: { + get: function get$$1() { + return params.name; + }, + set: function set$$1(v) { + params.name = v; + if (titleRow) { + titleRow.innerHTML = params.name; + } + } + }, + closed: { + get: function get$$1() { + return params.closed; + }, + set: function set$$1(v) { + params.closed = v; + if (params.closed) { + dom.addClass(_this.__ul, GUI.CLASS_CLOSED); + } else { + dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); + } + this.onResize(); + if (_this.__closeButton) { + _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; + } + } + }, + load: { + get: function get$$1() { + return params.load; + } + }, + useLocalStorage: { + get: function get$$1() { + return useLocalStorage; + }, + set: function set$$1(bool) { + if (SUPPORTS_LOCAL_STORAGE) { + useLocalStorage = bool; + if (bool) { + dom.bind(window, 'unload', saveToLocalStorage); + } else { + dom.unbind(window, 'unload', saveToLocalStorage); + } + localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); + } + } + } + }); + if (Common.isUndefined(params.parent)) { + this.closed = params.closed || false; + dom.addClass(this.domElement, GUI.CLASS_MAIN); + dom.makeSelectable(this.domElement, false); + if (SUPPORTS_LOCAL_STORAGE) { + if (useLocalStorage) { + _this.useLocalStorage = true; + var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui')); + if (savedGui) { + params.load = JSON.parse(savedGui); + } + } + } + this.__closeButton = document.createElement('div'); + this.__closeButton.innerHTML = GUI.TEXT_CLOSED; + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); + if (params.closeOnTop) { + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP); + this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]); + } else { + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM); + this.domElement.appendChild(this.__closeButton); + } + dom.bind(this.__closeButton, 'click', function () { + _this.closed = !_this.closed; + }); + } else { + if (params.closed === undefined) { + params.closed = true; + } + var titleRowName = document.createTextNode(params.name); + dom.addClass(titleRowName, 'controller-name'); + titleRow = addRow(_this, titleRowName); + var onClickTitle = function onClickTitle(e) { + e.preventDefault(); + _this.closed = !_this.closed; + return false; + }; + dom.addClass(this.__ul, GUI.CLASS_CLOSED); + dom.addClass(titleRow, 'title'); + dom.bind(titleRow, 'click', onClickTitle); + if (!params.closed) { + this.closed = false; + } + } + if (params.autoPlace) { + if (Common.isUndefined(params.parent)) { + if (autoPlaceVirgin) { + autoPlaceContainer = document.createElement('div'); + dom.addClass(autoPlaceContainer, CSS_NAMESPACE); + dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER); + document.body.appendChild(autoPlaceContainer); + autoPlaceVirgin = false; + } + autoPlaceContainer.appendChild(this.domElement); + dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); + } + if (!this.parent) { + setWidth(_this, params.width); + } + } + this.__resizeHandler = function () { + _this.onResizeDebounced(); + }; + dom.bind(window, 'resize', this.__resizeHandler); + dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler); + dom.bind(this.__ul, 'transitionend', this.__resizeHandler); + dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler); + this.onResize(); + if (params.resizable) { + addResizeHandle(this); + } + saveToLocalStorage = function saveToLocalStorage() { + if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') { + localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); + } + }; + this.saveToLocalStorageIfPossible = saveToLocalStorage; + function resetWidth() { + var root = _this.getRoot(); + root.width += 1; + Common.defer(function () { + root.width -= 1; + }); + } + if (!params.parent) { + resetWidth(); + } +}; +GUI.toggleHide = function () { + hide = !hide; + Common.each(hideableGuis, function (gui) { + gui.domElement.style.display = hide ? 'none' : ''; + }); +}; +GUI.CLASS_AUTO_PLACE = 'a'; +GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; +GUI.CLASS_MAIN = 'main'; +GUI.CLASS_CONTROLLER_ROW = 'cr'; +GUI.CLASS_TOO_TALL = 'taller-than-window'; +GUI.CLASS_CLOSED = 'closed'; +GUI.CLASS_CLOSE_BUTTON = 'close-button'; +GUI.CLASS_CLOSE_TOP = 'close-top'; +GUI.CLASS_CLOSE_BOTTOM = 'close-bottom'; +GUI.CLASS_DRAG = 'drag'; +GUI.DEFAULT_WIDTH = 245; +GUI.TEXT_CLOSED = 'Close Controls'; +GUI.TEXT_OPEN = 'Open Controls'; +GUI._keydownHandler = function (e) { + if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) { + GUI.toggleHide(); + } +}; +dom.bind(window, 'keydown', GUI._keydownHandler, false); +Common.extend(GUI.prototype, +{ + add: function add(object, property) { + return _add(this, object, property, { + factoryArgs: Array.prototype.slice.call(arguments, 2) + }); + }, + addColor: function addColor(object, property) { + return _add(this, object, property, { + color: true + }); + }, + remove: function remove(controller) { + this.__ul.removeChild(controller.__li); + this.__controllers.splice(this.__controllers.indexOf(controller), 1); + var _this = this; + Common.defer(function () { + _this.onResize(); + }); + }, + destroy: function destroy() { + if (this.parent) { + throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.'); + } + if (this.autoPlace) { + autoPlaceContainer.removeChild(this.domElement); + } + var _this = this; + Common.each(this.__folders, function (subfolder) { + _this.removeFolder(subfolder); + }); + dom.unbind(window, 'keydown', GUI._keydownHandler, false); + removeListeners(this); + }, + addFolder: function addFolder(name) { + if (this.__folders[name] !== undefined) { + throw new Error('You already have a folder in this GUI by the' + ' name "' + name + '"'); + } + var newGuiParams = { name: name, parent: this }; + newGuiParams.autoPlace = this.autoPlace; + if (this.load && + this.load.folders && + this.load.folders[name]) { + newGuiParams.closed = this.load.folders[name].closed; + newGuiParams.load = this.load.folders[name]; + } + var gui = new GUI(newGuiParams); + this.__folders[name] = gui; + var li = addRow(this, gui.domElement); + dom.addClass(li, 'folder'); + return gui; + }, + removeFolder: function removeFolder(folder) { + this.__ul.removeChild(folder.domElement.parentElement); + delete this.__folders[folder.name]; + if (this.load && + this.load.folders && + this.load.folders[folder.name]) { + delete this.load.folders[folder.name]; + } + removeListeners(folder); + var _this = this; + Common.each(folder.__folders, function (subfolder) { + folder.removeFolder(subfolder); + }); + Common.defer(function () { + _this.onResize(); + }); + }, + open: function open() { + this.closed = false; + }, + close: function close() { + this.closed = true; + }, + hide: function hide() { + this.domElement.style.display = 'none'; + }, + show: function show() { + this.domElement.style.display = ''; + }, + onResize: function onResize() { + var root = this.getRoot(); + if (root.scrollable) { + var top = dom.getOffset(root.__ul).top; + var h = 0; + Common.each(root.__ul.childNodes, function (node) { + if (!(root.autoPlace && node === root.__save_row)) { + h += dom.getHeight(node); + } + }); + if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { + dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; + } else { + dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = 'auto'; + } + } + if (root.__resize_handle) { + Common.defer(function () { + root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; + }); + } + if (root.__closeButton) { + root.__closeButton.style.width = root.width + 'px'; + } + }, + onResizeDebounced: Common.debounce(function () { + this.onResize(); + }, 50), + remember: function remember() { + if (Common.isUndefined(SAVE_DIALOGUE)) { + SAVE_DIALOGUE = new CenteredDiv(); + SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents; + } + if (this.parent) { + throw new Error('You can only call remember on a top level GUI.'); + } + var _this = this; + Common.each(Array.prototype.slice.call(arguments), function (object) { + if (_this.__rememberedObjects.length === 0) { + addSaveMenu(_this); + } + if (_this.__rememberedObjects.indexOf(object) === -1) { + _this.__rememberedObjects.push(object); + } + }); + if (this.autoPlace) { + setWidth(this, this.width); + } + }, + getRoot: function getRoot() { + var gui = this; + while (gui.parent) { + gui = gui.parent; + } + return gui; + }, + getSaveObject: function getSaveObject() { + var toReturn = this.load; + toReturn.closed = this.closed; + if (this.__rememberedObjects.length > 0) { + toReturn.preset = this.preset; + if (!toReturn.remembered) { + toReturn.remembered = {}; + } + toReturn.remembered[this.preset] = getCurrentPreset(this); + } + toReturn.folders = {}; + Common.each(this.__folders, function (element, key) { + toReturn.folders[key] = element.getSaveObject(); + }); + return toReturn; + }, + save: function save() { + if (!this.load.remembered) { + this.load.remembered = {}; + } + this.load.remembered[this.preset] = getCurrentPreset(this); + markPresetModified(this, false); + this.saveToLocalStorageIfPossible(); + }, + saveAs: function saveAs(presetName) { + if (!this.load.remembered) { + this.load.remembered = {}; + this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); + } + this.load.remembered[presetName] = getCurrentPreset(this); + this.preset = presetName; + addPresetOption(this, presetName, true); + this.saveToLocalStorageIfPossible(); + }, + revert: function revert(gui) { + Common.each(this.__controllers, function (controller) { + if (!this.getRoot().load.remembered) { + controller.setValue(controller.initialValue); + } else { + recallSavedValue(gui || this.getRoot(), controller); + } + if (controller.__onFinishChange) { + controller.__onFinishChange.call(controller, controller.getValue()); + } + }, this); + Common.each(this.__folders, function (folder) { + folder.revert(folder); + }); + if (!gui) { + markPresetModified(this.getRoot(), false); + } + }, + listen: function listen(controller) { + var init = this.__listening.length === 0; + this.__listening.push(controller); + if (init) { + updateDisplays(this.__listening); + } + }, + updateDisplay: function updateDisplay() { + Common.each(this.__controllers, function (controller) { + controller.updateDisplay(); + }); + Common.each(this.__folders, function (folder) { + folder.updateDisplay(); + }); + } +}); +function addRow(gui, newDom, liBefore) { + var li = document.createElement('li'); + if (newDom) { + li.appendChild(newDom); + } + if (liBefore) { + gui.__ul.insertBefore(li, liBefore); + } else { + gui.__ul.appendChild(li); + } + gui.onResize(); + return li; +} +function removeListeners(gui) { + dom.unbind(window, 'resize', gui.__resizeHandler); + if (gui.saveToLocalStorageIfPossible) { + dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible); + } +} +function markPresetModified(gui, modified) { + var opt = gui.__preset_select[gui.__preset_select.selectedIndex]; + if (modified) { + opt.innerHTML = opt.value + '*'; + } else { + opt.innerHTML = opt.value; + } +} +function augmentController(gui, li, controller) { + controller.__li = li; + controller.__gui = gui; + Common.extend(controller, { + options: function options(_options) { + if (arguments.length > 1) { + var nextSibling = controller.__li.nextElementSibling; + controller.remove(); + return _add(gui, controller.object, controller.property, { + before: nextSibling, + factoryArgs: [Common.toArray(arguments)] + }); + } + if (Common.isArray(_options) || Common.isObject(_options)) { + var _nextSibling = controller.__li.nextElementSibling; + controller.remove(); + return _add(gui, controller.object, controller.property, { + before: _nextSibling, + factoryArgs: [_options] + }); + } + }, + name: function name(_name) { + controller.__li.firstElementChild.firstElementChild.innerHTML = _name; + return controller; + }, + listen: function listen() { + controller.__gui.listen(controller); + return controller; + }, + remove: function remove() { + controller.__gui.remove(controller); + return controller; + } + }); + if (controller instanceof NumberControllerSlider) { + var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step }); + Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) { + var pc = controller[method]; + var pb = box[method]; + controller[method] = box[method] = function () { + var args = Array.prototype.slice.call(arguments); + pb.apply(box, args); + return pc.apply(controller, args); + }; + }); + dom.addClass(li, 'has-slider'); + controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); + } else if (controller instanceof NumberControllerBox) { + var r = function r(returned) { + if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) { + var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML; + var wasListening = controller.__gui.__listening.indexOf(controller) > -1; + controller.remove(); + var newController = _add(gui, controller.object, controller.property, { + before: controller.__li.nextElementSibling, + factoryArgs: [controller.__min, controller.__max, controller.__step] + }); + newController.name(oldName); + if (wasListening) newController.listen(); + return newController; + } + return returned; + }; + controller.min = Common.compose(r, controller.min); + controller.max = Common.compose(r, controller.max); + } else if (controller instanceof BooleanController) { + dom.bind(li, 'click', function () { + dom.fakeEvent(controller.__checkbox, 'click'); + }); + dom.bind(controller.__checkbox, 'click', function (e) { + e.stopPropagation(); + }); + } else if (controller instanceof FunctionController) { + dom.bind(li, 'click', function () { + dom.fakeEvent(controller.__button, 'click'); + }); + dom.bind(li, 'mouseover', function () { + dom.addClass(controller.__button, 'hover'); + }); + dom.bind(li, 'mouseout', function () { + dom.removeClass(controller.__button, 'hover'); + }); + } else if (controller instanceof ColorController) { + dom.addClass(li, 'color'); + controller.updateDisplay = Common.compose(function (val) { + li.style.borderLeftColor = controller.__color.toString(); + return val; + }, controller.updateDisplay); + controller.updateDisplay(); + } + controller.setValue = Common.compose(function (val) { + if (gui.getRoot().__preset_select && controller.isModified()) { + markPresetModified(gui.getRoot(), true); + } + return val; + }, controller.setValue); +} +function recallSavedValue(gui, controller) { + var root = gui.getRoot(); + var matchedIndex = root.__rememberedObjects.indexOf(controller.object); + if (matchedIndex !== -1) { + var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex]; + if (controllerMap === undefined) { + controllerMap = {}; + root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap; + } + controllerMap[controller.property] = controller; + if (root.load && root.load.remembered) { + var presetMap = root.load.remembered; + var preset = void 0; + if (presetMap[gui.preset]) { + preset = presetMap[gui.preset]; + } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) { + preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME]; + } else { + return; + } + if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) { + var value = preset[matchedIndex][controller.property]; + controller.initialValue = value; + controller.setValue(value); + } + } + } +} +function _add(gui, object, property, params) { + if (object[property] === undefined) { + throw new Error('Object "' + object + '" has no property "' + property + '"'); + } + var controller = void 0; + if (params.color) { + controller = new ColorController(object, property); + } else { + var factoryArgs = [object, property].concat(params.factoryArgs); + controller = ControllerFactory.apply(gui, factoryArgs); + } + if (params.before instanceof Controller) { + params.before = params.before.__li; + } + recallSavedValue(gui, controller); + dom.addClass(controller.domElement, 'c'); + var name = document.createElement('span'); + dom.addClass(name, 'property-name'); + name.innerHTML = controller.property; + var container = document.createElement('div'); + container.appendChild(name); + container.appendChild(controller.domElement); + var li = addRow(gui, container, params.before); + dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); + if (controller instanceof ColorController) { + dom.addClass(li, 'color'); + } else { + dom.addClass(li, _typeof(controller.getValue())); + } + augmentController(gui, li, controller); + gui.__controllers.push(controller); + return controller; +} +function getLocalStorageHash(gui, key) { + return document.location.href + '.' + key; +} +function addPresetOption(gui, name, setSelected) { + var opt = document.createElement('option'); + opt.innerHTML = name; + opt.value = name; + gui.__preset_select.appendChild(opt); + if (setSelected) { + gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; + } +} +function showHideExplain(gui, explain) { + explain.style.display = gui.useLocalStorage ? 'block' : 'none'; +} +function addSaveMenu(gui) { + var div = gui.__save_row = document.createElement('li'); + dom.addClass(gui.domElement, 'has-save'); + gui.__ul.insertBefore(div, gui.__ul.firstChild); + dom.addClass(div, 'save-row'); + var gears = document.createElement('span'); + gears.innerHTML = ' '; + dom.addClass(gears, 'button gears'); + var button = document.createElement('span'); + button.innerHTML = 'Save'; + dom.addClass(button, 'button'); + dom.addClass(button, 'save'); + var button2 = document.createElement('span'); + button2.innerHTML = 'New'; + dom.addClass(button2, 'button'); + dom.addClass(button2, 'save-as'); + var button3 = document.createElement('span'); + button3.innerHTML = 'Revert'; + dom.addClass(button3, 'button'); + dom.addClass(button3, 'revert'); + var select = gui.__preset_select = document.createElement('select'); + if (gui.load && gui.load.remembered) { + Common.each(gui.load.remembered, function (value, key) { + addPresetOption(gui, key, key === gui.preset); + }); + } else { + addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); + } + dom.bind(select, 'change', function () { + for (var index = 0; index < gui.__preset_select.length; index++) { + gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; + } + gui.preset = this.value; + }); + div.appendChild(select); + div.appendChild(gears); + div.appendChild(button); + div.appendChild(button2); + div.appendChild(button3); + if (SUPPORTS_LOCAL_STORAGE) { + var explain = document.getElementById('dg-local-explain'); + var localStorageCheckBox = document.getElementById('dg-local-storage'); + var saveLocally = document.getElementById('dg-save-locally'); + saveLocally.style.display = 'block'; + if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { + localStorageCheckBox.setAttribute('checked', 'checked'); + } + showHideExplain(gui, explain); + dom.bind(localStorageCheckBox, 'change', function () { + gui.useLocalStorage = !gui.useLocalStorage; + showHideExplain(gui, explain); + }); + } + var newConstructorTextArea = document.getElementById('dg-new-constructor'); + dom.bind(newConstructorTextArea, 'keydown', function (e) { + if (e.metaKey && (e.which === 67 || e.keyCode === 67)) { + SAVE_DIALOGUE.hide(); + } + }); + dom.bind(gears, 'click', function () { + newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); + SAVE_DIALOGUE.show(); + newConstructorTextArea.focus(); + newConstructorTextArea.select(); + }); + dom.bind(button, 'click', function () { + gui.save(); + }); + dom.bind(button2, 'click', function () { + var presetName = prompt('Enter a new preset name.'); + if (presetName) { + gui.saveAs(presetName); + } + }); + dom.bind(button3, 'click', function () { + gui.revert(); + }); +} +function addResizeHandle(gui) { + var pmouseX = void 0; + gui.__resize_handle = document.createElement('div'); + Common.extend(gui.__resize_handle.style, { + width: '6px', + marginLeft: '-3px', + height: '200px', + cursor: 'ew-resize', + position: 'absolute' + }); + function drag(e) { + e.preventDefault(); + gui.width += pmouseX - e.clientX; + gui.onResize(); + pmouseX = e.clientX; + return false; + } + function dragStop() { + dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.unbind(window, 'mousemove', drag); + dom.unbind(window, 'mouseup', dragStop); + } + function dragStart(e) { + e.preventDefault(); + pmouseX = e.clientX; + dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.bind(window, 'mousemove', drag); + dom.bind(window, 'mouseup', dragStop); + return false; + } + dom.bind(gui.__resize_handle, 'mousedown', dragStart); + dom.bind(gui.__closeButton, 'mousedown', dragStart); + gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); +} +function setWidth(gui, w) { + gui.domElement.style.width = w + 'px'; + if (gui.__save_row && gui.autoPlace) { + gui.__save_row.style.width = w + 'px'; + } + if (gui.__closeButton) { + gui.__closeButton.style.width = w + 'px'; + } +} +function getCurrentPreset(gui, useInitialValues) { + var toReturn = {}; + Common.each(gui.__rememberedObjects, function (val, index) { + var savedValues = {}; + var controllerMap = gui.__rememberedObjectIndecesToControllers[index]; + Common.each(controllerMap, function (controller, property) { + savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue(); + }); + toReturn[index] = savedValues; + }); + return toReturn; +} +function setPresetSelectIndex(gui) { + for (var index = 0; index < gui.__preset_select.length; index++) { + if (gui.__preset_select[index].value === gui.preset) { + gui.__preset_select.selectedIndex = index; + } + } +} +function updateDisplays(controllerArray) { + if (controllerArray.length !== 0) { + requestAnimationFrame$1.call(window, function () { + updateDisplays(controllerArray); + }); + } + Common.each(controllerArray, function (c) { + c.updateDisplay(); + }); +} + +var color = { + Color: Color, + math: ColorMath, + interpret: interpret +}; +var controllers = { + Controller: Controller, + BooleanController: BooleanController, + OptionController: OptionController, + StringController: StringController, + NumberController: NumberController, + NumberControllerBox: NumberControllerBox, + NumberControllerSlider: NumberControllerSlider, + FunctionController: FunctionController, + ColorController: ColorController +}; +var dom$1 = { dom: dom }; +var gui = { GUI: GUI }; +var GUI$1 = GUI; +var index = { + color: color, + controllers: controllers, + dom: dom$1, + gui: gui, + GUI: GUI$1 +}; + +exports.color = color; +exports.controllers = controllers; +exports.dom = dom$1; +exports.gui = gui; +exports.GUI = GUI$1; +exports['default'] = index; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); + + +},{}],"loadScript":[function(require,module,exports){ +// Add some Javascript code here, to run on the front end. + +console.log("Welcome to assignment 3!") + +// const submit = function( e ) { +// // prevent default form action from being carried out +// e.preventDefault() +// +// const video = document.querySelector( '#ytvid' ), +// json = { url: video.value }, +// body = JSON.stringify( json ) +// +// fetch( '/submit', { +// method:'POST', +// body +// }) +// .then( function( response ) { +// // do something with the reponse +// console.log( response ) +// response.text().then(function(text){ +// console.log(text) +// setCookie(inputName.value, text, 1); +// let jOBJ = JSON.parse(text) +// alert("congrats! you are a "+jOBJ['horoscope']+" in the year of the "+jOBJ['zodiac']+"!") +// //cookie is set to the table value stored in the temporary server, now cached for a day +// }) +// }) +// } + + +const submit = function( e ) { + + console.log('button pressed') + let audioContext = null + let audioIntervalId = null + // Create an AudioContext for output + if (audioContext) { + audioContext.close() + clearInterval(audioIntervalId) + } + audioContext = new AudioContext() + const bufferSource = audioContext.createBufferSource() + // const resonanceAudio = new ResonanceAudio(audioContext) + // resonanceAudio.output.connect(audioContext.destination) + + // Open an XMLHttpRequest to stream audio data from YouTube + const videoUrl = document.querySelector( '#ytvid' ).value; + let videoId = '' + try { + videoId = videoUrl.split('=')[1] + } catch (error) { + // eslint-disable-next-line no-console + console.log('failed to split video url. try again.') + return + } + const request = new XMLHttpRequest() + request.open('POST', `/stream/${videoId}`, true) + request.responseType = 'arraybuffer' + + request.onload = function() { + console.log('starting audio decode') + // Decode the arraybuffer from the XMLHttpRequest + + audioContext.decodeAudioData(request.response, buffer => { + // Connect the audio buffer to the AudioContext for output + // console.log('about to start buffer') + bufferSource.buffer = buffer + bufferSource.connect(audioContext.destination) + bufferSource.start(0) + // console.log('buffer started') + }, error => { + alert('Unable to process audio stream') + console.error(error) + }) + } + + request.send() + return false +} + + +modules.exports = { submit } + +},{}],"myGui":[function(require,module,exports){ +const dat = require('dat.gui'); + +const loadGUI = function() { + var text = new FizzyText(); + var gui = new dat.GUI({ + height : 5 * 32 - 1 +}); + gui.add(text, 'message'); + gui.add(text, 'speed', -5, 5); + gui.add(text, 'displayOutline'); + gui.add(text, 'explode'); +} + +// let FizzyText = function() { +// this.message = 'dat.gui'; +// this.speed = 0.8; +// this.displayOutline = false; +// this.explode = function() { alert('Bang!'); }; +// // Define render logic ... +// } + +modules.exports = { loadGUI }; + +},{"dat.gui":"dat.gui"}]},{},[]); diff --git a/public/index.html b/public/index.html index 9fd15520a..e693009e8 100644 --- a/public/index.html +++ b/public/index.html @@ -14,7 +14,7 @@ - + - - + creative coding -- a4-hcaouette -- CS4241 Assignment 4 - + +
        From ede3a55cf0c126ea494199216b47a8812c9c878e Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 22:54:10 -0400 Subject: [PATCH 41/54] modules hard --- public/index.html | 13 ++++++------- public/js/myGui.js | 2 +- public/js/scripts.js | 28 +--------------------------- 3 files changed, 8 insertions(+), 35 deletions(-) diff --git a/public/index.html b/public/index.html index f7b6cdfda..66b41c8b3 100644 --- a/public/index.html +++ b/public/index.html @@ -14,18 +14,17 @@ - - + + creative coding -- a4-hcaouette -- CS4241 Assignment 4 -
        diff --git a/public/js/myGui.js b/public/js/myGui.js index b7bfc38be..217880beb 100644 --- a/public/js/myGui.js +++ b/public/js/myGui.js @@ -1,6 +1,6 @@ const dat = require('dat.gui'); -const loadGUI = function() { +function loadGUI() { var text = new FizzyText(); var gui = new dat.GUI({ height : 5 * 32 - 1 diff --git a/public/js/scripts.js b/public/js/scripts.js index e1d7d958c..7752c3028 100644 --- a/public/js/scripts.js +++ b/public/js/scripts.js @@ -2,33 +2,7 @@ console.log("Welcome to assignment 3!") -// const submit = function( e ) { -// // prevent default form action from being carried out -// e.preventDefault() -// -// const video = document.querySelector( '#ytvid' ), -// json = { url: video.value }, -// body = JSON.stringify( json ) -// -// fetch( '/submit', { -// method:'POST', -// body -// }) -// .then( function( response ) { -// // do something with the reponse -// console.log( response ) -// response.text().then(function(text){ -// console.log(text) -// setCookie(inputName.value, text, 1); -// let jOBJ = JSON.parse(text) -// alert("congrats! you are a "+jOBJ['horoscope']+" in the year of the "+jOBJ['zodiac']+"!") -// //cookie is set to the table value stored in the temporary server, now cached for a day -// }) -// }) -// } - - -const submit = function( e ) { +function submit( e ) { console.log('button pressed') let audioContext = null From 3a4e509a5d75a321a86a731b4311f155c909315d Mon Sep 17 00:00:00 2001 From: Hunter Date: Sun, 29 Sep 2019 23:14:56 -0400 Subject: [PATCH 42/54] packages & audio work now --- bundle.js | 54 +++------- index.js | 23 ++++- package-lock.json | 237 +++++++++++++++++++++++++++++++++---------- package.json | 2 +- public/index.html | 6 +- public/js/myGui.js | 18 ++-- public/js/scripts.js | 2 +- 7 files changed, 229 insertions(+), 113 deletions(-) diff --git a/bundle.js b/bundle.js index e68fa45d1..cb001ff7d 100644 --- a/bundle.js +++ b/bundle.js @@ -1,4 +1,4 @@ -require=(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i res.sendFile(public/index.html)) +const sendFile = function( response, filename ) { + const type = mime.getType( filename ); + fs.readFile( filename, function( err, content ) { + if ( err === null ) { + response.writeHeader( 200, {'Content-Type': type}); + response.end( content ); + } else { + response.writeHeader( 404 ); + response.end( '404 Error: File Not Found' ); + } + }); +}; +app.get(('/' || '/index.html'), (req, res) => res.sendFile('public/index.html')) + +app.get('/bundle.js', function(req, res){ + sendFile(res, "./bundle.js"); +}) app.post('/stream/:videoId', (request, response) => { console.log("received video process request") diff --git a/package-lock.json b/package-lock.json index 231847a47..8b08f4dec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, "requires": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -25,12 +26,14 @@ "acorn": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "dev": true }, "acorn-node": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, "requires": { "acorn": "^7.0.0", "acorn-walk": "^7.0.0", @@ -40,7 +43,8 @@ "acorn-walk": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz", - "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==" + "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==", + "dev": true }, "ansi-styles": { "version": "3.2.1", @@ -59,6 +63,7 @@ "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -69,6 +74,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, "requires": { "object-assign": "^4.1.1", "util": "0.10.3" @@ -77,12 +83,14 @@ "inherits": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, "requires": { "inherits": "2.0.1" } @@ -97,7 +105,8 @@ "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true }, "base64url": { "version": "3.0.1", @@ -115,7 +124,8 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true }, "body-parser": { "version": "1.19.0", @@ -151,12 +161,14 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true }, "browser-pack": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, "requires": { "JSONStream": "^1.0.3", "combine-source-map": "~0.8.0", @@ -170,6 +182,7 @@ "version": "1.11.3", "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, "requires": { "resolve": "1.1.7" }, @@ -177,7 +190,8 @@ "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true } } }, @@ -185,6 +199,7 @@ "version": "16.5.0", "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.0.tgz", "integrity": "sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw==", + "dev": true, "requires": { "JSONStream": "^1.0.3", "assert": "^1.4.0", @@ -240,6 +255,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -253,6 +269,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -263,6 +280,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -274,6 +292,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, "requires": { "bn.js": "^4.1.0", "randombytes": "^2.0.1" @@ -283,6 +302,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, "requires": { "bn.js": "^4.1.1", "browserify-rsa": "^4.0.0", @@ -297,6 +317,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, "requires": { "pako": "~1.0.5" } @@ -305,6 +326,7 @@ "version": "5.4.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "dev": true, "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4" @@ -313,17 +335,20 @@ "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true }, "bytes": { "version": "3.1.0", @@ -333,7 +358,8 @@ "cached-path-relative": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", - "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==" + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", + "dev": true }, "camelize": { "version": "1.0.0", @@ -354,6 +380,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -376,6 +403,7 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "dev": true, "requires": { "convert-source-map": "~1.1.0", "inline-source-map": "~0.6.0", @@ -421,6 +449,7 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -432,6 +461,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, "requires": { "date-now": "^0.1.4" } @@ -439,7 +469,8 @@ "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true }, "content-disposition": { "version": "0.5.3", @@ -462,7 +493,8 @@ "convert-source-map": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true }, "cookie": { "version": "0.3.1", @@ -505,12 +537,14 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, "requires": { "bn.js": "^4.1.0", "elliptic": "^6.0.0" @@ -520,6 +554,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -532,6 +567,7 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -557,6 +593,7 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -574,7 +611,8 @@ "dash-ast": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", + "dev": true }, "dasherize": { "version": "2.0.0", @@ -589,7 +627,8 @@ "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true }, "debug": { "version": "2.6.9", @@ -610,7 +649,8 @@ "defined": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true }, "depd": { "version": "1.1.2", @@ -621,6 +661,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", + "dev": true, "requires": { "JSONStream": "^1.0.3", "shasum": "^1.0.0", @@ -632,6 +673,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -646,6 +688,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, "requires": { "acorn-node": "^1.6.1", "defined": "^1.0.0", @@ -656,6 +699,7 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -670,7 +714,8 @@ "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true }, "dont-sniff-mimetype": { "version": "1.1.0", @@ -681,6 +726,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, "requires": { "readable-stream": "^2.0.2" } @@ -694,6 +740,7 @@ "version": "6.5.1", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "dev": true, "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", @@ -762,12 +809,14 @@ "events": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==" + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", + "dev": true }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -881,7 +930,8 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "function-bind": { "version": "1.1.1", @@ -891,12 +941,14 @@ "get-assigned-identifiers": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true }, "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -933,6 +985,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -942,6 +995,7 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -1001,6 +1055,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -1040,7 +1095,8 @@ "htmlescape": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", + "dev": true }, "http-errors": { "version": "1.7.2", @@ -1057,7 +1113,8 @@ "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true }, "iconv-lite": { "version": "0.4.24", @@ -1070,7 +1127,8 @@ "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true }, "ienoopen": { "version": "1.1.0", @@ -1081,6 +1139,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -1095,6 +1154,7 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dev": true, "requires": { "source-map": "~0.5.3" } @@ -1103,6 +1163,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", + "dev": true, "requires": { "JSONStream": "^1.0.3", "acorn-node": "^1.5.2", @@ -1129,7 +1190,8 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, "is-callable": { "version": "1.1.4", @@ -1165,7 +1227,8 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isexe": { "version": "2.0.0", @@ -1181,6 +1244,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "dev": true, "requires": { "jsonify": "~0.0.0" } @@ -1188,12 +1252,14 @@ "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true }, "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true }, "keygrip": { "version": "1.0.3", @@ -1204,6 +1270,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dev": true, "requires": { "inherits": "^2.0.1", "stream-splicer": "^2.0.0" @@ -1228,7 +1295,8 @@ "lodash.memoize": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true }, "lowdb": { "version": "1.0.0", @@ -1255,6 +1323,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -1285,6 +1354,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -1316,12 +1386,14 @@ "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true }, "minimatch": { "version": "3.0.4", @@ -1334,12 +1406,14 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" }, @@ -1347,7 +1421,8 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true } } }, @@ -1355,6 +1430,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.1.tgz", "integrity": "sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A==", + "dev": true, "requires": { "JSONStream": "^1.0.3", "browser-resolve": "^1.7.0", @@ -1440,7 +1516,8 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true }, "object-inspect": { "version": "1.6.0", @@ -1469,6 +1546,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } @@ -1476,17 +1554,20 @@ "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true }, "pako": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true }, "parents": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "dev": true, "requires": { "path-platform": "~0.11.15" } @@ -1495,6 +1576,7 @@ "version": "5.1.5", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", @@ -1599,12 +1681,14 @@ "path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-key": { "version": "2.0.1", @@ -1619,7 +1703,8 @@ "path-platform": { "version": "0.11.15", "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=" + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", + "dev": true }, "path-to-regexp": { "version": "0.1.7", @@ -1643,6 +1728,7 @@ "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -1664,12 +1750,14 @@ "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, "proxy-addr": { "version": "2.0.5", @@ -1684,6 +1772,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -1696,7 +1785,8 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true }, "qs": { "version": "6.7.0", @@ -1706,12 +1796,14 @@ "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true }, "querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true }, "random-bytes": { "version": "1.0.0", @@ -1722,6 +1814,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -1730,6 +1823,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -1755,6 +1849,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "dev": true, "requires": { "readable-stream": "^2.0.2" } @@ -1773,6 +1868,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1787,6 +1883,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -1810,6 +1907,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -1911,6 +2009,7 @@ "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -1920,6 +2019,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "dev": true, "requires": { "json-stable-stringify": "~0.0.0", "sha.js": "~2.4.4" @@ -1946,12 +2046,14 @@ "simple-concat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", + "dev": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true }, "spdx-correct": { "version": "3.1.0", @@ -1998,6 +2100,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" @@ -2007,6 +2110,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, "requires": { "duplexer2": "~0.1.0", "readable-stream": "^2.0.2" @@ -2016,6 +2120,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz", "integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==", + "dev": true, "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", @@ -2027,6 +2132,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2039,6 +2145,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "dev": true, "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.2" @@ -2076,6 +2183,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "requires": { "safe-buffer": "~5.2.0" }, @@ -2083,7 +2191,8 @@ "safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true } } }, @@ -2096,6 +2205,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dev": true, "requires": { "minimist": "^1.1.0" } @@ -2112,6 +2222,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, "requires": { "acorn-node": "^1.2.0" } @@ -2119,12 +2230,14 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -2134,6 +2247,7 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "dev": true, "requires": { "process": "~0.11.0" } @@ -2146,7 +2260,8 @@ "tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true }, "type-is": { "version": "1.6.18", @@ -2160,7 +2275,8 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true }, "uid-safe": { "version": "2.1.5", @@ -2178,12 +2294,14 @@ "umd": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==" + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "dev": true }, "undeclared-identifiers": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dev": true, "requires": { "acorn-node": "^1.3.0", "dash-ast": "^1.0.0", @@ -2201,6 +2319,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, "requires": { "punycode": "1.3.2", "querystring": "0.2.0" @@ -2209,7 +2328,8 @@ "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true } } }, @@ -2217,6 +2337,7 @@ "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, "requires": { "inherits": "2.0.3" } @@ -2224,7 +2345,8 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "utils-merge": { "version": "1.0.1", @@ -2248,7 +2370,8 @@ "vm-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true }, "which": { "version": "1.3.1", @@ -2261,7 +2384,8 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "x-xss-protection": { "version": "1.3.0", @@ -2271,7 +2395,8 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true }, "ytdl-core": { "version": "0.29.7", diff --git a/package.json b/package.json index 4470dbd45..80cea2780 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "author": "Hunter Caouette", "scripts": { "start": "npm-run-all browserify startserver", - "browserify": "browserify -r ./public/js/myGui.js:myGui -r ./public/js/scripts.js:loadScript -o ./bundle.js", + "browserify": "browserify -r dat.gui:dat -r ./public/js/myGui.js:myGui -r ./public/js/scripts.js:loadScript -o ./bundle.js", "startserver": "node index.js" }, "dependencies": { diff --git a/public/index.html b/public/index.html index 66b41c8b3..ca543b4a8 100644 --- a/public/index.html +++ b/public/index.html @@ -14,7 +14,7 @@ - + --> diff --git a/public/js/myGui.js b/public/js/myGui.js index 217880beb..e93c6ee33 100644 --- a/public/js/myGui.js +++ b/public/js/myGui.js @@ -1,4 +1,4 @@ -const dat = require('dat.gui'); +const dat = require('dat'); function loadGUI() { var text = new FizzyText(); @@ -11,12 +11,12 @@ function loadGUI() { gui.add(text, 'explode'); } -// let FizzyText = function() { -// this.message = 'dat.gui'; -// this.speed = 0.8; -// this.displayOutline = false; -// this.explode = function() { alert('Bang!'); }; -// // Define render logic ... -// } +let FizzyText = function() { + this.message = 'dat.gui'; + this.speed = 0.8; + this.displayOutline = false; + this.explode = function() { alert('Bang!'); }; + // Define render logic ... +} -modules.exports = { loadGUI }; +module.exports = { loadGUI }; diff --git a/public/js/scripts.js b/public/js/scripts.js index 7752c3028..11b2dd85c 100644 --- a/public/js/scripts.js +++ b/public/js/scripts.js @@ -53,4 +53,4 @@ function submit( e ) { } -modules.exports = { submit } +module.exports = { submit } From ce2e6e14ba5f7ad1b0b74483d2dcf970d6d13df7 Mon Sep 17 00:00:00 2001 From: Hunter Date: Mon, 30 Sep 2019 00:22:46 -0400 Subject: [PATCH 43/54] breaking up the audio stream --- public/js/myGui.js | 2 +- public/js/scripts.js | 41 ++++++++++++++++++++++++++++------------- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/public/js/myGui.js b/public/js/myGui.js index e93c6ee33..9c77d2ab2 100644 --- a/public/js/myGui.js +++ b/public/js/myGui.js @@ -4,7 +4,7 @@ function loadGUI() { var text = new FizzyText(); var gui = new dat.GUI({ height : 5 * 32 - 1 -}); + }); gui.add(text, 'message'); gui.add(text, 'speed', -5, 5); gui.add(text, 'displayOutline'); diff --git a/public/js/scripts.js b/public/js/scripts.js index 11b2dd85c..c6afbeb24 100644 --- a/public/js/scripts.js +++ b/public/js/scripts.js @@ -1,21 +1,24 @@ -// Add some Javascript code here, to run on the front end. +const gui= require('myGui') console.log("Welcome to assignment 3!") -function submit( e ) { +let audioContext = null +let audioIntervalId = null +const bufferSource +var fft; //fft audio node +var samples = 128; +var setup = false; //indicate if audio is set up yet +function submit( e ) { console.log('button pressed') - let audioContext = null - let audioIntervalId = null + // Create an AudioContext for output if (audioContext) { audioContext.close() clearInterval(audioIntervalId) } audioContext = new AudioContext() - const bufferSource = audioContext.createBufferSource() - // const resonanceAudio = new ResonanceAudio(audioContext) - // resonanceAudio.output.connect(audioContext.destination) + bufferSource = audioContext.createBufferSource() // Open an XMLHttpRequest to stream audio data from YouTube const videoUrl = document.querySelector( '#ytvid' ).value; @@ -27,6 +30,7 @@ function submit( e ) { console.log('failed to split video url. try again.') return } + const request = new XMLHttpRequest() request.open('POST', `/stream/${videoId}`, true) request.responseType = 'arraybuffer' @@ -34,14 +38,11 @@ function submit( e ) { request.onload = function() { console.log('starting audio decode') // Decode the arraybuffer from the XMLHttpRequest - audioContext.decodeAudioData(request.response, buffer => { // Connect the audio buffer to the AudioContext for output - // console.log('about to start buffer') bufferSource.buffer = buffer - bufferSource.connect(audioContext.destination) - bufferSource.start(0) - // console.log('buffer started') + play() + }, error => { alert('Unable to process audio stream') console.error(error) @@ -52,5 +53,19 @@ function submit( e ) { return false } +function play(){ + if (!audioContext) { + return 0; + } + // var analyser = audioContext.createAnalyser() + // source = audioContext.createMediaStreamSource(stream); + // source.connect(analyser); + // analyser.connect(distortion); + // distortion.connect(audioContext.destination); + + bufferSource.connect(audioContext.destination) + bufferSource.start(0) +} + -module.exports = { submit } +module.exports = { submit, play } From 8e05b59680b772cdea6f02308776a3b6ee0f5b54 Mon Sep 17 00:00:00 2001 From: Hunter Date: Mon, 30 Sep 2019 00:27:59 -0400 Subject: [PATCH 44/54] globals need defs --- bundle.js | 45 +++++++++++++++++++++++++++++--------------- public/js/scripts.js | 10 +++++----- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/bundle.js b/bundle.js index cb001ff7d..63790a49a 100644 --- a/bundle.js +++ b/bundle.js @@ -2538,24 +2538,27 @@ Object.defineProperty(exports, '__esModule', { value: true }); },{}],"loadScript":[function(require,module,exports){ -// Add some Javascript code here, to run on the front end. +const gui= require('myGui') console.log("Welcome to assignment 3!") -function submit( e ) { +let audioContext = null +let audioIntervalId = null +const bufferSource = null +let fft = null //fft audio node +let samples = 128 +let setup = false //indicate if audio is set up yet +function submit( e ) { console.log('button pressed') - let audioContext = null - let audioIntervalId = null + // Create an AudioContext for output if (audioContext) { audioContext.close() clearInterval(audioIntervalId) } audioContext = new AudioContext() - const bufferSource = audioContext.createBufferSource() - // const resonanceAudio = new ResonanceAudio(audioContext) - // resonanceAudio.output.connect(audioContext.destination) + bufferSource = audioContext.createBufferSource() // Open an XMLHttpRequest to stream audio data from YouTube const videoUrl = document.querySelector( '#ytvid' ).value; @@ -2567,6 +2570,7 @@ function submit( e ) { console.log('failed to split video url. try again.') return } + const request = new XMLHttpRequest() request.open('POST', `/stream/${videoId}`, true) request.responseType = 'arraybuffer' @@ -2574,14 +2578,11 @@ function submit( e ) { request.onload = function() { console.log('starting audio decode') // Decode the arraybuffer from the XMLHttpRequest - audioContext.decodeAudioData(request.response, buffer => { // Connect the audio buffer to the AudioContext for output - // console.log('about to start buffer') bufferSource.buffer = buffer - bufferSource.connect(audioContext.destination) - bufferSource.start(0) - // console.log('buffer started') + play() + }, error => { alert('Unable to process audio stream') console.error(error) @@ -2592,17 +2593,31 @@ function submit( e ) { return false } +function play(){ + if (!audioContext) { + return 0 + } + // var analyser = audioContext.createAnalyser() + // source = audioContext.createMediaStreamSource(stream); + // source.connect(analyser); + // analyser.connect(distortion); + // distortion.connect(audioContext.destination); + + bufferSource.connect(audioContext.destination) + bufferSource.start(0) +} -module.exports = { submit } -},{}],"myGui":[function(require,module,exports){ +module.exports = { submit, play } + +},{"myGui":"myGui"}],"myGui":[function(require,module,exports){ const dat = require('dat'); function loadGUI() { var text = new FizzyText(); var gui = new dat.GUI({ height : 5 * 32 - 1 -}); + }); gui.add(text, 'message'); gui.add(text, 'speed', -5, 5); gui.add(text, 'displayOutline'); diff --git a/public/js/scripts.js b/public/js/scripts.js index c6afbeb24..28e63b47f 100644 --- a/public/js/scripts.js +++ b/public/js/scripts.js @@ -4,10 +4,10 @@ console.log("Welcome to assignment 3!") let audioContext = null let audioIntervalId = null -const bufferSource -var fft; //fft audio node -var samples = 128; -var setup = false; //indicate if audio is set up yet +const bufferSource = null +let fft = null //fft audio node +let samples = 128 +let setup = false //indicate if audio is set up yet function submit( e ) { console.log('button pressed') @@ -55,7 +55,7 @@ function submit( e ) { function play(){ if (!audioContext) { - return 0; + return 0 } // var analyser = audioContext.createAnalyser() // source = audioContext.createMediaStreamSource(stream); From e0f2e19e6545cea441757e3b227a1e9ac9c0030c Mon Sep 17 00:00:00 2001 From: Hunter Date: Mon, 30 Sep 2019 00:30:47 -0400 Subject: [PATCH 45/54] const->let --- public/js/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/js/scripts.js b/public/js/scripts.js index 28e63b47f..8bcd5c053 100644 --- a/public/js/scripts.js +++ b/public/js/scripts.js @@ -4,7 +4,7 @@ console.log("Welcome to assignment 3!") let audioContext = null let audioIntervalId = null -const bufferSource = null +let bufferSource = null let fft = null //fft audio node let samples = 128 let setup = false //indicate if audio is set up yet From 7e73694f9c3b775b93f25cd6fdab5c353d458aa4 Mon Sep 17 00:00:00 2001 From: Hunter Date: Mon, 30 Sep 2019 00:31:08 -0400 Subject: [PATCH 46/54] and the bundle, too --- bundle.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundle.js b/bundle.js index 63790a49a..0d6c44537 100644 --- a/bundle.js +++ b/bundle.js @@ -2544,7 +2544,7 @@ console.log("Welcome to assignment 3!") let audioContext = null let audioIntervalId = null -const bufferSource = null +let bufferSource = null let fft = null //fft audio node let samples = 128 let setup = false //indicate if audio is set up yet From 8a838ee87a099b108ebfa6bc0c34ccbd0ec21663 Mon Sep 17 00:00:00 2001 From: Hunter Date: Mon, 30 Sep 2019 00:41:47 -0400 Subject: [PATCH 47/54] drawing? --- bundle.js | 43 +++++++++++++++++++++++++++++++------------ public/index.html | 23 ----------------------- public/js/scripts.js | 43 +++++++++++++++++++++++++++++++------------ 3 files changed, 62 insertions(+), 47 deletions(-) diff --git a/bundle.js b/bundle.js index 0d6c44537..4e1e1949c 100644 --- a/bundle.js +++ b/bundle.js @@ -2551,7 +2551,6 @@ let setup = false //indicate if audio is set up yet function submit( e ) { console.log('button pressed') - // Create an AudioContext for output if (audioContext) { audioContext.close() @@ -2559,7 +2558,6 @@ function submit( e ) { } audioContext = new AudioContext() bufferSource = audioContext.createBufferSource() - // Open an XMLHttpRequest to stream audio data from YouTube const videoUrl = document.querySelector( '#ytvid' ).value; let videoId = '' @@ -2570,11 +2568,9 @@ function submit( e ) { console.log('failed to split video url. try again.') return } - const request = new XMLHttpRequest() request.open('POST', `/stream/${videoId}`, true) request.responseType = 'arraybuffer' - request.onload = function() { console.log('starting audio decode') // Decode the arraybuffer from the XMLHttpRequest @@ -2582,13 +2578,11 @@ function submit( e ) { // Connect the audio buffer to the AudioContext for output bufferSource.buffer = buffer play() - }, error => { alert('Unable to process audio stream') console.error(error) }) } - request.send() return false } @@ -2597,14 +2591,39 @@ function play(){ if (!audioContext) { return 0 } - // var analyser = audioContext.createAnalyser() - // source = audioContext.createMediaStreamSource(stream); - // source.connect(analyser); - // analyser.connect(distortion); - // distortion.connect(audioContext.destination); + //create fft + fft = audioContext.createAnalyser(); + fft.fftSize = samples; + + //connect them up into a chain + bufferSource.connect(fft); + fft.connect(audioContext.destination); - bufferSource.connect(audioContext.destination) bufferSource.start(0) + setup = true +} + +var gfx; +function setupCanvas() { + var canvas = document.getElementById('canvas'); + gfx = canvas.getContext('2d'); + webkitRequestAnimationFrame(update); +} + +function update() { + webkitRequestAnimationFrame(update); + if(!setup) return; + gfx.clearRect(0,0,800,600); + gfx.fillStyle = 'gray'; + gfx.fillRect(0,0,800,600); + + var data = new Uint8Array(samples); + fft.getByteFrequencyData(data); + gfx.fillStyle = 'red'; + for(var i=0; iEnter YouTube URL
        - - -
        diff --git a/public/js/scripts.js b/public/js/scripts.js index 8bcd5c053..17f9c7843 100644 --- a/public/js/scripts.js +++ b/public/js/scripts.js @@ -11,7 +11,6 @@ let setup = false //indicate if audio is set up yet function submit( e ) { console.log('button pressed') - // Create an AudioContext for output if (audioContext) { audioContext.close() @@ -19,7 +18,6 @@ function submit( e ) { } audioContext = new AudioContext() bufferSource = audioContext.createBufferSource() - // Open an XMLHttpRequest to stream audio data from YouTube const videoUrl = document.querySelector( '#ytvid' ).value; let videoId = '' @@ -30,11 +28,9 @@ function submit( e ) { console.log('failed to split video url. try again.') return } - const request = new XMLHttpRequest() request.open('POST', `/stream/${videoId}`, true) request.responseType = 'arraybuffer' - request.onload = function() { console.log('starting audio decode') // Decode the arraybuffer from the XMLHttpRequest @@ -42,13 +38,11 @@ function submit( e ) { // Connect the audio buffer to the AudioContext for output bufferSource.buffer = buffer play() - }, error => { alert('Unable to process audio stream') console.error(error) }) } - request.send() return false } @@ -57,14 +51,39 @@ function play(){ if (!audioContext) { return 0 } - // var analyser = audioContext.createAnalyser() - // source = audioContext.createMediaStreamSource(stream); - // source.connect(analyser); - // analyser.connect(distortion); - // distortion.connect(audioContext.destination); + //create fft + fft = audioContext.createAnalyser(); + fft.fftSize = samples; + + //connect them up into a chain + bufferSource.connect(fft); + fft.connect(audioContext.destination); - bufferSource.connect(audioContext.destination) bufferSource.start(0) + setup = true +} + +var gfx; +function setupCanvas() { + var canvas = document.getElementById('canvas'); + gfx = canvas.getContext('2d'); + webkitRequestAnimationFrame(update); +} + +function update() { + webkitRequestAnimationFrame(update); + if(!setup) return; + gfx.clearRect(0,0,800,600); + gfx.fillStyle = 'gray'; + gfx.fillRect(0,0,800,600); + + var data = new Uint8Array(samples); + fft.getByteFrequencyData(data); + gfx.fillStyle = 'red'; + for(var i=0; i Date: Mon, 30 Sep 2019 01:20:01 -0400 Subject: [PATCH 48/54] script calling canvas methods --- bundle.js | 8 ++++++-- public/js/scripts.js | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/bundle.js b/bundle.js index 4e1e1949c..5fbcfcbbe 100644 --- a/bundle.js +++ b/bundle.js @@ -2577,7 +2577,9 @@ function submit( e ) { audioContext.decodeAudioData(request.response, buffer => { // Connect the audio buffer to the AudioContext for output bufferSource.buffer = buffer + setupCanvas() play() + }, error => { alert('Unable to process audio stream') console.error(error) @@ -2605,13 +2607,15 @@ function play(){ var gfx; function setupCanvas() { + console.log('called setup') var canvas = document.getElementById('canvas'); gfx = canvas.getContext('2d'); - webkitRequestAnimationFrame(update); + window.RequestAnimationFrame(update); } function update() { - webkitRequestAnimationFrame(update); + console.log('called update') + window.RequestAnimationFrame(update); if(!setup) return; gfx.clearRect(0,0,800,600); gfx.fillStyle = 'gray'; diff --git a/public/js/scripts.js b/public/js/scripts.js index 17f9c7843..ff2ce3bb3 100644 --- a/public/js/scripts.js +++ b/public/js/scripts.js @@ -37,7 +37,9 @@ function submit( e ) { audioContext.decodeAudioData(request.response, buffer => { // Connect the audio buffer to the AudioContext for output bufferSource.buffer = buffer + setupCanvas() play() + }, error => { alert('Unable to process audio stream') console.error(error) @@ -65,13 +67,15 @@ function play(){ var gfx; function setupCanvas() { + console.log('called setup') var canvas = document.getElementById('canvas'); gfx = canvas.getContext('2d'); - webkitRequestAnimationFrame(update); + window.RequestAnimationFrame(update); } function update() { - webkitRequestAnimationFrame(update); + console.log('called update') + window.RequestAnimationFrame(update); if(!setup) return; gfx.clearRect(0,0,800,600); gfx.fillStyle = 'gray'; From c1216fa2a7f53522f4450f52c54d51776576c65a Mon Sep 17 00:00:00 2001 From: Hunter Date: Mon, 30 Sep 2019 03:19:39 -0400 Subject: [PATCH 49/54] lovin it --- bundle.js | 114 ++++++++++++++++++++++++++++++++----------- public/css/style.css | 13 ++--- public/index.html | 11 ++--- public/js/myGui.js | 33 +++++++------ public/js/scripts.js | 81 +++++++++++++++++++++++++----- 5 files changed, 179 insertions(+), 73 deletions(-) diff --git a/bundle.js b/bundle.js index 5fbcfcbbe..040520dd3 100644 --- a/bundle.js +++ b/bundle.js @@ -2605,55 +2605,113 @@ function play(){ setup = true } +let gProps = { + style: 2, + R: 255, + G: 0, + B: 0, + thiqness: 15, + height: 100, + spread: 4 +} + var gfx; function setupCanvas() { - console.log('called setup') var canvas = document.getElementById('canvas'); gfx = canvas.getContext('2d'); - window.RequestAnimationFrame(update); + window.requestAnimationFrame(update); + + gui.loadGUI(gProps) +} + + +function update(){ + if(gProps.style === 1){ + sinDraw() + }else{ + barDraw() + } } -function update() { - console.log('called update') - window.RequestAnimationFrame(update); +function sinDraw(){ + fft.fftSize = 2048 + var bufferLength = fft.frequencyBinCount + var dataArray = new Uint8Array(bufferLength) + gfx.clearRect(0, 0, 800, 600) + + function draw() { + let drawVisual = requestAnimationFrame(draw) + fft.getByteTimeDomainData(dataArray) + gfx.fillStyle = 'rgb(' + (255- gProps.R) + ', ' + (255- gProps.G) + ', '+ (255- gProps.B) + ')' + gfx.fillRect(0, 0, 800, 600) + gfx.lineWidth = 2 + gfx.strokeStyle = 'rgb(' + gProps.R + ', ' + gProps.G + ', '+gProps.B + ')' + gfx.beginPath() + let sliceWidth = 800 * 1.0 / bufferLength; + let x = 0; + for(let i = 0; i < bufferLength; i++) { + + let v = dataArray[i] / 128.0; + let y = v * 600/2; + + if(i === 0) { + gfx.moveTo(x, y); + } else { + gfx.lineTo(x, y); + } + + x += sliceWidth; + } + gfx.lineTo(canvas.width, canvas.height/2); + gfx.stroke(); + } + //start + draw() +} + + +function barDraw() { + window.requestAnimationFrame(update); if(!setup) return; - gfx.clearRect(0,0,800,600); - gfx.fillStyle = 'gray'; - gfx.fillRect(0,0,800,600); + gfx.clearRect(0,0,1000,800); + gfx.fillStyle = 'rgb(' + (255- gProps.R) + ', ' + (255- gProps.G) + ', '+ (255- gProps.B) + ')'; + gfx.fillRect(0,0,1000,800); var data = new Uint8Array(samples); fft.getByteFrequencyData(data); - gfx.fillStyle = 'red'; + gfx.fillStyle = 'rgb(' + gProps.R + ', ' + gProps.G + ', '+gProps.B + ')'; for(var i=0; i const myGui = require('myGui') const loadScript = require('loadScript') - window.onload=function(){myGui.loadGUI()} + //this will set up the canvas to refresh + //AND load the gui w/ the gProps obj in scripts.js + // window.onload=function(){loadScript.setupCanvas()} @@ -40,19 +42,14 @@
        - -
        - -
        +
        diff --git a/public/js/myGui.js b/public/js/myGui.js index 9c77d2ab2..452c41b26 100644 --- a/public/js/myGui.js +++ b/public/js/myGui.js @@ -1,22 +1,23 @@ const dat = require('dat'); -function loadGUI() { - var text = new FizzyText(); - var gui = new dat.GUI({ - height : 5 * 32 - 1 - }); - gui.add(text, 'message'); - gui.add(text, 'speed', -5, 5); - gui.add(text, 'displayOutline'); - gui.add(text, 'explode'); +function loadGUI(obj) { + var props = obj; + var gui = new dat.GUI() + gui.add(props, 'style', 1, 2); + gui.add(props, 'R', 0, 255); + gui.add(props, 'G', 0, 255); + gui.add(props, 'B', 0, 255); + gui.add(props, 'thiqness', 0, 50); + gui.add(props, 'height', -150, 150); + gui.add(props, 'spread', 0, 10); } -let FizzyText = function() { - this.message = 'dat.gui'; - this.speed = 0.8; - this.displayOutline = false; - this.explode = function() { alert('Bang!'); }; - // Define render logic ... -} +// let FizzyText = function() { +// this.message = 'dat.gui'; +// this.speed = 0.8; +// this.displayOutline = false; +// this.explode = function() { alert('Bang!'); }; +// // Define render logic ... +// } module.exports = { loadGUI }; diff --git a/public/js/scripts.js b/public/js/scripts.js index ff2ce3bb3..b52dd89c0 100644 --- a/public/js/scripts.js +++ b/public/js/scripts.js @@ -65,30 +65,87 @@ function play(){ setup = true } +let gProps = { + style: 2, + R: 255, + G: 0, + B: 0, + thiqness: 15, + height: 100, + spread: 4 +} + var gfx; function setupCanvas() { - console.log('called setup') var canvas = document.getElementById('canvas'); gfx = canvas.getContext('2d'); - window.RequestAnimationFrame(update); + window.requestAnimationFrame(update); + + gui.loadGUI(gProps) +} + + +function update(){ + if(gProps.style === 1){ + sinDraw() + }else{ + barDraw() + } +} + +function sinDraw(){ + fft.fftSize = 2048 + var bufferLength = fft.frequencyBinCount + var dataArray = new Uint8Array(bufferLength) + gfx.clearRect(0, 0, 800, 600) + + function draw() { + let drawVisual = requestAnimationFrame(draw) + fft.getByteTimeDomainData(dataArray) + gfx.fillStyle = 'rgb(' + (255- gProps.R) + ', ' + (255- gProps.G) + ', '+ (255- gProps.B) + ')' + gfx.fillRect(0, 0, 800, 600) + gfx.lineWidth = 2 + gfx.strokeStyle = 'rgb(' + gProps.R + ', ' + gProps.G + ', '+gProps.B + ')' + gfx.beginPath() + let sliceWidth = 800 * 1.0 / bufferLength; + let x = 0; + for(let i = 0; i < bufferLength; i++) { + + let v = dataArray[i] / 128.0; + let y = v * 600/2; + + if(i === 0) { + gfx.moveTo(x, y); + } else { + gfx.lineTo(x, y); + } + + x += sliceWidth; + } + gfx.lineTo(canvas.width, canvas.height/2); + gfx.stroke(); + } + //start + draw() } -function update() { - console.log('called update') - window.RequestAnimationFrame(update); + +function barDraw() { + window.requestAnimationFrame(update); if(!setup) return; - gfx.clearRect(0,0,800,600); - gfx.fillStyle = 'gray'; - gfx.fillRect(0,0,800,600); + gfx.clearRect(0,0,1000,800); + gfx.fillStyle = 'rgb(' + (255- gProps.R) + ', ' + (255- gProps.G) + ', '+ (255- gProps.B) + ')'; + gfx.fillRect(0,0,1000,800); var data = new Uint8Array(samples); fft.getByteFrequencyData(data); - gfx.fillStyle = 'red'; + gfx.fillStyle = 'rgb(' + gProps.R + ', ' + gProps.G + ', '+gProps.B + ')'; for(var i=0; i Date: Mon, 30 Sep 2019 03:48:30 -0400 Subject: [PATCH 50/54] improved bar graph --- bundle.js | 51 +++++++++++++++++++++++++++----------------- public/js/myGui.js | 5 ++--- public/js/scripts.js | 46 +++++++++++++++++++++++++-------------- 3 files changed, 64 insertions(+), 38 deletions(-) diff --git a/bundle.js b/bundle.js index 040520dd3..7ee0603a4 100644 --- a/bundle.js +++ b/bundle.js @@ -2610,9 +2610,8 @@ let gProps = { R: 255, G: 0, B: 0, - thiqness: 15, - height: 100, - spread: 4 + thiqness: 3, + height: 5, } var gfx; @@ -2670,20 +2669,35 @@ function sinDraw(){ } -function barDraw() { - window.requestAnimationFrame(update); - if(!setup) return; - gfx.clearRect(0,0,1000,800); - gfx.fillStyle = 'rgb(' + (255- gProps.R) + ', ' + (255- gProps.G) + ', '+ (255- gProps.B) + ')'; - gfx.fillRect(0,0,1000,800); - - var data = new Uint8Array(samples); - fft.getByteFrequencyData(data); - gfx.fillStyle = 'rgb(' + gProps.R + ', ' + gProps.G + ', '+gProps.B + ')'; - for(var i=0; i Date: Mon, 30 Sep 2019 03:52:07 -0400 Subject: [PATCH 51/54] readme --- README.md | 69 ++++++++----------------------------------------------- 1 file changed, 10 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index 7f170cdb2..6692eb251 100755 --- a/README.md +++ b/README.md @@ -3,70 +3,21 @@ Assignment 4 - Creative Coding: Interactive Multimedia Experiences Due: September 27th, by 11:59 PM. -For this assignment we will focus on client-side development using popular audio/graphics/visualization technologies; the server requirements are minimal. The goal of this assignment is to refine our JavaScript knowledge while exploring the multimedia capabilities of the browser. +Professor Roberts gave me, Hunter Caouette, a penalty-free extension for the weekend. If you have any questions please reach out to me and/or Professor Roberts. -Baseline Requirements ---- -Your application is required to implement the following functionalities: +## creative coding -- a4-hcaouette -- CS4241 Assignment 4 -- A server created using Express (you can also use an alternative server framework such as Koa) for basic file delivery and middleware. Your middleware stack should include the `compression` and `helmet` [middlewares]((https://expressjs.com/en/resources/middleware.html)) by default. You are not required to use Glitch for this assignment (but using Glitch is fine!); [Heroku](https://www.heroku.com) is another excellent option to explore. The course staff can't be resposible for helping with all other hosting options outside of Glitch, but some of us do have experience with other systems. It also never hurts to ask on Slack, as there's 99 other classmates who might have the experience you're looking for! -- A client-side interactive experience using at least one of the web technologies frameworks we discussed in class over the past week. - - [Three.js](https://threejs.org/): A library for 3D graphics / VR experiences - - [D3.js](https://d3js.org): A library that is primarily used for interactive data visualizations - - [Canvas](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API): A 2D raster drawing API included in all modern browsers - - [SVG](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API): A 2D vector drawing framework that enables shapes to be defined via XML. - - [Web Audio API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API): An API for audio synthesis, analysis, processing, and file playback. -- A user interface for interaction with your project, which must expose at least six parameters for user control. [dat.gui](https://workshop.chromeexperiments.com/examples/gui/#1--Basic-Usage) is highly recommended for this. You might also explore interaction by tracking mouse movement via the `window.onmousemove` event handler in tandem with the `event.clientX` and `event.clientY` properties. Consider using the [Pointer Events API](https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events) to ensure that that mouse and touch events will both be supported in your app. -- Your application should display basic documentation for the user interface when the application first loads. This documentation should be dismissable, however, users should be able to redisplay it via either a help buton (this could, for example, be inside a dat.gui interface) or via a keyboard shortcut (commonly the question mark). -- Your application should feature at least two different ES6 modules that you write ([read about ES6 modules](https://www.sitepoint.com/understanding-es6-modules/)) and include into a main JavaScript file. This means that you will need to author *at least three JavaScript files* (a `app.js` or `main.js` file and two modules). We'll discuss modules in class on Monday 9/23; for this assignment modules should contain at least two functions. -- You are required to use a linter for your JavaScript. There are plugins for most IDEs, however it will be difficult to run the linter directly in Glitch. If you haven't moved to developing on your personal laptop and then uploading to Glitch when your project is completed, this is the assignment to do so! -- Your HTML and CSS should validate. There are options/plugins for most IDEs to check validation. +your hosting link e.g. http://a4-hcaouette.glitch.me -The interactive experience should possess a reasonable level of complexity. Some examples: -### Three.js -- A generative algorithm creates simple agents that move through a virtual world. Your interface controls the behavior / appearance of these agents. -- A simple 3D game -- An 3D audio visualization of a song of your choosing. User interaction should control aspects of the visualization. -### Canvas -- Implement a generative algorithm such as [Conway's Game of Life](https://bitstorm.org/gameoflife/) (or 1D cellular automata) and provide interactive controls. Note that the Game of Life has been created by 100s of people using ; we'll be checking to ensure that your implementation is not a copy of these. -- Design a 2D audio visualizer of a song of your choosing. User interaction should control visual aspects of the experience. -### Web Audio API -- Create a screen-based musical instrument using the Web Audio API. You can use projects such as [Interface.js](http://charlie-roberts.com/interface/) or [Nexus UI](https://nexus-js.github.io/ui/api/#Piano) to provide common musical interface elements, or use dat.GUI in combination with mouse/touch events (use the Pointer Events API). Your GUI should enable users to control aspects of sound synthesis. -### D3.js -- Create visualizations using the datasets found at [Awesome JSON Datasets](https://github.com/jdorfman/Awesome-JSON-Datasets). Experiment with providing different visualizations of the same data set, and providing users interactive control over visualization parameters and/or data filtering. Alternatively, create a single visualization with using one of the more complicated techniques shown at [d3js.org](d3js.org) and provide meaningful points of interaction for users. - -Deliverables ---- - -Do the following to complete this assignment: - -1. Implement your project with the above requirements. -3. Test your project to make sure that when someone goes to your main page on Glitch/Heroku/etc., it displays correctly. -4. Ensure that your project has the proper naming scheme `a4-yourname` so we can find it. -5. Fork this repository and modify the README to the specifications below. *NOTE: If you don't use Glitch for hosting (where we can see the files) then you must include all project files that you author in your repo for this assignment*. -6. Create and submit a Pull Request to the original repo. Name the pull request using the following template: `a4-gitname-firstname-lastname`. - -Sample Readme (delete the above when you're ready to submit, and modify the below so with your links and descriptions) ---- - -## Your Web Application Title - -your hosting link e.g. http://a4-charlieroberts.glitch.me - -Include a very brief summary of your project here. Images are encouraged, along with concise, high-level text. Be sure to include: - -- the goal of the application -- challenges you faced in realizing the application -- a brief description of the JS linter you used and what rules it follows (we'll be looking at your JS files for consistency) +-The goal of my application was to create a fun, interactive visual to accompany music, inspired by the deprecated smoke particles effect google music used to have for the browser application. (look it up, it was way cooler than just having album art). +- I had a lot of challenges with implementing just about every part of this project. I only really just figured out the bulk of it towards the end; you can check out the commit history if you want. setting up modules was hard, getting dat.gui to work at all was hard, figuring out how to use the web audio api to process music was hard. +- I tried to use the eslinter plugin for Atom, version 8.5.0, but I'm not sure that it was 100% effective in checking my code. I used similar linter plugins for my css and html as well, to similar results. My best guess is that using a different IDE, at least, would improve my linting experience, but it shouldnt be too bad as is. ## Technical Achievements -- **Tech Achievement 1**: I wrote my own custom GLSL shaders to use as a material for my Three.js objects. -- **Tech Achievement 2**: My audiovisualizer uses both FFT and amplitude analysis to drive visualization. -- **Tech Achievement 3**: I optimized the efficiency of my reaction-diffusion algorithm by... -- **Tech Achievement 4**: I visualized the dataset X using three different visualization technqiues provided by D3, andprovided +- **Tech Achievement 1**: I used the ytdl-core middleware to take a youtube video and pipe it to the client for processing. +- **Tech Achievement 2**: My app uses html canvas and the web audio api to create an audiovisual experience that can be tweaked with dat.gui. +- **Tech Achievement 3**: I implemented both a sine-wave visualization and a bar-graph type visualization, which can be selected in the dat.gui control ### Design/Evaluation Achievements -- **Design Achievement 1**: I ensured that my application would run on both desktops / mobile devices by changing X -- **Design Achievement 2**: I followed best practices for accessibility, including providing alt attributes for images and using semantic HTML. There are no `
        ` or `` elements in my document. -- **Design Achievement 3**: We tested the application with n=X users, finding that... +- **Design Achievement 1**: the backdrop of the graphs is the RGB inverse of the graph line/bar color, making for a high-contrast graph, at all times. From ae04e4b46981bb63d1cc0c1f8c0cfbaaa1615280 Mon Sep 17 00:00:00 2001 From: Hunter Date: Mon, 30 Sep 2019 03:59:49 -0400 Subject: [PATCH 52/54] finishing touches, including explanation pane --- README.md | 4 ++-- public/index.html | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6692eb251..e46f20bc3 100755 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Professor Roberts gave me, Hunter Caouette, a penalty-free extension for the wee ## creative coding -- a4-hcaouette -- CS4241 Assignment 4 -your hosting link e.g. http://a4-hcaouette.glitch.me +http://a4-hcaouette.glitch.me -The goal of my application was to create a fun, interactive visual to accompany music, inspired by the deprecated smoke particles effect google music used to have for the browser application. (look it up, it was way cooler than just having album art). - I had a lot of challenges with implementing just about every part of this project. I only really just figured out the bulk of it towards the end; you can check out the commit history if you want. setting up modules was hard, getting dat.gui to work at all was hard, figuring out how to use the web audio api to process music was hard. @@ -17,7 +17,7 @@ your hosting link e.g. http://a4-hcaouette.glitch.me ## Technical Achievements - **Tech Achievement 1**: I used the ytdl-core middleware to take a youtube video and pipe it to the client for processing. - **Tech Achievement 2**: My app uses html canvas and the web audio api to create an audiovisual experience that can be tweaked with dat.gui. -- **Tech Achievement 3**: I implemented both a sine-wave visualization and a bar-graph type visualization, which can be selected in the dat.gui control +- **Tech Achievement 3**: I implemented both a sine-wave visualization and a bar-graph type visualization, which can be selected in the dat.gui control. ### Design/Evaluation Achievements - **Design Achievement 1**: the backdrop of the graphs is the RGB inverse of the graph line/bar color, making for a high-contrast graph, at all times. diff --git a/public/index.html b/public/index.html index e32d955a7..bcfc98146 100644 --- a/public/index.html +++ b/public/index.html @@ -48,6 +48,19 @@

        Enter YouTube URL

        +
        +

        INSTRUCTIONS

        +

        For use: copy and paste the URL for a youtube video in the textbox in the navbar, then click 'Load Video'.

        +

        The dat.gui controls work as follows:

        +
          +
        • style: it's a slider, but select either 1 or 2, then reload the video. it is no longer changing dynamically( without reload) when you change the variable.
        • +
        • R: controls the red hue of the graph, and sets the background to 255-R.
        • +
        • G: controls the green hue of the graph, and sets the background to 255-G.
        • +
        • B: controls the blue hue of the graph, and sets the background to 255-B.
        • +
        • thiqness: controls the width of the bars on the graph. does not affect sine wave.
        • +
        • height: controls the height of the bar graph. does not affect sine wave.
        • +
        +
        From ce7f5d9c8aef5b1a9da03ef8dc78f7c9c024c935 Mon Sep 17 00:00:00 2001 From: Hunter Date: Mon, 30 Sep 2019 04:09:09 -0400 Subject: [PATCH 53/54] salmon --- README.md | 1 + bundle.js | 6 +++--- public/css/style.css | 4 +++- public/index.html | 31 +++++++++++++++++-------------- public/js/scripts.js | 6 +++--- 5 files changed, 27 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index e46f20bc3..11f7a0c83 100755 --- a/README.md +++ b/README.md @@ -21,3 +21,4 @@ http://a4-hcaouette.glitch.me ### Design/Evaluation Achievements - **Design Achievement 1**: the backdrop of the graphs is the RGB inverse of the graph line/bar color, making for a high-contrast graph, at all times. +- If you have any questions about the color palette, I really liked the shade of blue green, tried the 255-R,G,B values and found it too pale, and then recalled one of the great universal truths. https://imgur.com/gallery/ZsZ0j. diff --git a/bundle.js b/bundle.js index 7ee0603a4..58a19c9aa 100644 --- a/bundle.js +++ b/bundle.js @@ -2607,9 +2607,9 @@ function play(){ let gProps = { style: 2, - R: 255, - G: 0, - B: 0, + R: 67, + G: 118, + B: 111, thiqness: 3, height: 5, } diff --git a/public/css/style.css b/public/css/style.css index 5d3084113..679bad519 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1,6 +1,8 @@ /*Style your own assignment! This is fun! */ :root{ - --textMain:#153147; + --textMain:rgb(245,137,144); + /*salmon is for desire + https://imgur.com/gallery/ZsZ0j*/ --bgMain:rgb(67,118,111); --txtNav:32px; } diff --git a/public/index.html b/public/index.html index bcfc98146..f055078c7 100644 --- a/public/index.html +++ b/public/index.html @@ -48,21 +48,24 @@

        Enter YouTube URL

        -
        -

        INSTRUCTIONS

        -

        For use: copy and paste the URL for a youtube video in the textbox in the navbar, then click 'Load Video'.

        -

        The dat.gui controls work as follows:

        -
          -
        • style: it's a slider, but select either 1 or 2, then reload the video. it is no longer changing dynamically( without reload) when you change the variable.
        • -
        • R: controls the red hue of the graph, and sets the background to 255-R.
        • -
        • G: controls the green hue of the graph, and sets the background to 255-G.
        • -
        • B: controls the blue hue of the graph, and sets the background to 255-B.
        • -
        • thiqness: controls the width of the bars on the graph. does not affect sine wave.
        • -
        • height: controls the height of the bar graph. does not affect sine wave.
        • -
        -
        - +
        +
        +

        INSTRUCTIONS

        +

        For use: copy and paste the URL for a youtube video in the textbox in the navbar, then click 'Load Video'.

        +

        The dat.gui controls work as follows:

        +
          +
        • style: it's a slider, but select either 1 or 2, then reload the video. it is no longer changing dynamically( without reload) when you change the variable.
        • +
        • R: controls the red hue of the graph, and sets the background to 255-R.
        • +
        • G: controls the green hue of the graph, and sets the background to 255-G.
        • +
        • B: controls the blue hue of the graph, and sets the background to 255-B.
        • +
        • thiqness: controls the width of the bars on the graph. does not affect sine wave.
        • +
        • height: controls the height of the bar graph. does not affect sine wave.
        • +
        +
        + + +
        diff --git a/public/js/scripts.js b/public/js/scripts.js index 59c066e7e..9fe04d87a 100644 --- a/public/js/scripts.js +++ b/public/js/scripts.js @@ -67,9 +67,9 @@ function play(){ let gProps = { style: 2, - R: 255, - G: 0, - B: 0, + R: 67, + G: 118, + B: 111, thiqness: 3, height: 5, } From 62b1f288240dda36061b3f673383450fb0fdf805 Mon Sep 17 00:00:00 2001 From: Hunter Date: Mon, 30 Sep 2019 04:16:04 -0400 Subject: [PATCH 54/54] added some classics for recommendations --- public/index.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/public/index.html b/public/index.html index f055078c7..51543a9fe 100644 --- a/public/index.html +++ b/public/index.html @@ -62,6 +62,13 @@

        INSTRUCTIONS

      1. thiqness: controls the width of the bars on the graph. does not affect sine wave.
      2. height: controls the height of the bar graph. does not affect sine wave.
      3. +

        Some recommendations

        +
          +
        • https://www.youtube.com/watch?v=dQw4w9WgXcQ
        • +
        • https://www.youtube.com/watch?v=aZXqkgFegLQ
        • +
        • https://www.youtube.com/watch?v=q6EoRBvdVPQ
        • +
        • https://www.youtube.com/watch?v=ybGOT4d2Hs8
        • +