diff --git a/dependencies/parallel.js b/dependencies/parallel.js deleted file mode 100644 index 3379347efcfe24ce20a93991f525a6719057e606..0000000000000000000000000000000000000000 --- a/dependencies/parallel.js +++ /dev/null @@ -1,331 +0,0 @@ -(function () { - var isCommonJS = typeof module !== 'undefined' && module.exports; - var isNode = !(typeof window !== 'undefined' && this === window); - var setImmediate = setImmediate || function (cb) { - setTimeout(cb, 0); - }; - var Worker = isNode ? require(__dirname + '/Worker.js') : self.Worker; - var URL = typeof self !== 'undefined' ? (self.URL ? self.URL : self.webkitURL) : null; - var _supports = (isNode || self.Worker) ? true : false; // node always supports parallel - - function extend(from, to) { - if (!to) to = {}; - for (var i in from) { - if (to[i] === undefined) to[i] = from[i]; - } - return to; - } - - function Operation() { - this._callbacks = []; - this._errCallbacks = []; - - this._resolved = 0; - this._result = null; - } - - Operation.prototype.resolve = function (err, res) { - if (!err) { - this._resolved = 1; - this._result = res; - - for (var i = 0; i < this._callbacks.length; ++i) { - this._callbacks[i](res); - } - } else { - this._resolved = 2; - this._result = err; - - for (var iE = 0; iE < this._errCallbacks.length; ++iE) { - this._errCallbacks[iE](res); - } - } - - this._callbacks = []; - this._errCallbacks = []; - }; - - Operation.prototype.then = function (cb, errCb) { - if (this._resolved === 1) { // result - if (cb) { - cb(this._result); - } - - return; - } else if (this._resolved === 2) { // error - if (errCb) { - errCb(this._result); - } - return; - } - - if (cb) { - this._callbacks[this._callbacks.length] = cb; - } - - if (errCb) { - this._errCallbacks[this._errCallbacks.length] = errCb; - } - return this; - }; - - var defaults = { - evalPath: isNode ? __dirname + '/eval.js' : null, - maxWorkers: isNode ? require('os').cpus().length : 4, - synchronous: true, - env: {}, - envNamespace: 'env' - }; - - function Parallel(data, options) { - this.data = data; - this.options = extend(defaults, options); - this.operation = new Operation(); - this.operation.resolve(null, this.data); - this.requiredScripts = []; - this.requiredFunctions = []; - } - - // static method - Parallel.isSupported=function(){ return _supports; } - - Parallel.prototype.getWorkerSource = function (cb, env) { - var that = this; - var preStr = ''; - var i = 0; - if (!isNode && this.requiredScripts.length !== 0) { - preStr += 'importScripts("' + this.requiredScripts.join('","') + '");\r\n'; - } - - for (i = 0; i < this.requiredFunctions.length; ++i) { - if (this.requiredFunctions[i].name) { - preStr += 'var ' + this.requiredFunctions[i].name + ' = ' + this.requiredFunctions[i].fn.toString() + ';'; - } else { - preStr += this.requiredFunctions[i].fn.toString(); - } - } - - env = JSON.stringify(env || {}); - - var ns = this.options.envNamespace; - - if (isNode) { - return preStr + 'process.on("message", function(e) {global.' + ns + ' = ' + env + ';process.send(JSON.stringify((' + cb.toString() + ')(JSON.parse(e).data)))})'; - } else { - return preStr + 'self.onmessage = function(e) {var global = {}; global.' + ns + ' = ' + env + ';self.postMessage((' + cb.toString() + ')(e.data))}'; - } - }; - - Parallel.prototype.require = function () { - var args = Array.prototype.slice.call(arguments, 0), - func; - - for (var i = 0; i < args.length; i++) { - func = args[i]; - - if (typeof func === 'string') { - this.requiredScripts.push(func); - } else if (typeof func === 'function') { - this.requiredFunctions.push({ fn: func }); - } else if (typeof func === 'object') { - this.requiredFunctions.push(func); - } - } - - return this; - }; - - Parallel.prototype._spawnWorker = function (cb, env) { - var wrk; - var src = this.getWorkerSource(cb, env); - if (isNode) { - wrk = new Worker(this.options.evalPath); - wrk.postMessage(src); - } else { - if (Worker === undefined) { - return undefined; - } - - try { - if (this.requiredScripts.length !== 0) { - if (this.options.evalPath !== null) { - wrk = new Worker(this.options.evalPath); - wrk.postMessage(src); - } else { - throw new Error('Can\'t use required scripts without eval.js!'); - } - } else if (!URL) { - throw new Error('Can\'t create a blob URL in this browser!'); - } else { - var blob = new Blob([src], { type: 'text/javascript' }); - var url = URL.createObjectURL(blob); - - wrk = new Worker(url); - } - } catch (e) { - if (this.options.evalPath !== null) { // blob/url unsupported, cross-origin error - wrk = new Worker(this.options.evalPath); - wrk.postMessage(src); - } else { - throw e; - } - } - } - - return wrk; - }; - - Parallel.prototype.spawn = function (cb, env) { - var that = this; - var newOp = new Operation(); - - env = extend(this.options.env, env || {}); - - this.operation.then(function () { - var wrk = that._spawnWorker(cb, env); - if (wrk !== undefined) { - wrk.onmessage = function (msg) { - wrk.terminate(); - that.data = msg.data; - newOp.resolve(null, that.data); - }; - wrk.postMessage(that.data); - } else if (that.options.synchronous) { - setImmediate(function () { - that.data = cb(that.data); - newOp.resolve(null, that.data); - }); - } else { - throw new Error('Workers do not exist and synchronous operation not allowed!'); - } - }); - this.operation = newOp; - return this; - }; - - Parallel.prototype._spawnMapWorker = function (i, cb, done, env) { - var that = this; - var wrk = that._spawnWorker(cb, env); - if (wrk !== undefined) { - wrk.onmessage = function (msg) { - wrk.terminate(); - that.data[i] = msg.data; - done(); - }; - wrk.postMessage(that.data[i]); - } else if (that.options.synchronous) { - setImmediate(function () { - that.data[i] = cb(that.data[i]); - done(); - }); - } else { - throw new Error('Workers do not exist and synchronous operation not allowed!'); - } - }; - - Parallel.prototype.map = function (cb, env) { - env = extend(this.options.env, env || {}); - - if (!this.data.length) { - return this.spawn(cb, env); - } - - var that = this; - var startedOps = 0; - var doneOps = 0; - function done() { - if (++doneOps === that.data.length) { - newOp.resolve(null, that.data); - } else if (startedOps < that.data.length) { - that._spawnMapWorker(startedOps++, cb, done, env); - } - } - - var newOp = new Operation(); - this.operation.then(function () { - for (; startedOps - doneOps < that.options.maxWorkers && startedOps < that.data.length; ++startedOps) { - that._spawnMapWorker(startedOps, cb, done, env); - } - }); - this.operation = newOp; - return this; - }; - - Parallel.prototype._spawnReduceWorker = function (data, cb, done, env) { - var that = this; - var wrk = that._spawnWorker(cb, env); - if (wrk !== undefined) { - wrk.onmessage = function (msg) { - wrk.terminate(); - that.data[that.data.length] = msg.data; - done(); - }; - wrk.postMessage(data); - } else if (that.options.synchronous) { - setImmediate(function () { - that.data[that.data.length] = cb(data); - done(); - }); - } else { - throw new Error('Workers do not exist and synchronous operation not allowed!'); - } - }; - - Parallel.prototype.reduce = function (cb, env) { - env = extend(this.options.env, env || {}); - - if (!this.data.length) { - throw new Error('Can\'t reduce non-array data'); - } - - var runningWorkers = 0; - var that = this; - function done(data) { - --runningWorkers; - if (that.data.length === 1 && runningWorkers === 0) { - that.data = that.data[0]; - newOp.resolve(null, that.data); - } else if (that.data.length > 1) { - ++runningWorkers; - that._spawnReduceWorker([that.data[0], that.data[1]], cb, done, env); - that.data.splice(0, 2); - } - } - - var newOp = new Operation(); - this.operation.then(function () { - if (that.data.length === 1) { - newOp.resolve(null, that.data[0]); - } else { - for (var i = 0; i < that.options.maxWorkers && i < Math.floor(that.data.length / 2); ++i) { - ++runningWorkers; - that._spawnReduceWorker([that.data[i * 2], that.data[i * 2 + 1]], cb, done, env); - } - - that.data.splice(0, i * 2); - } - }); - this.operation = newOp; - return this; - }; - - Parallel.prototype.then = function (cb, errCb) { - var that = this; - var newOp = new Operation(); - this.operation.then(function () { - var retData = cb(that.data); - if (retData !== undefined) { - that.data = retData; - } - newOp.resolve(null, that.data); - }, errCb); - this.operation = newOp; - return this; - }; - - if (isCommonJS) { - module.exports = Parallel; - } else { - self.Parallel = Parallel; - } -})(); diff --git a/index.html b/index.html index 89b37990f4bdd60e47c402ec163ebb669e167640..02e08dc74e6318c37c003e8569f2f03eca8c27d7 100644 --- a/index.html +++ b/index.html @@ -5,126 +5,127 @@ <title></title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <script src="dependencies/analytics.js"></script> + <!--<script src="dependencies/analytics.js"></script>--> - <!--UI--> - <script src="dependencies/jquery-2.1.3.js"></script> - <script src="dependencies/underscore.js"></script> + <!--<!–UI–>--> + <!--<script src="dependencies/jquery-2.1.3.js"></script>--> + <!--<script src="dependencies/underscore.js"></script>--> - <!--backbone model/view framework--> - <script src="dependencies/backbone.js"></script> + <!--<!–backbone model/view framework–>--> + <!--<script src="dependencies/backbone.js"></script>--> <!--flatUI bootstrap theme--> - <link href="dependencies/flatUI/css/vendor/bootstrap.min.css" rel="stylesheet"><!-- Loading Bootstrap --> - <link href="dependencies/flatUI/css/flat-ui.css" rel="stylesheet"><!-- Loading Flat UI --> - <script src="dependencies/flatUI/js/flat-ui.js"></script> + <link href="js/dependencies/flatUI/css/vendor/bootstrap.min.css" rel="stylesheet"><!-- Loading Bootstrap --> + <link href="js/dependencies/flatUI/css/flat-ui.css" rel="stylesheet"><!-- Loading Flat UI --> + <!--<script src="dependencies/flatUI/js/flat-ui.js"></script>--> <!--<script src="dependencies/flatUI/js/vendor/video.js"></script>--> <!--bootstrap slider--> - <link href="dependencies/bootstrap-slider/bootstrap-slider.css" rel="stylesheet"> - <script src="dependencies/bootstrap-slider/bootstrap-slider.js"></script> - - <!--threeJS--> - <script src="dependencies/three.js"></script> - <script src="dependencies/OrbitControls.js"></script> - - <!--stl import/export--> - <script src="dependencies/loaders/FileSaver.min.js"></script> - <script src="dependencies/THREE2STL.js"></script> - <script src="dependencies/loaders/STLLoader.js"></script> - - <!--numerical javascript--> - <script src="dependencies/numeric-1.2.6.js"></script> - - <!-- code mirror --> - <script src="dependencies/codemirror/codemirror.js"></script> - <script src="dependencies/codemirror/javascript.js"></script> - <link rel="stylesheet" type="text/css" href="dependencies/codemirror/codemirror.css"> - - <script src="js/models/AllAppPLists.js"></script> - - <!--multi-threading--> - <script src="js/multiThreading/worker.js"></script> - <script src="js/multiThreading/persistentWorkers.js"></script><!--global workers--> - - <!--fea stuff--> - <script src="js/fea/DmaNode.js"></script> - <script src="js/fea/DmaBeam.js"></script> - - <script src="js/cells/DMACell.js"></script> - <script src="js/cells/supercells/DMASuperCell.js"></script> - <script src="js/cells/OctaFaceCell.js"></script> - <script src="js/cells/OctaEdgeCell.js"></script> - <script src="js/cells/OctaRotEdgeCell.js"></script> - <script src="js/cells/OctaVertexCell.js"></script> - - <script src="js/cells/supercells/GIKSuperCell.js"></script> - <script src="js/cells/DMACellFreeform.js"></script> - - <script src="js/cells/CubeCell.js"></script> - <script src="js/cells/GIKCell.js"></script> - <script src="js/cells/TruncatedCubeCell.js"></script> - <script src="js/cells/KelvinCell.js"></script> - <!--<script src="js/cells/TetraEdgeCell.js"></script>--> - <!--<script src="js/cells/TetraFaceCell.js"></script>--> - - <script src="js/parts/DMAPart.js"></script> - <script src="js/parts/GIKPart.js"></script> - <script src="js/parts/OctaEdgeVoxPart.js"></script> - <script src="js/parts/OctaFaceTriPart.js"></script> - - <!--models--> - <script src="js/three/ThreeModel.js"></script> - - <script src="js/lattice/Lattice.js"></script> - <script src="js/lattice/CubeLattice.js"></script> - <script src="js/lattice/GIKLattice.js"></script> - <script src="js/lattice/KelvinLattice.js"></script> - <script src="js/lattice/OctaEdgeLattice.js"></script> - <script src="js/lattice/OctaFaceLattice.js"></script> - <script src="js/lattice/OctaFreeFormFaceLattice.js"></script> - <script src="js/lattice/OctaRotEdgeLattice.js"></script> - <script src="js/lattice/OctaVertexLattice.js"></script> - <script src="js/lattice/TruncatedCubeLattice.js"></script> - - <script src="js/three/FillGeometry.js"></script> - <script src="js/three/BasePlane.js"></script> - <script src="js/models/AppState.js"></script> - <script src="js/cam/assemblers/Component.js"></script> - <script src="js/cam/assemblers/Assembler.js"></script> - <script src="js/cam/MachineOneBit.js"></script> - <script src="js/cam/assemblers/StaplerAssembler.js"></script> - <script src="js/cam/assemblers/DualStaplerAssembler.js"></script> - <script src="js/cam/cam.js"></script> - <script src="js/cam/ShopbotExporter.js"></script> - <script src="js/cam/GCodeExporter.js"></script> - <script src="js/cam/TinyGExporter.js"></script> - <script src="js/models/GlobalFileSaver.js"></script> - - <!--views--> - <script src="js/menus/MenuWrapperView.js"></script> - <script src="js/menus/Navbar.js"></script> - <script src="js/menus/NavViewMenu.js"></script> - <script src="js/menus/Ribbon.js"></script> - <script src="js/menus/LatticeMenuView.js"></script> - <script src="js/menus/ImportMenuView.js"></script> - <script src="js/menus/PartMenuView.js"></script> - <script src="js/menus/SketchMenuView.js"></script> - <script src="js/menus/ScriptMenuView.js"></script> - <script src="js/menus/ScriptView.js"></script> - <script src="js/menus/PhysicsMenuView.js"></script> - <script src="js/menus/MaterialMenuView.js"></script> - <script src="js/menus/OptimizationMenuView.js"></script> - <script src="js/menus/AssemblerMenuView.js"></script> - <script src="js/menus/AnimationMenuView.js"></script> - <script src="js/menus/CamMenuView.js"></script> - <script src="js/menus/SendMenuView.js"></script> - - <script src="js/three/Highlighter.js"></script> - <script src="js/three/ThreeView.js"></script> - - <script src="js/main.js"></script> + <link href="js/dependencies/bootstrap-slider/bootstrap-slider.css" rel="stylesheet"> + <!--<script src="dependencies/bootstrap-slider/bootstrap-slider.js"></script>--> + + <!--<!–threeJS–>--> + <!--<script src="dependencies/three.js"></script>--> + <!--<script src="dependencies/OrbitControls.js"></script>--> + + <!--<!–stl import/export–>--> + <!--<script src="dependencies/loaders/FileSaver.min.js"></script>--> + <!--<script src="dependencies/THREE2STL.js"></script>--> + <!--<script src="dependencies/loaders/STLLoader.js"></script>--> + + <!--<!–numerical javascript–>--> + <!--<script src="dependencies/numeric-1.2.6.js"></script>--> + + <!--<!– code mirror –>--> + <!--<script src="dependencies/codemirror/codemirror.js"></script>--> + <!--<script src="dependencies/codemirror/javascript.js"></script>--> + <link rel="stylesheet" type="text/css" href="js/dependencies/codemirror/codemirror.css"> + + <!--<script src="js/models/AllAppPLists.js"></script>--> + + <!--<!–multi-threading–>--> + <!--<script src="js/multiThreading/worker.js"></script>--> + <!--<script src="js/multiThreading/persistentWorkers.js"></script><!–global workers–>--> + + <!--<!–fea stuff–>--> + <!--<script src="js/fea/DmaNode.js"></script>--> + <!--<script src="js/fea/DmaBeam.js"></script>--> + + <!--<script src="js/cells/DMACell.js"></script>--> + <!--<script src="js/cells/supercells/DMASuperCell.js"></script>--> + <!--<script src="js/cells/OctaFaceCell.js"></script>--> + <!--<script src="js/cells/OctaEdgeCell.js"></script>--> + <!--<script src="js/cells/OctaRotEdgeCell.js"></script>--> + <!--<script src="js/cells/OctaVertexCell.js"></script>--> + + <!--<script src="js/cells/supercells/GIKSuperCell.js"></script>--> + <!--<script src="js/cells/DMACellFreeform.js"></script>--> + + <!--<script src="js/cells/CubeCell.js"></script>--> + <!--<script src="js/cells/GIKCell.js"></script>--> + <!--<script src="js/cells/TruncatedCubeCell.js"></script>--> + <!--<script src="js/cells/KelvinCell.js"></script>--> + <!--<!–<script src="js/cells/TetraEdgeCell.js"></script>–>--> + <!--<!–<script src="js/cells/TetraFaceCell.js"></script>–>--> + + <!--<script src="js/parts/DMAPart.js"></script>--> + <!--<script src="js/parts/GIKPart.js"></script>--> + <!--<script src="js/parts/OctaEdgeVoxPart.js"></script>--> + <!--<script src="js/parts/OctaFaceTriPart.js"></script>--> + + <!--<!–models–>--> + <!--<script src="js/three/ThreeModel.js"></script>--> + + <!--<script src="js/lattice/Lattice.js"></script>--> + <!--<script src="js/lattice/CubeLattice.js"></script>--> + <!--<script src="js/lattice/GIKLattice.js"></script>--> + <!--<script src="js/lattice/KelvinLattice.js"></script>--> + <!--<script src="js/lattice/OctaEdgeLattice.js"></script>--> + <!--<script src="js/lattice/OctaFaceLattice.js"></script>--> + <!--<script src="js/lattice/OctaFreeFormFaceLattice.js"></script>--> + <!--<script src="js/lattice/OctaRotEdgeLattice.js"></script>--> + <!--<script src="js/lattice/OctaVertexLattice.js"></script>--> + <!--<script src="js/lattice/TruncatedCubeLattice.js"></script>--> + + <!--<script src="js/three/FillGeometry.js"></script>--> + <!--<script src="js/three/BasePlane.js"></script>--> + <!--<script src="js/models/AppState.js"></script>--> + <!--<script src="js/cam/assemblers/Component.js"></script>--> + <!--<script src="js/cam/assemblers/Assembler.js"></script>--> + <!--<script src="js/cam/MachineOneBit.js"></script>--> + <!--<script src="js/cam/assemblers/StaplerAssembler.js"></script>--> + <!--<script src="js/cam/assemblers/DualStaplerAssembler.js"></script>--> + <!--<script src="js/cam/cam.js"></script>--> + <!--<script src="js/cam/ShopbotExporter.js"></script>--> + <!--<script src="js/cam/GCodeExporter.js"></script>--> + <!--<script src="js/cam/TinyGExporter.js"></script>--> + <!--<script src="js/models/GlobalFileSaver.js"></script>--> + + <!--<!–views–>--> + <!--<script src="js/menus/MenuWrapperView.js"></script>--> + <!--<script src="js/menus/Navbar.js"></script>--> + <!--<script src="js/menus/NavViewMenu.js"></script>--> + <!--<script src="js/menus/Ribbon.js"></script>--> + <!--<script src="js/menus/LatticeMenuView.js"></script>--> + <!--<script src="js/menus/ImportMenuView.js"></script>--> + <!--<script src="js/menus/PartMenuView.js"></script>--> + <!--<script src="js/menus/SketchMenuView.js"></script>--> + <!--<script src="js/menus/ScriptMenuView.js"></script>--> + <!--<script src="js/menus/ScriptView.js"></script>--> + <!--<script src="js/menus/PhysicsMenuView.js"></script>--> + <!--<script src="js/menus/MaterialMenuView.js"></script>--> + <!--<script src="js/menus/OptimizationMenuView.js"></script>--> + <!--<script src="js/menus/AssemblerMenuView.js"></script>--> + <!--<script src="js/menus/AnimationMenuView.js"></script>--> + <!--<script src="js/menus/CamMenuView.js"></script>--> + <!--<script src="js/menus/SendMenuView.js"></script>--> + + <!--<script src="js/three/Highlighter.js"></script>--> + <!--<script src="js/three/ThreeView.js"></script>--> + + <!--<script src="js/main.js"></script>--> <link rel="stylesheet" type="text/css" href="css/main.css"> + <script data-main="js/main" src="js/dependencies/require.js"></script> </head> <body> diff --git a/dependencies/OrbitControls.js b/js/dependencies/OrbitControls.js similarity index 100% rename from dependencies/OrbitControls.js rename to js/dependencies/OrbitControls.js diff --git a/dependencies/THREE2STL.js b/js/dependencies/THREE2STL.js similarity index 100% rename from dependencies/THREE2STL.js rename to js/dependencies/THREE2STL.js diff --git a/dependencies/analytics.js b/js/dependencies/analytics.js similarity index 100% rename from dependencies/analytics.js rename to js/dependencies/analytics.js diff --git a/dependencies/backbone-min.js b/js/dependencies/backbone-min.js similarity index 100% rename from dependencies/backbone-min.js rename to js/dependencies/backbone-min.js diff --git a/dependencies/backbone.js b/js/dependencies/backbone.js similarity index 100% rename from dependencies/backbone.js rename to js/dependencies/backbone.js diff --git a/dependencies/bootstrap-slider/bootstrap-slider.css b/js/dependencies/bootstrap-slider/bootstrap-slider.css similarity index 100% rename from dependencies/bootstrap-slider/bootstrap-slider.css rename to js/dependencies/bootstrap-slider/bootstrap-slider.css diff --git a/dependencies/bootstrap-slider/bootstrap-slider.js b/js/dependencies/bootstrap-slider/bootstrap-slider.js similarity index 100% rename from dependencies/bootstrap-slider/bootstrap-slider.js rename to js/dependencies/bootstrap-slider/bootstrap-slider.js diff --git a/dependencies/codemirror/codemirror.css b/js/dependencies/codemirror/codemirror.css similarity index 100% rename from dependencies/codemirror/codemirror.css rename to js/dependencies/codemirror/codemirror.css diff --git a/dependencies/codemirror/codemirror.js b/js/dependencies/codemirror/codemirror.js similarity index 100% rename from dependencies/codemirror/codemirror.js rename to js/dependencies/codemirror/codemirror.js diff --git a/dependencies/codemirror/javascript.js b/js/dependencies/codemirror/javascript.js similarity index 100% rename from dependencies/codemirror/javascript.js rename to js/dependencies/codemirror/javascript.js diff --git a/dependencies/flatUI/css/flat-ui.css b/js/dependencies/flatUI/css/flat-ui.css similarity index 100% rename from dependencies/flatUI/css/flat-ui.css rename to js/dependencies/flatUI/css/flat-ui.css diff --git a/dependencies/flatUI/css/flat-ui.css.map b/js/dependencies/flatUI/css/flat-ui.css.map similarity index 100% rename from dependencies/flatUI/css/flat-ui.css.map rename to js/dependencies/flatUI/css/flat-ui.css.map diff --git a/dependencies/flatUI/css/flat-ui.min.css b/js/dependencies/flatUI/css/flat-ui.min.css similarity index 100% rename from dependencies/flatUI/css/flat-ui.min.css rename to js/dependencies/flatUI/css/flat-ui.min.css diff --git a/dependencies/flatUI/css/vendor/bootstrap.min.css b/js/dependencies/flatUI/css/vendor/bootstrap.min.css similarity index 100% rename from dependencies/flatUI/css/vendor/bootstrap.min.css rename to js/dependencies/flatUI/css/vendor/bootstrap.min.css diff --git a/dependencies/flatUI/fonts/glyphicons/flat-ui-icons-regular.eot b/js/dependencies/flatUI/fonts/glyphicons/flat-ui-icons-regular.eot similarity index 100% rename from dependencies/flatUI/fonts/glyphicons/flat-ui-icons-regular.eot rename to js/dependencies/flatUI/fonts/glyphicons/flat-ui-icons-regular.eot diff --git a/dependencies/flatUI/fonts/glyphicons/flat-ui-icons-regular.svg b/js/dependencies/flatUI/fonts/glyphicons/flat-ui-icons-regular.svg similarity index 100% rename from dependencies/flatUI/fonts/glyphicons/flat-ui-icons-regular.svg rename to js/dependencies/flatUI/fonts/glyphicons/flat-ui-icons-regular.svg diff --git a/dependencies/flatUI/fonts/glyphicons/flat-ui-icons-regular.ttf b/js/dependencies/flatUI/fonts/glyphicons/flat-ui-icons-regular.ttf similarity index 100% rename from dependencies/flatUI/fonts/glyphicons/flat-ui-icons-regular.ttf rename to js/dependencies/flatUI/fonts/glyphicons/flat-ui-icons-regular.ttf diff --git a/dependencies/flatUI/fonts/glyphicons/flat-ui-icons-regular.woff b/js/dependencies/flatUI/fonts/glyphicons/flat-ui-icons-regular.woff similarity index 100% rename from dependencies/flatUI/fonts/glyphicons/flat-ui-icons-regular.woff rename to js/dependencies/flatUI/fonts/glyphicons/flat-ui-icons-regular.woff diff --git a/dependencies/flatUI/fonts/glyphicons/selection.json b/js/dependencies/flatUI/fonts/glyphicons/selection.json similarity index 100% rename from dependencies/flatUI/fonts/glyphicons/selection.json rename to js/dependencies/flatUI/fonts/glyphicons/selection.json diff --git a/dependencies/flatUI/fonts/lato/lato-black.eot b/js/dependencies/flatUI/fonts/lato/lato-black.eot similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-black.eot rename to js/dependencies/flatUI/fonts/lato/lato-black.eot diff --git a/dependencies/flatUI/fonts/lato/lato-black.svg b/js/dependencies/flatUI/fonts/lato/lato-black.svg similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-black.svg rename to js/dependencies/flatUI/fonts/lato/lato-black.svg diff --git a/dependencies/flatUI/fonts/lato/lato-black.ttf b/js/dependencies/flatUI/fonts/lato/lato-black.ttf similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-black.ttf rename to js/dependencies/flatUI/fonts/lato/lato-black.ttf diff --git a/dependencies/flatUI/fonts/lato/lato-black.woff b/js/dependencies/flatUI/fonts/lato/lato-black.woff similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-black.woff rename to js/dependencies/flatUI/fonts/lato/lato-black.woff diff --git a/dependencies/flatUI/fonts/lato/lato-bold.eot b/js/dependencies/flatUI/fonts/lato/lato-bold.eot similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-bold.eot rename to js/dependencies/flatUI/fonts/lato/lato-bold.eot diff --git a/dependencies/flatUI/fonts/lato/lato-bold.svg b/js/dependencies/flatUI/fonts/lato/lato-bold.svg similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-bold.svg rename to js/dependencies/flatUI/fonts/lato/lato-bold.svg diff --git a/dependencies/flatUI/fonts/lato/lato-bold.ttf b/js/dependencies/flatUI/fonts/lato/lato-bold.ttf similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-bold.ttf rename to js/dependencies/flatUI/fonts/lato/lato-bold.ttf diff --git a/dependencies/flatUI/fonts/lato/lato-bold.woff b/js/dependencies/flatUI/fonts/lato/lato-bold.woff similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-bold.woff rename to js/dependencies/flatUI/fonts/lato/lato-bold.woff diff --git a/dependencies/flatUI/fonts/lato/lato-bolditalic.eot b/js/dependencies/flatUI/fonts/lato/lato-bolditalic.eot similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-bolditalic.eot rename to js/dependencies/flatUI/fonts/lato/lato-bolditalic.eot diff --git a/dependencies/flatUI/fonts/lato/lato-bolditalic.svg b/js/dependencies/flatUI/fonts/lato/lato-bolditalic.svg similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-bolditalic.svg rename to js/dependencies/flatUI/fonts/lato/lato-bolditalic.svg diff --git a/dependencies/flatUI/fonts/lato/lato-bolditalic.ttf b/js/dependencies/flatUI/fonts/lato/lato-bolditalic.ttf similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-bolditalic.ttf rename to js/dependencies/flatUI/fonts/lato/lato-bolditalic.ttf diff --git a/dependencies/flatUI/fonts/lato/lato-bolditalic.woff b/js/dependencies/flatUI/fonts/lato/lato-bolditalic.woff similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-bolditalic.woff rename to js/dependencies/flatUI/fonts/lato/lato-bolditalic.woff diff --git a/dependencies/flatUI/fonts/lato/lato-italic.eot b/js/dependencies/flatUI/fonts/lato/lato-italic.eot similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-italic.eot rename to js/dependencies/flatUI/fonts/lato/lato-italic.eot diff --git a/dependencies/flatUI/fonts/lato/lato-italic.svg b/js/dependencies/flatUI/fonts/lato/lato-italic.svg similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-italic.svg rename to js/dependencies/flatUI/fonts/lato/lato-italic.svg diff --git a/dependencies/flatUI/fonts/lato/lato-italic.ttf b/js/dependencies/flatUI/fonts/lato/lato-italic.ttf similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-italic.ttf rename to js/dependencies/flatUI/fonts/lato/lato-italic.ttf diff --git a/dependencies/flatUI/fonts/lato/lato-italic.woff b/js/dependencies/flatUI/fonts/lato/lato-italic.woff similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-italic.woff rename to js/dependencies/flatUI/fonts/lato/lato-italic.woff diff --git a/dependencies/flatUI/fonts/lato/lato-light.eot b/js/dependencies/flatUI/fonts/lato/lato-light.eot similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-light.eot rename to js/dependencies/flatUI/fonts/lato/lato-light.eot diff --git a/dependencies/flatUI/fonts/lato/lato-light.svg b/js/dependencies/flatUI/fonts/lato/lato-light.svg similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-light.svg rename to js/dependencies/flatUI/fonts/lato/lato-light.svg diff --git a/dependencies/flatUI/fonts/lato/lato-light.ttf b/js/dependencies/flatUI/fonts/lato/lato-light.ttf similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-light.ttf rename to js/dependencies/flatUI/fonts/lato/lato-light.ttf diff --git a/dependencies/flatUI/fonts/lato/lato-light.woff b/js/dependencies/flatUI/fonts/lato/lato-light.woff similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-light.woff rename to js/dependencies/flatUI/fonts/lato/lato-light.woff diff --git a/dependencies/flatUI/fonts/lato/lato-regular.eot b/js/dependencies/flatUI/fonts/lato/lato-regular.eot similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-regular.eot rename to js/dependencies/flatUI/fonts/lato/lato-regular.eot diff --git a/dependencies/flatUI/fonts/lato/lato-regular.svg b/js/dependencies/flatUI/fonts/lato/lato-regular.svg similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-regular.svg rename to js/dependencies/flatUI/fonts/lato/lato-regular.svg diff --git a/dependencies/flatUI/fonts/lato/lato-regular.ttf b/js/dependencies/flatUI/fonts/lato/lato-regular.ttf similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-regular.ttf rename to js/dependencies/flatUI/fonts/lato/lato-regular.ttf diff --git a/dependencies/flatUI/fonts/lato/lato-regular.woff b/js/dependencies/flatUI/fonts/lato/lato-regular.woff similarity index 100% rename from dependencies/flatUI/fonts/lato/lato-regular.woff rename to js/dependencies/flatUI/fonts/lato/lato-regular.woff diff --git a/dependencies/flatUI/img/favicon.ico b/js/dependencies/flatUI/img/favicon.ico similarity index 100% rename from dependencies/flatUI/img/favicon.ico rename to js/dependencies/flatUI/img/favicon.ico diff --git a/dependencies/flatUI/img/icons/png/Book.png b/js/dependencies/flatUI/img/icons/png/Book.png similarity index 100% rename from dependencies/flatUI/img/icons/png/Book.png rename to js/dependencies/flatUI/img/icons/png/Book.png diff --git a/dependencies/flatUI/img/icons/png/Calendar.png b/js/dependencies/flatUI/img/icons/png/Calendar.png similarity index 100% rename from dependencies/flatUI/img/icons/png/Calendar.png rename to js/dependencies/flatUI/img/icons/png/Calendar.png diff --git a/dependencies/flatUI/img/icons/png/Chat.png b/js/dependencies/flatUI/img/icons/png/Chat.png similarity index 100% rename from dependencies/flatUI/img/icons/png/Chat.png rename to js/dependencies/flatUI/img/icons/png/Chat.png diff --git a/dependencies/flatUI/img/icons/png/Clipboard.png b/js/dependencies/flatUI/img/icons/png/Clipboard.png similarity index 100% rename from dependencies/flatUI/img/icons/png/Clipboard.png rename to js/dependencies/flatUI/img/icons/png/Clipboard.png diff --git a/dependencies/flatUI/img/icons/png/Compas.png b/js/dependencies/flatUI/img/icons/png/Compas.png similarity index 100% rename from dependencies/flatUI/img/icons/png/Compas.png rename to js/dependencies/flatUI/img/icons/png/Compas.png diff --git a/dependencies/flatUI/img/icons/png/Gift-Box.png b/js/dependencies/flatUI/img/icons/png/Gift-Box.png similarity index 100% rename from dependencies/flatUI/img/icons/png/Gift-Box.png rename to js/dependencies/flatUI/img/icons/png/Gift-Box.png diff --git a/dependencies/flatUI/img/icons/png/Infinity-Loop.png b/js/dependencies/flatUI/img/icons/png/Infinity-Loop.png similarity index 100% rename from dependencies/flatUI/img/icons/png/Infinity-Loop.png rename to js/dependencies/flatUI/img/icons/png/Infinity-Loop.png diff --git a/dependencies/flatUI/img/icons/png/Mail.png b/js/dependencies/flatUI/img/icons/png/Mail.png similarity index 100% rename from dependencies/flatUI/img/icons/png/Mail.png rename to js/dependencies/flatUI/img/icons/png/Mail.png diff --git a/dependencies/flatUI/img/icons/png/Map.png b/js/dependencies/flatUI/img/icons/png/Map.png similarity index 100% rename from dependencies/flatUI/img/icons/png/Map.png rename to js/dependencies/flatUI/img/icons/png/Map.png diff --git a/dependencies/flatUI/img/icons/png/Pensils.png b/js/dependencies/flatUI/img/icons/png/Pensils.png similarity index 100% rename from dependencies/flatUI/img/icons/png/Pensils.png rename to js/dependencies/flatUI/img/icons/png/Pensils.png diff --git a/dependencies/flatUI/img/icons/png/Pocket.png b/js/dependencies/flatUI/img/icons/png/Pocket.png similarity index 100% rename from dependencies/flatUI/img/icons/png/Pocket.png rename to js/dependencies/flatUI/img/icons/png/Pocket.png diff --git a/dependencies/flatUI/img/icons/png/Retina-Ready.png b/js/dependencies/flatUI/img/icons/png/Retina-Ready.png similarity index 100% rename from dependencies/flatUI/img/icons/png/Retina-Ready.png rename to js/dependencies/flatUI/img/icons/png/Retina-Ready.png diff --git a/dependencies/flatUI/img/icons/png/Toilet-Paper.png b/js/dependencies/flatUI/img/icons/png/Toilet-Paper.png similarity index 100% rename from dependencies/flatUI/img/icons/png/Toilet-Paper.png rename to js/dependencies/flatUI/img/icons/png/Toilet-Paper.png diff --git a/dependencies/flatUI/img/icons/png/Watches.png b/js/dependencies/flatUI/img/icons/png/Watches.png similarity index 100% rename from dependencies/flatUI/img/icons/png/Watches.png rename to js/dependencies/flatUI/img/icons/png/Watches.png diff --git a/dependencies/flatUI/img/icons/svg/book.svg b/js/dependencies/flatUI/img/icons/svg/book.svg similarity index 100% rename from dependencies/flatUI/img/icons/svg/book.svg rename to js/dependencies/flatUI/img/icons/svg/book.svg diff --git a/dependencies/flatUI/img/icons/svg/calendar.svg b/js/dependencies/flatUI/img/icons/svg/calendar.svg similarity index 100% rename from dependencies/flatUI/img/icons/svg/calendar.svg rename to js/dependencies/flatUI/img/icons/svg/calendar.svg diff --git a/dependencies/flatUI/img/icons/svg/chat.svg b/js/dependencies/flatUI/img/icons/svg/chat.svg similarity index 100% rename from dependencies/flatUI/img/icons/svg/chat.svg rename to js/dependencies/flatUI/img/icons/svg/chat.svg diff --git a/dependencies/flatUI/img/icons/svg/clipboard.svg b/js/dependencies/flatUI/img/icons/svg/clipboard.svg similarity index 100% rename from dependencies/flatUI/img/icons/svg/clipboard.svg rename to js/dependencies/flatUI/img/icons/svg/clipboard.svg diff --git a/dependencies/flatUI/img/icons/svg/clocks.svg b/js/dependencies/flatUI/img/icons/svg/clocks.svg similarity index 100% rename from dependencies/flatUI/img/icons/svg/clocks.svg rename to js/dependencies/flatUI/img/icons/svg/clocks.svg diff --git a/dependencies/flatUI/img/icons/svg/compas.svg b/js/dependencies/flatUI/img/icons/svg/compas.svg similarity index 100% rename from dependencies/flatUI/img/icons/svg/compas.svg rename to js/dependencies/flatUI/img/icons/svg/compas.svg diff --git a/dependencies/flatUI/img/icons/svg/gift-box.svg b/js/dependencies/flatUI/img/icons/svg/gift-box.svg similarity index 100% rename from dependencies/flatUI/img/icons/svg/gift-box.svg rename to js/dependencies/flatUI/img/icons/svg/gift-box.svg diff --git a/dependencies/flatUI/img/icons/svg/loop.svg b/js/dependencies/flatUI/img/icons/svg/loop.svg similarity index 100% rename from dependencies/flatUI/img/icons/svg/loop.svg rename to js/dependencies/flatUI/img/icons/svg/loop.svg diff --git a/dependencies/flatUI/img/icons/svg/mail.svg b/js/dependencies/flatUI/img/icons/svg/mail.svg similarity index 100% rename from dependencies/flatUI/img/icons/svg/mail.svg rename to js/dependencies/flatUI/img/icons/svg/mail.svg diff --git a/dependencies/flatUI/img/icons/svg/map.svg b/js/dependencies/flatUI/img/icons/svg/map.svg similarity index 100% rename from dependencies/flatUI/img/icons/svg/map.svg rename to js/dependencies/flatUI/img/icons/svg/map.svg diff --git a/dependencies/flatUI/img/icons/svg/paper-bag.svg b/js/dependencies/flatUI/img/icons/svg/paper-bag.svg similarity index 100% rename from dependencies/flatUI/img/icons/svg/paper-bag.svg rename to js/dependencies/flatUI/img/icons/svg/paper-bag.svg diff --git a/dependencies/flatUI/img/icons/svg/pencils.svg b/js/dependencies/flatUI/img/icons/svg/pencils.svg similarity index 100% rename from dependencies/flatUI/img/icons/svg/pencils.svg rename to js/dependencies/flatUI/img/icons/svg/pencils.svg diff --git a/dependencies/flatUI/img/icons/svg/retina.svg b/js/dependencies/flatUI/img/icons/svg/retina.svg similarity index 100% rename from dependencies/flatUI/img/icons/svg/retina.svg rename to js/dependencies/flatUI/img/icons/svg/retina.svg diff --git a/dependencies/flatUI/img/icons/svg/ribbon.svg b/js/dependencies/flatUI/img/icons/svg/ribbon.svg similarity index 100% rename from dependencies/flatUI/img/icons/svg/ribbon.svg rename to js/dependencies/flatUI/img/icons/svg/ribbon.svg diff --git a/dependencies/flatUI/img/icons/svg/toilet-paper.svg b/js/dependencies/flatUI/img/icons/svg/toilet-paper.svg similarity index 100% rename from dependencies/flatUI/img/icons/svg/toilet-paper.svg rename to js/dependencies/flatUI/img/icons/svg/toilet-paper.svg diff --git a/dependencies/flatUI/img/login/icon.png b/js/dependencies/flatUI/img/login/icon.png similarity index 100% rename from dependencies/flatUI/img/login/icon.png rename to js/dependencies/flatUI/img/login/icon.png diff --git a/dependencies/flatUI/img/login/imac-2x.png b/js/dependencies/flatUI/img/login/imac-2x.png similarity index 100% rename from dependencies/flatUI/img/login/imac-2x.png rename to js/dependencies/flatUI/img/login/imac-2x.png diff --git a/dependencies/flatUI/img/login/imac.png b/js/dependencies/flatUI/img/login/imac.png similarity index 100% rename from dependencies/flatUI/img/login/imac.png rename to js/dependencies/flatUI/img/login/imac.png diff --git a/dependencies/flatUI/img/tile/ribbon-2x.png b/js/dependencies/flatUI/img/tile/ribbon-2x.png similarity index 100% rename from dependencies/flatUI/img/tile/ribbon-2x.png rename to js/dependencies/flatUI/img/tile/ribbon-2x.png diff --git a/dependencies/flatUI/img/tile/ribbon.png b/js/dependencies/flatUI/img/tile/ribbon.png similarity index 100% rename from dependencies/flatUI/img/tile/ribbon.png rename to js/dependencies/flatUI/img/tile/ribbon.png diff --git a/dependencies/flatUI/index.html b/js/dependencies/flatUI/index.html similarity index 72% rename from dependencies/flatUI/index.html rename to js/dependencies/flatUI/index.html index 0afe58bf25fa971a4415520908977ada7236b74e..60821bae5d734643be4167e27ad53f52039aebaf 100755 --- a/dependencies/flatUI/index.html +++ b/js/dependencies/flatUI/index.html @@ -6,10 +6,10 @@ <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- Loading Bootstrap --> - <link href="../flatUI/css/vendor/bootstrap.min.css" rel="stylesheet"> + <link href="css/vendor/bootstrap.min.css" rel="stylesheet"> <!-- Loading Flat UI --> - <link href="../flatUI/css/flat-ui.min.css" rel="stylesheet"> + <link href="css/flat-ui.min.css" rel="stylesheet"> <link rel="shortcut icon" href="img/favicon.ico"> @@ -27,10 +27,10 @@ <!-- jQuery (necessary for Flat UI's JavaScript plugins) --> - <script src="../flatUI/js/vendor/jquery.min.js"></script> + <script src="js/vendor/jquery.min.js"></script> <!-- Include all compiled plugins (below), or include individual files as needed --> - <script src="../flatUI/js/vendor/video.js"></script> - <script src="../flatUI/js/flat-ui.min.js"></script> + <script src="js/vendor/video.js"></script> + <script src="js/flat-ui.min.js"></script> </body> </html> diff --git a/dependencies/flatUI/js/flat-ui.js b/js/dependencies/flatUI/js/flat-ui.js similarity index 100% rename from dependencies/flatUI/js/flat-ui.js rename to js/dependencies/flatUI/js/flat-ui.js diff --git a/dependencies/flatUI/js/flat-ui.min.js b/js/dependencies/flatUI/js/flat-ui.min.js similarity index 100% rename from dependencies/flatUI/js/flat-ui.min.js rename to js/dependencies/flatUI/js/flat-ui.min.js diff --git a/dependencies/flatUI/js/vendor/html5shiv.js b/js/dependencies/flatUI/js/vendor/html5shiv.js similarity index 100% rename from dependencies/flatUI/js/vendor/html5shiv.js rename to js/dependencies/flatUI/js/vendor/html5shiv.js diff --git a/dependencies/flatUI/js/vendor/jquery.min.js b/js/dependencies/flatUI/js/vendor/jquery.min.js similarity index 100% rename from dependencies/flatUI/js/vendor/jquery.min.js rename to js/dependencies/flatUI/js/vendor/jquery.min.js diff --git a/dependencies/flatUI/js/vendor/jquery.min.map b/js/dependencies/flatUI/js/vendor/jquery.min.map similarity index 100% rename from dependencies/flatUI/js/vendor/jquery.min.map rename to js/dependencies/flatUI/js/vendor/jquery.min.map diff --git a/dependencies/flatUI/js/vendor/respond.min.js b/js/dependencies/flatUI/js/vendor/respond.min.js similarity index 100% rename from dependencies/flatUI/js/vendor/respond.min.js rename to js/dependencies/flatUI/js/vendor/respond.min.js diff --git a/dependencies/flatUI/js/vendor/video-js.swf b/js/dependencies/flatUI/js/vendor/video-js.swf similarity index 100% rename from dependencies/flatUI/js/vendor/video-js.swf rename to js/dependencies/flatUI/js/vendor/video-js.swf diff --git a/dependencies/flatUI/js/vendor/video.js b/js/dependencies/flatUI/js/vendor/video.js similarity index 100% rename from dependencies/flatUI/js/vendor/video.js rename to js/dependencies/flatUI/js/vendor/video.js diff --git a/dependencies/jquery-2.1.3.js b/js/dependencies/jquery-2.1.3.js similarity index 100% rename from dependencies/jquery-2.1.3.js rename to js/dependencies/jquery-2.1.3.js diff --git a/dependencies/jquery-2.1.3.min.js b/js/dependencies/jquery-2.1.3.min.js similarity index 100% rename from dependencies/jquery-2.1.3.min.js rename to js/dependencies/jquery-2.1.3.min.js diff --git a/dependencies/jquery-2.1.3.min.map b/js/dependencies/jquery-2.1.3.min.map similarity index 100% rename from dependencies/jquery-2.1.3.min.map rename to js/dependencies/jquery-2.1.3.min.map diff --git a/dependencies/loaders/FileSaver.min.js b/js/dependencies/loaders/FileSaver.min.js similarity index 100% rename from dependencies/loaders/FileSaver.min.js rename to js/dependencies/loaders/FileSaver.min.js diff --git a/dependencies/loaders/OBJLoader.js b/js/dependencies/loaders/OBJLoader.js similarity index 100% rename from dependencies/loaders/OBJLoader.js rename to js/dependencies/loaders/OBJLoader.js diff --git a/dependencies/loaders/STLLoader.js b/js/dependencies/loaders/STLLoader.js similarity index 100% rename from dependencies/loaders/STLLoader.js rename to js/dependencies/loaders/STLLoader.js diff --git a/dependencies/loaders/SVGLoader.js b/js/dependencies/loaders/SVGLoader.js similarity index 100% rename from dependencies/loaders/SVGLoader.js rename to js/dependencies/loaders/SVGLoader.js diff --git a/dependencies/numeric-1.2.6.js b/js/dependencies/numeric-1.2.6.js similarity index 100% rename from dependencies/numeric-1.2.6.js rename to js/dependencies/numeric-1.2.6.js diff --git a/dependencies/numeric-1.2.6.min.js b/js/dependencies/numeric-1.2.6.min.js similarity index 100% rename from dependencies/numeric-1.2.6.min.js rename to js/dependencies/numeric-1.2.6.min.js diff --git a/js/dependencies/require.js b/js/dependencies/require.js new file mode 100644 index 0000000000000000000000000000000000000000..36280477eed7ceafb3f593c29ad9428f3a9b5a8a --- /dev/null +++ b/js/dependencies/require.js @@ -0,0 +1,2087 @@ +/** vim: et:ts=4:sw=4:sts=4 + * @license RequireJS 2.1.18 Copyright (c) 2010-2015, The Dojo Foundation All Rights Reserved. + * Available via the MIT or new BSD license. + * see: http://github.com/jrburke/requirejs for details + */ +//Not using strict: uneven strict support in browsers, #392, and causes +//problems with requirejs.exec()/transpiler plugins that may not be strict. +/*jslint regexp: true, nomen: true, sloppy: true */ +/*global window, navigator, document, importScripts, setTimeout, opera */ + +var requirejs, require, define; +(function (global) { + var req, s, head, baseElement, dataMain, src, + interactiveScript, currentlyAddingScript, mainScript, subPath, + version = '2.1.18', + commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg, + cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g, + jsSuffixRegExp = /\.js$/, + currDirRegExp = /^\.\//, + op = Object.prototype, + ostring = op.toString, + hasOwn = op.hasOwnProperty, + ap = Array.prototype, + apsp = ap.splice, + isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && window.document), + isWebWorker = !isBrowser && typeof importScripts !== 'undefined', + //PS3 indicates loaded and complete, but need to wait for complete + //specifically. Sequence is 'loading', 'loaded', execution, + // then 'complete'. The UA check is unfortunate, but not sure how + //to feature test w/o causing perf issues. + readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ? + /^complete$/ : /^(complete|loaded)$/, + defContextName = '_', + //Oh the tragedy, detecting opera. See the usage of isOpera for reason. + isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]', + contexts = {}, + cfg = {}, + globalDefQueue = [], + useInteractive = false; + + function isFunction(it) { + return ostring.call(it) === '[object Function]'; + } + + function isArray(it) { + return ostring.call(it) === '[object Array]'; + } + + /** + * Helper function for iterating over an array. If the func returns + * a true value, it will break out of the loop. + */ + function each(ary, func) { + if (ary) { + var i; + for (i = 0; i < ary.length; i += 1) { + if (ary[i] && func(ary[i], i, ary)) { + break; + } + } + } + } + + /** + * Helper function for iterating over an array backwards. If the func + * returns a true value, it will break out of the loop. + */ + function eachReverse(ary, func) { + if (ary) { + var i; + for (i = ary.length - 1; i > -1; i -= 1) { + if (ary[i] && func(ary[i], i, ary)) { + break; + } + } + } + } + + function hasProp(obj, prop) { + return hasOwn.call(obj, prop); + } + + function getOwn(obj, prop) { + return hasProp(obj, prop) && obj[prop]; + } + + /** + * Cycles over properties in an object and calls a function for each + * property value. If the function returns a truthy value, then the + * iteration is stopped. + */ + function eachProp(obj, func) { + var prop; + for (prop in obj) { + if (hasProp(obj, prop)) { + if (func(obj[prop], prop)) { + break; + } + } + } + } + + /** + * Simple function to mix in properties from source into target, + * but only if target does not already have a property of the same name. + */ + function mixin(target, source, force, deepStringMixin) { + if (source) { + eachProp(source, function (value, prop) { + if (force || !hasProp(target, prop)) { + if (deepStringMixin && typeof value === 'object' && value && + !isArray(value) && !isFunction(value) && + !(value instanceof RegExp)) { + + if (!target[prop]) { + target[prop] = {}; + } + mixin(target[prop], value, force, deepStringMixin); + } else { + target[prop] = value; + } + } + }); + } + return target; + } + + //Similar to Function.prototype.bind, but the 'this' object is specified + //first, since it is easier to read/figure out what 'this' will be. + function bind(obj, fn) { + return function () { + return fn.apply(obj, arguments); + }; + } + + function scripts() { + return document.getElementsByTagName('script'); + } + + function defaultOnError(err) { + throw err; + } + + //Allow getting a global that is expressed in + //dot notation, like 'a.b.c'. + function getGlobal(value) { + if (!value) { + return value; + } + var g = global; + each(value.split('.'), function (part) { + g = g[part]; + }); + return g; + } + + /** + * Constructs an error with a pointer to an URL with more information. + * @param {String} id the error ID that maps to an ID on a web page. + * @param {String} message human readable error. + * @param {Error} [err] the original error, if there is one. + * + * @returns {Error} + */ + function makeError(id, msg, err, requireModules) { + var e = new Error(msg + '\nhttp://requirejs.org/docs/errors.html#' + id); + e.requireType = id; + e.requireModules = requireModules; + if (err) { + e.originalError = err; + } + return e; + } + + if (typeof define !== 'undefined') { + //If a define is already in play via another AMD loader, + //do not overwrite. + return; + } + + if (typeof requirejs !== 'undefined') { + if (isFunction(requirejs)) { + //Do not overwrite an existing requirejs instance. + return; + } + cfg = requirejs; + requirejs = undefined; + } + + //Allow for a require config object + if (typeof require !== 'undefined' && !isFunction(require)) { + //assume it is a config object. + cfg = require; + require = undefined; + } + + function newContext(contextName) { + var inCheckLoaded, Module, context, handlers, + checkLoadedTimeoutId, + config = { + //Defaults. Do not set a default for map + //config to speed up normalize(), which + //will run faster if there is no default. + waitSeconds: 7, + baseUrl: './', + paths: {}, + bundles: {}, + pkgs: {}, + shim: {}, + config: {} + }, + registry = {}, + //registry of just enabled modules, to speed + //cycle breaking code when lots of modules + //are registered, but not activated. + enabledRegistry = {}, + undefEvents = {}, + defQueue = [], + defined = {}, + urlFetched = {}, + bundlesMap = {}, + requireCounter = 1, + unnormalizedCounter = 1; + + /** + * Trims the . and .. from an array of path segments. + * It will keep a leading path segment if a .. will become + * the first path segment, to help with module name lookups, + * which act like paths, but can be remapped. But the end result, + * all paths that use this function should look normalized. + * NOTE: this method MODIFIES the input array. + * @param {Array} ary the array of path segments. + */ + function trimDots(ary) { + var i, part; + for (i = 0; i < ary.length; i++) { + part = ary[i]; + if (part === '.') { + ary.splice(i, 1); + i -= 1; + } else if (part === '..') { + // If at the start, or previous value is still .., + // keep them so that when converted to a path it may + // still work when converted to a path, even though + // as an ID it is less than ideal. In larger point + // releases, may be better to just kick out an error. + if (i === 0 || (i === 1 && ary[2] === '..') || ary[i - 1] === '..') { + continue; + } else if (i > 0) { + ary.splice(i - 1, 2); + i -= 2; + } + } + } + } + + /** + * Given a relative module name, like ./something, normalize it to + * a real name that can be mapped to a path. + * @param {String} name the relative name + * @param {String} baseName a real name that the name arg is relative + * to. + * @param {Boolean} applyMap apply the map config to the value. Should + * only be done if this normalization is for a dependency ID. + * @returns {String} normalized name + */ + function normalize(name, baseName, applyMap) { + var pkgMain, mapValue, nameParts, i, j, nameSegment, lastIndex, + foundMap, foundI, foundStarMap, starI, normalizedBaseParts, + baseParts = (baseName && baseName.split('/')), + map = config.map, + starMap = map && map['*']; + + //Adjust any relative paths. + if (name) { + name = name.split('/'); + lastIndex = name.length - 1; + + // If wanting node ID compatibility, strip .js from end + // of IDs. Have to do this here, and not in nameToUrl + // because node allows either .js or non .js to map + // to same file. + if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { + name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); + } + + // Starts with a '.' so need the baseName + if (name[0].charAt(0) === '.' && baseParts) { + //Convert baseName to array, and lop off the last part, + //so that . matches that 'directory' and not name of the baseName's + //module. For instance, baseName of 'one/two/three', maps to + //'one/two/three.js', but we want the directory, 'one/two' for + //this normalization. + normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); + name = normalizedBaseParts.concat(name); + } + + trimDots(name); + name = name.join('/'); + } + + //Apply map config if available. + if (applyMap && map && (baseParts || starMap)) { + nameParts = name.split('/'); + + outerLoop: for (i = nameParts.length; i > 0; i -= 1) { + nameSegment = nameParts.slice(0, i).join('/'); + + if (baseParts) { + //Find the longest baseName segment match in the config. + //So, do joins on the biggest to smallest lengths of baseParts. + for (j = baseParts.length; j > 0; j -= 1) { + mapValue = getOwn(map, baseParts.slice(0, j).join('/')); + + //baseName segment has config, find if it has one for + //this name. + if (mapValue) { + mapValue = getOwn(mapValue, nameSegment); + if (mapValue) { + //Match, update name to the new value. + foundMap = mapValue; + foundI = i; + break outerLoop; + } + } + } + } + + //Check for a star map match, but just hold on to it, + //if there is a shorter segment match later in a matching + //config, then favor over this star map. + if (!foundStarMap && starMap && getOwn(starMap, nameSegment)) { + foundStarMap = getOwn(starMap, nameSegment); + starI = i; + } + } + + if (!foundMap && foundStarMap) { + foundMap = foundStarMap; + foundI = starI; + } + + if (foundMap) { + nameParts.splice(0, foundI, foundMap); + name = nameParts.join('/'); + } + } + + // If the name points to a package's name, use + // the package main instead. + pkgMain = getOwn(config.pkgs, name); + + return pkgMain ? pkgMain : name; + } + + function removeScript(name) { + if (isBrowser) { + each(scripts(), function (scriptNode) { + if (scriptNode.getAttribute('data-requiremodule') === name && + scriptNode.getAttribute('data-requirecontext') === context.contextName) { + scriptNode.parentNode.removeChild(scriptNode); + return true; + } + }); + } + } + + function hasPathFallback(id) { + var pathConfig = getOwn(config.paths, id); + if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) { + //Pop off the first array value, since it failed, and + //retry + pathConfig.shift(); + context.require.undef(id); + + //Custom require that does not do map translation, since + //ID is "absolute", already mapped/resolved. + context.makeRequire(null, { + skipMap: true + })([id]); + + return true; + } + } + + //Turns a plugin!resource to [plugin, resource] + //with the plugin being undefined if the name + //did not have a plugin prefix. + function splitPrefix(name) { + var prefix, + index = name ? name.indexOf('!') : -1; + if (index > -1) { + prefix = name.substring(0, index); + name = name.substring(index + 1, name.length); + } + return [prefix, name]; + } + + /** + * Creates a module mapping that includes plugin prefix, module + * name, and path. If parentModuleMap is provided it will + * also normalize the name via require.normalize() + * + * @param {String} name the module name + * @param {String} [parentModuleMap] parent module map + * for the module name, used to resolve relative names. + * @param {Boolean} isNormalized: is the ID already normalized. + * This is true if this call is done for a define() module ID. + * @param {Boolean} applyMap: apply the map config to the ID. + * Should only be true if this map is for a dependency. + * + * @returns {Object} + */ + function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) { + var url, pluginModule, suffix, nameParts, + prefix = null, + parentName = parentModuleMap ? parentModuleMap.name : null, + originalName = name, + isDefine = true, + normalizedName = ''; + + //If no name, then it means it is a require call, generate an + //internal name. + if (!name) { + isDefine = false; + name = '_@r' + (requireCounter += 1); + } + + nameParts = splitPrefix(name); + prefix = nameParts[0]; + name = nameParts[1]; + + if (prefix) { + prefix = normalize(prefix, parentName, applyMap); + pluginModule = getOwn(defined, prefix); + } + + //Account for relative paths if there is a base name. + if (name) { + if (prefix) { + if (pluginModule && pluginModule.normalize) { + //Plugin is loaded, use its normalize method. + normalizedName = pluginModule.normalize(name, function (name) { + return normalize(name, parentName, applyMap); + }); + } else { + // If nested plugin references, then do not try to + // normalize, as it will not normalize correctly. This + // places a restriction on resourceIds, and the longer + // term solution is not to normalize until plugins are + // loaded and all normalizations to allow for async + // loading of a loader plugin. But for now, fixes the + // common uses. Details in #1131 + normalizedName = name.indexOf('!') === -1 ? + normalize(name, parentName, applyMap) : + name; + } + } else { + //A regular module. + normalizedName = normalize(name, parentName, applyMap); + + //Normalized name may be a plugin ID due to map config + //application in normalize. The map config values must + //already be normalized, so do not need to redo that part. + nameParts = splitPrefix(normalizedName); + prefix = nameParts[0]; + normalizedName = nameParts[1]; + isNormalized = true; + + url = context.nameToUrl(normalizedName); + } + } + + //If the id is a plugin id that cannot be determined if it needs + //normalization, stamp it with a unique ID so two matching relative + //ids that may conflict can be separate. + suffix = prefix && !pluginModule && !isNormalized ? + '_unnormalized' + (unnormalizedCounter += 1) : + ''; + + return { + prefix: prefix, + name: normalizedName, + parentMap: parentModuleMap, + unnormalized: !!suffix, + url: url, + originalName: originalName, + isDefine: isDefine, + id: (prefix ? + prefix + '!' + normalizedName : + normalizedName) + suffix + }; + } + + function getModule(depMap) { + var id = depMap.id, + mod = getOwn(registry, id); + + if (!mod) { + mod = registry[id] = new context.Module(depMap); + } + + return mod; + } + + function on(depMap, name, fn) { + var id = depMap.id, + mod = getOwn(registry, id); + + if (hasProp(defined, id) && + (!mod || mod.defineEmitComplete)) { + if (name === 'defined') { + fn(defined[id]); + } + } else { + mod = getModule(depMap); + if (mod.error && name === 'error') { + fn(mod.error); + } else { + mod.on(name, fn); + } + } + } + + function onError(err, errback) { + var ids = err.requireModules, + notified = false; + + if (errback) { + errback(err); + } else { + each(ids, function (id) { + var mod = getOwn(registry, id); + if (mod) { + //Set error on module, so it skips timeout checks. + mod.error = err; + if (mod.events.error) { + notified = true; + mod.emit('error', err); + } + } + }); + + if (!notified) { + req.onError(err); + } + } + } + + /** + * Internal method to transfer globalQueue items to this context's + * defQueue. + */ + function takeGlobalQueue() { + //Push all the globalDefQueue items into the context's defQueue + if (globalDefQueue.length) { + //Array splice in the values since the context code has a + //local var ref to defQueue, so cannot just reassign the one + //on context. + apsp.apply(defQueue, + [defQueue.length, 0].concat(globalDefQueue)); + globalDefQueue = []; + } + } + + handlers = { + 'require': function (mod) { + if (mod.require) { + return mod.require; + } else { + return (mod.require = context.makeRequire(mod.map)); + } + }, + 'exports': function (mod) { + mod.usingExports = true; + if (mod.map.isDefine) { + if (mod.exports) { + return (defined[mod.map.id] = mod.exports); + } else { + return (mod.exports = defined[mod.map.id] = {}); + } + } + }, + 'module': function (mod) { + if (mod.module) { + return mod.module; + } else { + return (mod.module = { + id: mod.map.id, + uri: mod.map.url, + config: function () { + return getOwn(config.config, mod.map.id) || {}; + }, + exports: mod.exports || (mod.exports = {}) + }); + } + } + }; + + function cleanRegistry(id) { + //Clean up machinery used for waiting modules. + delete registry[id]; + delete enabledRegistry[id]; + } + + function breakCycle(mod, traced, processed) { + var id = mod.map.id; + + if (mod.error) { + mod.emit('error', mod.error); + } else { + traced[id] = true; + each(mod.depMaps, function (depMap, i) { + var depId = depMap.id, + dep = getOwn(registry, depId); + + //Only force things that have not completed + //being defined, so still in the registry, + //and only if it has not been matched up + //in the module already. + if (dep && !mod.depMatched[i] && !processed[depId]) { + if (getOwn(traced, depId)) { + mod.defineDep(i, defined[depId]); + mod.check(); //pass false? + } else { + breakCycle(dep, traced, processed); + } + } + }); + processed[id] = true; + } + } + + function checkLoaded() { + var err, usingPathFallback, + waitInterval = config.waitSeconds * 1000, + //It is possible to disable the wait interval by using waitSeconds of 0. + expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(), + noLoads = [], + reqCalls = [], + stillLoading = false, + needCycleCheck = true; + + //Do not bother if this call was a result of a cycle break. + if (inCheckLoaded) { + return; + } + + inCheckLoaded = true; + + //Figure out the state of all the modules. + eachProp(enabledRegistry, function (mod) { + var map = mod.map, + modId = map.id; + + //Skip things that are not enabled or in error state. + if (!mod.enabled) { + return; + } + + if (!map.isDefine) { + reqCalls.push(mod); + } + + if (!mod.error) { + //If the module should be executed, and it has not + //been inited and time is up, remember it. + if (!mod.inited && expired) { + if (hasPathFallback(modId)) { + usingPathFallback = true; + stillLoading = true; + } else { + noLoads.push(modId); + removeScript(modId); + } + } else if (!mod.inited && mod.fetched && map.isDefine) { + stillLoading = true; + if (!map.prefix) { + //No reason to keep looking for unfinished + //loading. If the only stillLoading is a + //plugin resource though, keep going, + //because it may be that a plugin resource + //is waiting on a non-plugin cycle. + return (needCycleCheck = false); + } + } + } + }); + + if (expired && noLoads.length) { + //If wait time expired, throw error of unloaded modules. + err = makeError('timeout', 'Load timeout for modules: ' + noLoads, null, noLoads); + err.contextName = context.contextName; + return onError(err); + } + + //Not expired, check for a cycle. + if (needCycleCheck) { + each(reqCalls, function (mod) { + breakCycle(mod, {}, {}); + }); + } + + //If still waiting on loads, and the waiting load is something + //other than a plugin resource, or there are still outstanding + //scripts, then just try back later. + if ((!expired || usingPathFallback) && stillLoading) { + //Something is still waiting to load. Wait for it, but only + //if a timeout is not already in effect. + if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) { + checkLoadedTimeoutId = setTimeout(function () { + checkLoadedTimeoutId = 0; + checkLoaded(); + }, 50); + } + } + + inCheckLoaded = false; + } + + Module = function (map) { + this.events = getOwn(undefEvents, map.id) || {}; + this.map = map; + this.shim = getOwn(config.shim, map.id); + this.depExports = []; + this.depMaps = []; + this.depMatched = []; + this.pluginMaps = {}; + this.depCount = 0; + + /* this.exports this.factory + this.depMaps = [], + this.enabled, this.fetched + */ + }; + + Module.prototype = { + init: function (depMaps, factory, errback, options) { + options = options || {}; + + //Do not do more inits if already done. Can happen if there + //are multiple define calls for the same module. That is not + //a normal, common case, but it is also not unexpected. + if (this.inited) { + return; + } + + this.factory = factory; + + if (errback) { + //Register for errors on this module. + this.on('error', errback); + } else if (this.events.error) { + //If no errback already, but there are error listeners + //on this module, set up an errback to pass to the deps. + errback = bind(this, function (err) { + this.emit('error', err); + }); + } + + //Do a copy of the dependency array, so that + //source inputs are not modified. For example + //"shim" deps are passed in here directly, and + //doing a direct modification of the depMaps array + //would affect that config. + this.depMaps = depMaps && depMaps.slice(0); + + this.errback = errback; + + //Indicate this module has be initialized + this.inited = true; + + this.ignore = options.ignore; + + //Could have option to init this module in enabled mode, + //or could have been previously marked as enabled. However, + //the dependencies are not known until init is called. So + //if enabled previously, now trigger dependencies as enabled. + if (options.enabled || this.enabled) { + //Enable this module and dependencies. + //Will call this.check() + this.enable(); + } else { + this.check(); + } + }, + + defineDep: function (i, depExports) { + //Because of cycles, defined callback for a given + //export can be called more than once. + if (!this.depMatched[i]) { + this.depMatched[i] = true; + this.depCount -= 1; + this.depExports[i] = depExports; + } + }, + + fetch: function () { + if (this.fetched) { + return; + } + this.fetched = true; + + context.startTime = (new Date()).getTime(); + + var map = this.map; + + //If the manager is for a plugin managed resource, + //ask the plugin to load it now. + if (this.shim) { + context.makeRequire(this.map, { + enableBuildCallback: true + })(this.shim.deps || [], bind(this, function () { + return map.prefix ? this.callPlugin() : this.load(); + })); + } else { + //Regular dependency. + return map.prefix ? this.callPlugin() : this.load(); + } + }, + + load: function () { + var url = this.map.url; + + //Regular dependency. + if (!urlFetched[url]) { + urlFetched[url] = true; + context.load(this.map.id, url); + } + }, + + /** + * Checks if the module is ready to define itself, and if so, + * define it. + */ + check: function () { + if (!this.enabled || this.enabling) { + return; + } + + var err, cjsModule, + id = this.map.id, + depExports = this.depExports, + exports = this.exports, + factory = this.factory; + + if (!this.inited) { + this.fetch(); + } else if (this.error) { + this.emit('error', this.error); + } else if (!this.defining) { + //The factory could trigger another require call + //that would result in checking this module to + //define itself again. If already in the process + //of doing that, skip this work. + this.defining = true; + + if (this.depCount < 1 && !this.defined) { + if (isFunction(factory)) { + //If there is an error listener, favor passing + //to that instead of throwing an error. However, + //only do it for define()'d modules. require + //errbacks should not be called for failures in + //their callbacks (#699). However if a global + //onError is set, use that. + if ((this.events.error && this.map.isDefine) || + req.onError !== defaultOnError) { + try { + exports = context.execCb(id, factory, depExports, exports); + } catch (e) { + err = e; + } + } else { + exports = context.execCb(id, factory, depExports, exports); + } + + // Favor return value over exports. If node/cjs in play, + // then will not have a return value anyway. Favor + // module.exports assignment over exports object. + if (this.map.isDefine && exports === undefined) { + cjsModule = this.module; + if (cjsModule) { + exports = cjsModule.exports; + } else if (this.usingExports) { + //exports already set the defined value. + exports = this.exports; + } + } + + if (err) { + err.requireMap = this.map; + err.requireModules = this.map.isDefine ? [this.map.id] : null; + err.requireType = this.map.isDefine ? 'define' : 'require'; + return onError((this.error = err)); + } + + } else { + //Just a literal value + exports = factory; + } + + this.exports = exports; + + if (this.map.isDefine && !this.ignore) { + defined[id] = exports; + + if (req.onResourceLoad) { + req.onResourceLoad(context, this.map, this.depMaps); + } + } + + //Clean up + cleanRegistry(id); + + this.defined = true; + } + + //Finished the define stage. Allow calling check again + //to allow define notifications below in the case of a + //cycle. + this.defining = false; + + if (this.defined && !this.defineEmitted) { + this.defineEmitted = true; + this.emit('defined', this.exports); + this.defineEmitComplete = true; + } + + } + }, + + callPlugin: function () { + var map = this.map, + id = map.id, + //Map already normalized the prefix. + pluginMap = makeModuleMap(map.prefix); + + //Mark this as a dependency for this plugin, so it + //can be traced for cycles. + this.depMaps.push(pluginMap); + + on(pluginMap, 'defined', bind(this, function (plugin) { + var load, normalizedMap, normalizedMod, + bundleId = getOwn(bundlesMap, this.map.id), + name = this.map.name, + parentName = this.map.parentMap ? this.map.parentMap.name : null, + localRequire = context.makeRequire(map.parentMap, { + enableBuildCallback: true + }); + + //If current map is not normalized, wait for that + //normalized name to load instead of continuing. + if (this.map.unnormalized) { + //Normalize the ID if the plugin allows it. + if (plugin.normalize) { + name = plugin.normalize(name, function (name) { + return normalize(name, parentName, true); + }) || ''; + } + + //prefix and name should already be normalized, no need + //for applying map config again either. + normalizedMap = makeModuleMap(map.prefix + '!' + name, + this.map.parentMap); + on(normalizedMap, + 'defined', bind(this, function (value) { + this.init([], function () { return value; }, null, { + enabled: true, + ignore: true + }); + })); + + normalizedMod = getOwn(registry, normalizedMap.id); + if (normalizedMod) { + //Mark this as a dependency for this plugin, so it + //can be traced for cycles. + this.depMaps.push(normalizedMap); + + if (this.events.error) { + normalizedMod.on('error', bind(this, function (err) { + this.emit('error', err); + })); + } + normalizedMod.enable(); + } + + return; + } + + //If a paths config, then just load that file instead to + //resolve the plugin, as it is built into that paths layer. + if (bundleId) { + this.map.url = context.nameToUrl(bundleId); + this.load(); + return; + } + + load = bind(this, function (value) { + this.init([], function () { return value; }, null, { + enabled: true + }); + }); + + load.error = bind(this, function (err) { + this.inited = true; + this.error = err; + err.requireModules = [id]; + + //Remove temp unnormalized modules for this module, + //since they will never be resolved otherwise now. + eachProp(registry, function (mod) { + if (mod.map.id.indexOf(id + '_unnormalized') === 0) { + cleanRegistry(mod.map.id); + } + }); + + onError(err); + }); + + //Allow plugins to load other code without having to know the + //context or how to 'complete' the load. + load.fromText = bind(this, function (text, textAlt) { + /*jslint evil: true */ + var moduleName = map.name, + moduleMap = makeModuleMap(moduleName), + hasInteractive = useInteractive; + + //As of 2.1.0, support just passing the text, to reinforce + //fromText only being called once per resource. Still + //support old style of passing moduleName but discard + //that moduleName in favor of the internal ref. + if (textAlt) { + text = textAlt; + } + + //Turn off interactive script matching for IE for any define + //calls in the text, then turn it back on at the end. + if (hasInteractive) { + useInteractive = false; + } + + //Prime the system by creating a module instance for + //it. + getModule(moduleMap); + + //Transfer any config to this other module. + if (hasProp(config.config, id)) { + config.config[moduleName] = config.config[id]; + } + + try { + req.exec(text); + } catch (e) { + return onError(makeError('fromtexteval', + 'fromText eval for ' + id + + ' failed: ' + e, + e, + [id])); + } + + if (hasInteractive) { + useInteractive = true; + } + + //Mark this as a dependency for the plugin + //resource + this.depMaps.push(moduleMap); + + //Support anonymous modules. + context.completeLoad(moduleName); + + //Bind the value of that module to the value for this + //resource ID. + localRequire([moduleName], load); + }); + + //Use parentName here since the plugin's name is not reliable, + //could be some weird string with no path that actually wants to + //reference the parentName's path. + plugin.load(map.name, localRequire, load, config); + })); + + context.enable(pluginMap, this); + this.pluginMaps[pluginMap.id] = pluginMap; + }, + + enable: function () { + enabledRegistry[this.map.id] = this; + this.enabled = true; + + //Set flag mentioning that the module is enabling, + //so that immediate calls to the defined callbacks + //for dependencies do not trigger inadvertent load + //with the depCount still being zero. + this.enabling = true; + + //Enable each dependency + each(this.depMaps, bind(this, function (depMap, i) { + var id, mod, handler; + + if (typeof depMap === 'string') { + //Dependency needs to be converted to a depMap + //and wired up to this module. + depMap = makeModuleMap(depMap, + (this.map.isDefine ? this.map : this.map.parentMap), + false, + !this.skipMap); + this.depMaps[i] = depMap; + + handler = getOwn(handlers, depMap.id); + + if (handler) { + this.depExports[i] = handler(this); + return; + } + + this.depCount += 1; + + on(depMap, 'defined', bind(this, function (depExports) { + if (this.undefed) { + return; + } + this.defineDep(i, depExports); + this.check(); + })); + + if (this.errback) { + on(depMap, 'error', bind(this, this.errback)); + } else if (this.events.error) { + // No direct errback on this module, but something + // else is listening for errors, so be sure to + // propagate the error correctly. + on(depMap, 'error', bind(this, function(err) { + this.emit('error', err); + })); + } + } + + id = depMap.id; + mod = registry[id]; + + //Skip special modules like 'require', 'exports', 'module' + //Also, don't call enable if it is already enabled, + //important in circular dependency cases. + if (!hasProp(handlers, id) && mod && !mod.enabled) { + context.enable(depMap, this); + } + })); + + //Enable each plugin that is used in + //a dependency + eachProp(this.pluginMaps, bind(this, function (pluginMap) { + var mod = getOwn(registry, pluginMap.id); + if (mod && !mod.enabled) { + context.enable(pluginMap, this); + } + })); + + this.enabling = false; + + this.check(); + }, + + on: function (name, cb) { + var cbs = this.events[name]; + if (!cbs) { + cbs = this.events[name] = []; + } + cbs.push(cb); + }, + + emit: function (name, evt) { + each(this.events[name], function (cb) { + cb(evt); + }); + if (name === 'error') { + //Now that the error handler was triggered, remove + //the listeners, since this broken Module instance + //can stay around for a while in the registry. + delete this.events[name]; + } + } + }; + + function callGetModule(args) { + //Skip modules already defined. + if (!hasProp(defined, args[0])) { + getModule(makeModuleMap(args[0], null, true)).init(args[1], args[2]); + } + } + + function removeListener(node, func, name, ieName) { + //Favor detachEvent because of IE9 + //issue, see attachEvent/addEventListener comment elsewhere + //in this file. + if (node.detachEvent && !isOpera) { + //Probably IE. If not it will throw an error, which will be + //useful to know. + if (ieName) { + node.detachEvent(ieName, func); + } + } else { + node.removeEventListener(name, func, false); + } + } + + /** + * Given an event from a script node, get the requirejs info from it, + * and then removes the event listeners on the node. + * @param {Event} evt + * @returns {Object} + */ + function getScriptData(evt) { + //Using currentTarget instead of target for Firefox 2.0's sake. Not + //all old browsers will be supported, but this one was easy enough + //to support and still makes sense. + var node = evt.currentTarget || evt.srcElement; + + //Remove the listeners once here. + removeListener(node, context.onScriptLoad, 'load', 'onreadystatechange'); + removeListener(node, context.onScriptError, 'error'); + + return { + node: node, + id: node && node.getAttribute('data-requiremodule') + }; + } + + function intakeDefines() { + var args; + + //Any defined modules in the global queue, intake them now. + takeGlobalQueue(); + + //Make sure any remaining defQueue items get properly processed. + while (defQueue.length) { + args = defQueue.shift(); + if (args[0] === null) { + return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + + args[args.length - 1])); + } else { + //args are id, deps, factory. Should be normalized by the + //define() function. + callGetModule(args); + } + } + } + + context = { + config: config, + contextName: contextName, + registry: registry, + defined: defined, + urlFetched: urlFetched, + defQueue: defQueue, + Module: Module, + makeModuleMap: makeModuleMap, + nextTick: req.nextTick, + onError: onError, + + /** + * Set a configuration for the context. + * @param {Object} cfg config object to integrate. + */ + configure: function (cfg) { + //Make sure the baseUrl ends in a slash. + if (cfg.baseUrl) { + if (cfg.baseUrl.charAt(cfg.baseUrl.length - 1) !== '/') { + cfg.baseUrl += '/'; + } + } + + //Save off the paths since they require special processing, + //they are additive. + var shim = config.shim, + objs = { + paths: true, + bundles: true, + config: true, + map: true + }; + + eachProp(cfg, function (value, prop) { + if (objs[prop]) { + if (!config[prop]) { + config[prop] = {}; + } + mixin(config[prop], value, true, true); + } else { + config[prop] = value; + } + }); + + //Reverse map the bundles + if (cfg.bundles) { + eachProp(cfg.bundles, function (value, prop) { + each(value, function (v) { + if (v !== prop) { + bundlesMap[v] = prop; + } + }); + }); + } + + //Merge shim + if (cfg.shim) { + eachProp(cfg.shim, function (value, id) { + //Normalize the structure + if (isArray(value)) { + value = { + deps: value + }; + } + if ((value.exports || value.init) && !value.exportsFn) { + value.exportsFn = context.makeShimExports(value); + } + shim[id] = value; + }); + config.shim = shim; + } + + //Adjust packages if necessary. + if (cfg.packages) { + each(cfg.packages, function (pkgObj) { + var location, name; + + pkgObj = typeof pkgObj === 'string' ? {name: pkgObj} : pkgObj; + + name = pkgObj.name; + location = pkgObj.location; + if (location) { + config.paths[name] = pkgObj.location; + } + + //Save pointer to main module ID for pkg name. + //Remove leading dot in main, so main paths are normalized, + //and remove any trailing .js, since different package + //envs have different conventions: some use a module name, + //some use a file name. + config.pkgs[name] = pkgObj.name + '/' + (pkgObj.main || 'main') + .replace(currDirRegExp, '') + .replace(jsSuffixRegExp, ''); + }); + } + + //If there are any "waiting to execute" modules in the registry, + //update the maps for them, since their info, like URLs to load, + //may have changed. + eachProp(registry, function (mod, id) { + //If module already has init called, since it is too + //late to modify them, and ignore unnormalized ones + //since they are transient. + if (!mod.inited && !mod.map.unnormalized) { + mod.map = makeModuleMap(id, null, true); + } + }); + + //If a deps array or a config callback is specified, then call + //require with those args. This is useful when require is defined as a + //config object before require.js is loaded. + if (cfg.deps || cfg.callback) { + context.require(cfg.deps || [], cfg.callback); + } + }, + + makeShimExports: function (value) { + function fn() { + var ret; + if (value.init) { + ret = value.init.apply(global, arguments); + } + return ret || (value.exports && getGlobal(value.exports)); + } + return fn; + }, + + makeRequire: function (relMap, options) { + options = options || {}; + + function localRequire(deps, callback, errback) { + var id, map, requireMod; + + if (options.enableBuildCallback && callback && isFunction(callback)) { + callback.__requireJsBuild = true; + } + + if (typeof deps === 'string') { + if (isFunction(callback)) { + //Invalid call + return onError(makeError('requireargs', 'Invalid require call'), errback); + } + + //If require|exports|module are requested, get the + //value for them from the special handlers. Caveat: + //this only works while module is being defined. + if (relMap && hasProp(handlers, deps)) { + return handlers[deps](registry[relMap.id]); + } + + //Synchronous access to one module. If require.get is + //available (as in the Node adapter), prefer that. + if (req.get) { + return req.get(context, deps, relMap, localRequire); + } + + //Normalize module name, if it contains . or .. + map = makeModuleMap(deps, relMap, false, true); + id = map.id; + + if (!hasProp(defined, id)) { + return onError(makeError('notloaded', 'Module name "' + + id + + '" has not been loaded yet for context: ' + + contextName + + (relMap ? '' : '. Use require([])'))); + } + return defined[id]; + } + + //Grab defines waiting in the global queue. + intakeDefines(); + + //Mark all the dependencies as needing to be loaded. + context.nextTick(function () { + //Some defines could have been added since the + //require call, collect them. + intakeDefines(); + + requireMod = getModule(makeModuleMap(null, relMap)); + + //Store if map config should be applied to this require + //call for dependencies. + requireMod.skipMap = options.skipMap; + + requireMod.init(deps, callback, errback, { + enabled: true + }); + + checkLoaded(); + }); + + return localRequire; + } + + mixin(localRequire, { + isBrowser: isBrowser, + + /** + * Converts a module name + .extension into an URL path. + * *Requires* the use of a module name. It does not support using + * plain URLs like nameToUrl. + */ + toUrl: function (moduleNamePlusExt) { + var ext, + index = moduleNamePlusExt.lastIndexOf('.'), + segment = moduleNamePlusExt.split('/')[0], + isRelative = segment === '.' || segment === '..'; + + //Have a file extension alias, and it is not the + //dots from a relative path. + if (index !== -1 && (!isRelative || index > 1)) { + ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length); + moduleNamePlusExt = moduleNamePlusExt.substring(0, index); + } + + return context.nameToUrl(normalize(moduleNamePlusExt, + relMap && relMap.id, true), ext, true); + }, + + defined: function (id) { + return hasProp(defined, makeModuleMap(id, relMap, false, true).id); + }, + + specified: function (id) { + id = makeModuleMap(id, relMap, false, true).id; + return hasProp(defined, id) || hasProp(registry, id); + } + }); + + //Only allow undef on top level require calls + if (!relMap) { + localRequire.undef = function (id) { + //Bind any waiting define() calls to this context, + //fix for #408 + takeGlobalQueue(); + + var map = makeModuleMap(id, relMap, true), + mod = getOwn(registry, id); + + mod.undefed = true; + removeScript(id); + + delete defined[id]; + delete urlFetched[map.url]; + delete undefEvents[id]; + + //Clean queued defines too. Go backwards + //in array so that the splices do not + //mess up the iteration. + eachReverse(defQueue, function(args, i) { + if (args[0] === id) { + defQueue.splice(i, 1); + } + }); + + if (mod) { + //Hold on to listeners in case the + //module will be attempted to be reloaded + //using a different config. + if (mod.events.defined) { + undefEvents[id] = mod.events; + } + + cleanRegistry(id); + } + }; + } + + return localRequire; + }, + + /** + * Called to enable a module if it is still in the registry + * awaiting enablement. A second arg, parent, the parent module, + * is passed in for context, when this method is overridden by + * the optimizer. Not shown here to keep code compact. + */ + enable: function (depMap) { + var mod = getOwn(registry, depMap.id); + if (mod) { + getModule(depMap).enable(); + } + }, + + /** + * Internal method used by environment adapters to complete a load event. + * A load event could be a script load or just a load pass from a synchronous + * load call. + * @param {String} moduleName the name of the module to potentially complete. + */ + completeLoad: function (moduleName) { + var found, args, mod, + shim = getOwn(config.shim, moduleName) || {}, + shExports = shim.exports; + + takeGlobalQueue(); + + while (defQueue.length) { + args = defQueue.shift(); + if (args[0] === null) { + args[0] = moduleName; + //If already found an anonymous module and bound it + //to this name, then this is some other anon module + //waiting for its completeLoad to fire. + if (found) { + break; + } + found = true; + } else if (args[0] === moduleName) { + //Found matching define call for this script! + found = true; + } + + callGetModule(args); + } + + //Do this after the cycle of callGetModule in case the result + //of those calls/init calls changes the registry. + mod = getOwn(registry, moduleName); + + if (!found && !hasProp(defined, moduleName) && mod && !mod.inited) { + if (config.enforceDefine && (!shExports || !getGlobal(shExports))) { + if (hasPathFallback(moduleName)) { + return; + } else { + return onError(makeError('nodefine', + 'No define call for ' + moduleName, + null, + [moduleName])); + } + } else { + //A script that does not call define(), so just simulate + //the call for it. + callGetModule([moduleName, (shim.deps || []), shim.exportsFn]); + } + } + + checkLoaded(); + }, + + /** + * Converts a module name to a file path. Supports cases where + * moduleName may actually be just an URL. + * Note that it **does not** call normalize on the moduleName, + * it is assumed to have already been normalized. This is an + * internal API, not a public one. Use toUrl for the public API. + */ + nameToUrl: function (moduleName, ext, skipExt) { + var paths, syms, i, parentModule, url, + parentPath, bundleId, + pkgMain = getOwn(config.pkgs, moduleName); + + if (pkgMain) { + moduleName = pkgMain; + } + + bundleId = getOwn(bundlesMap, moduleName); + + if (bundleId) { + return context.nameToUrl(bundleId, ext, skipExt); + } + + //If a colon is in the URL, it indicates a protocol is used and it is just + //an URL to a file, or if it starts with a slash, contains a query arg (i.e. ?) + //or ends with .js, then assume the user meant to use an url and not a module id. + //The slash is important for protocol-less URLs as well as full paths. + if (req.jsExtRegExp.test(moduleName)) { + //Just a plain path, not module name lookup, so just return it. + //Add extension if it is included. This is a bit wonky, only non-.js things pass + //an extension, this method probably needs to be reworked. + url = moduleName + (ext || ''); + } else { + //A module that needs to be converted to a path. + paths = config.paths; + + syms = moduleName.split('/'); + //For each module name segment, see if there is a path + //registered for it. Start with most specific name + //and work up from it. + for (i = syms.length; i > 0; i -= 1) { + parentModule = syms.slice(0, i).join('/'); + + parentPath = getOwn(paths, parentModule); + if (parentPath) { + //If an array, it means there are a few choices, + //Choose the one that is desired + if (isArray(parentPath)) { + parentPath = parentPath[0]; + } + syms.splice(0, i, parentPath); + break; + } + } + + //Join the path parts together, then figure out if baseUrl is needed. + url = syms.join('/'); + url += (ext || (/^data\:|\?/.test(url) || skipExt ? '' : '.js')); + url = (url.charAt(0) === '/' || url.match(/^[\w\+\.\-]+:/) ? '' : config.baseUrl) + url; + } + + return config.urlArgs ? url + + ((url.indexOf('?') === -1 ? '?' : '&') + + config.urlArgs) : url; + }, + + //Delegates to req.load. Broken out as a separate function to + //allow overriding in the optimizer. + load: function (id, url) { + req.load(context, id, url); + }, + + /** + * Executes a module callback function. Broken out as a separate function + * solely to allow the build system to sequence the files in the built + * layer in the right sequence. + * + * @private + */ + execCb: function (name, callback, args, exports) { + return callback.apply(exports, args); + }, + + /** + * callback for script loads, used to check status of loading. + * + * @param {Event} evt the event from the browser for the script + * that was loaded. + */ + onScriptLoad: function (evt) { + //Using currentTarget instead of target for Firefox 2.0's sake. Not + //all old browsers will be supported, but this one was easy enough + //to support and still makes sense. + if (evt.type === 'load' || + (readyRegExp.test((evt.currentTarget || evt.srcElement).readyState))) { + //Reset interactive script so a script node is not held onto for + //to long. + interactiveScript = null; + + //Pull out the name of the module and the context. + var data = getScriptData(evt); + context.completeLoad(data.id); + } + }, + + /** + * Callback for script errors. + */ + onScriptError: function (evt) { + var data = getScriptData(evt); + if (!hasPathFallback(data.id)) { + return onError(makeError('scripterror', 'Script error for: ' + data.id, evt, [data.id])); + } + } + }; + + context.require = context.makeRequire(); + return context; + } + + /** + * Main entry point. + * + * If the only argument to require is a string, then the module that + * is represented by that string is fetched for the appropriate context. + * + * If the first argument is an array, then it will be treated as an array + * of dependency string names to fetch. An optional function callback can + * be specified to execute when all of those dependencies are available. + * + * Make a local req variable to help Caja compliance (it assumes things + * on a require that are not standardized), and to give a short + * name for minification/local scope use. + */ + req = requirejs = function (deps, callback, errback, optional) { + + //Find the right context, use default + var context, config, + contextName = defContextName; + + // Determine if have config object in the call. + if (!isArray(deps) && typeof deps !== 'string') { + // deps is a config object + config = deps; + if (isArray(callback)) { + // Adjust args if there are dependencies + deps = callback; + callback = errback; + errback = optional; + } else { + deps = []; + } + } + + if (config && config.context) { + contextName = config.context; + } + + context = getOwn(contexts, contextName); + if (!context) { + context = contexts[contextName] = req.s.newContext(contextName); + } + + if (config) { + context.configure(config); + } + + return context.require(deps, callback, errback); + }; + + /** + * Support require.config() to make it easier to cooperate with other + * AMD loaders on globally agreed names. + */ + req.config = function (config) { + return req(config); + }; + + /** + * Execute something after the current tick + * of the event loop. Override for other envs + * that have a better solution than setTimeout. + * @param {Function} fn function to execute later. + */ + req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) { + setTimeout(fn, 4); + } : function (fn) { fn(); }; + + /** + * Export require as a global, but only if it does not already exist. + */ + if (!require) { + require = req; + } + + req.version = version; + + //Used to filter out dependencies that are already paths. + req.jsExtRegExp = /^\/|:|\?|\.js$/; + req.isBrowser = isBrowser; + s = req.s = { + contexts: contexts, + newContext: newContext + }; + + //Create default context. + req({}); + + //Exports some context-sensitive methods on global require. + each([ + 'toUrl', + 'undef', + 'defined', + 'specified' + ], function (prop) { + //Reference from contexts instead of early binding to default context, + //so that during builds, the latest instance of the default context + //with its config gets used. + req[prop] = function () { + var ctx = contexts[defContextName]; + return ctx.require[prop].apply(ctx, arguments); + }; + }); + + if (isBrowser) { + head = s.head = document.getElementsByTagName('head')[0]; + //If BASE tag is in play, using appendChild is a problem for IE6. + //When that browser dies, this can be removed. Details in this jQuery bug: + //http://dev.jquery.com/ticket/2709 + baseElement = document.getElementsByTagName('base')[0]; + if (baseElement) { + head = s.head = baseElement.parentNode; + } + } + + /** + * Any errors that require explicitly generates will be passed to this + * function. Intercept/override it if you want custom error handling. + * @param {Error} err the error object. + */ + req.onError = defaultOnError; + + /** + * Creates the node for the load command. Only used in browser envs. + */ + req.createNode = function (config, moduleName, url) { + var node = config.xhtml ? + document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') : + document.createElement('script'); + node.type = config.scriptType || 'text/javascript'; + node.charset = 'utf-8'; + node.async = true; + return node; + }; + + /** + * Does the request to load a module for the browser case. + * Make this a separate function to allow other environments + * to override it. + * + * @param {Object} context the require context to find state. + * @param {String} moduleName the name of the module. + * @param {Object} url the URL to the module. + */ + req.load = function (context, moduleName, url) { + var config = (context && context.config) || {}, + node; + if (isBrowser) { + //In the browser so use a script tag + node = req.createNode(config, moduleName, url); + + node.setAttribute('data-requirecontext', context.contextName); + node.setAttribute('data-requiremodule', moduleName); + + //Set up load listener. Test attachEvent first because IE9 has + //a subtle issue in its addEventListener and script onload firings + //that do not match the behavior of all other browsers with + //addEventListener support, which fire the onload event for a + //script right after the script execution. See: + //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution + //UNFORTUNATELY Opera implements attachEvent but does not follow the script + //script execution mode. + if (node.attachEvent && + //Check if node.attachEvent is artificially added by custom script or + //natively supported by browser + //read https://github.com/jrburke/requirejs/issues/187 + //if we can NOT find [native code] then it must NOT natively supported. + //in IE8, node.attachEvent does not have toString() + //Note the test for "[native code" with no closing brace, see: + //https://github.com/jrburke/requirejs/issues/273 + !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) && + !isOpera) { + //Probably IE. IE (at least 6-8) do not fire + //script onload right after executing the script, so + //we cannot tie the anonymous define call to a name. + //However, IE reports the script as being in 'interactive' + //readyState at the time of the define call. + useInteractive = true; + + node.attachEvent('onreadystatechange', context.onScriptLoad); + //It would be great to add an error handler here to catch + //404s in IE9+. However, onreadystatechange will fire before + //the error handler, so that does not help. If addEventListener + //is used, then IE will fire error before load, but we cannot + //use that pathway given the connect.microsoft.com issue + //mentioned above about not doing the 'script execute, + //then fire the script load event listener before execute + //next script' that other browsers do. + //Best hope: IE10 fixes the issues, + //and then destroys all installs of IE 6-9. + //node.attachEvent('onerror', context.onScriptError); + } else { + node.addEventListener('load', context.onScriptLoad, false); + node.addEventListener('error', context.onScriptError, false); + } + node.src = url; + + //For some cache cases in IE 6-8, the script executes before the end + //of the appendChild execution, so to tie an anonymous define + //call to the module name (which is stored on the node), hold on + //to a reference to this node, but clear after the DOM insertion. + currentlyAddingScript = node; + if (baseElement) { + head.insertBefore(node, baseElement); + } else { + head.appendChild(node); + } + currentlyAddingScript = null; + + return node; + } else if (isWebWorker) { + try { + //In a web worker, use importScripts. This is not a very + //efficient use of importScripts, importScripts will block until + //its script is downloaded and evaluated. However, if web workers + //are in play, the expectation that a build has been done so that + //only one script needs to be loaded anyway. This may need to be + //reevaluated if other use cases become common. + importScripts(url); + + //Account for anonymous modules + context.completeLoad(moduleName); + } catch (e) { + context.onError(makeError('importscripts', + 'importScripts failed for ' + + moduleName + ' at ' + url, + e, + [moduleName])); + } + } + }; + + function getInteractiveScript() { + if (interactiveScript && interactiveScript.readyState === 'interactive') { + return interactiveScript; + } + + eachReverse(scripts(), function (script) { + if (script.readyState === 'interactive') { + return (interactiveScript = script); + } + }); + return interactiveScript; + } + + //Look for a data-main script attribute, which could also adjust the baseUrl. + if (isBrowser && !cfg.skipDataMain) { + //Figure out baseUrl. Get it from the script tag with require.js in it. + eachReverse(scripts(), function (script) { + //Set the 'head' where we can append children by + //using the script's parent. + if (!head) { + head = script.parentNode; + } + + //Look for a data-main attribute to set main script for the page + //to load. If it is there, the path to data main becomes the + //baseUrl, if it is not already set. + dataMain = script.getAttribute('data-main'); + if (dataMain) { + //Preserve dataMain in case it is a path (i.e. contains '?') + mainScript = dataMain; + + //Set final baseUrl if there is not already an explicit one. + if (!cfg.baseUrl) { + //Pull off the directory of data-main for use as the + //baseUrl. + src = mainScript.split('/'); + mainScript = src.pop(); + subPath = src.length ? src.join('/') + '/' : './'; + + cfg.baseUrl = subPath; + } + + //Strip off any trailing .js since mainScript is now + //like a module name. + mainScript = mainScript.replace(jsSuffixRegExp, ''); + + //If mainScript is still a path, fall back to dataMain + if (req.jsExtRegExp.test(mainScript)) { + mainScript = dataMain; + } + + //Put the data-main script in the files to load. + cfg.deps = cfg.deps ? cfg.deps.concat(mainScript) : [mainScript]; + + return true; + } + }); + } + + /** + * The function that handles definitions of modules. Differs from + * require() in that a string for the module should be the first argument, + * and the function to execute after dependencies are loaded should + * return a value to define the module corresponding to the first argument's + * name. + */ + define = function (name, deps, callback) { + var node, context; + + //Allow for anonymous modules + if (typeof name !== 'string') { + //Adjust args appropriately + callback = deps; + deps = name; + name = null; + } + + //This module may not have dependencies + if (!isArray(deps)) { + callback = deps; + deps = null; + } + + //If no name, and callback is a function, then figure out if it a + //CommonJS thing with dependencies. + if (!deps && isFunction(callback)) { + deps = []; + //Remove comments from the callback string, + //look for require calls, and pull them into the dependencies, + //but only if there are function args. + if (callback.length) { + callback + .toString() + .replace(commentRegExp, '') + .replace(cjsRequireRegExp, function (match, dep) { + deps.push(dep); + }); + + //May be a CommonJS thing even without require calls, but still + //could use exports, and module. Avoid doing exports and module + //work though if it just needs require. + //REQUIRES the function to expect the CommonJS variables in the + //order listed below. + deps = (callback.length === 1 ? ['require'] : ['require', 'exports', 'module']).concat(deps); + } + } + + //If in IE 6-8 and hit an anonymous define() call, do the interactive + //work. + if (useInteractive) { + node = currentlyAddingScript || getInteractiveScript(); + if (node) { + if (!name) { + name = node.getAttribute('data-requiremodule'); + } + context = contexts[node.getAttribute('data-requirecontext')]; + } + } + + //Always save off evaluating the def call until the script onload handler. + //This allows multiple modules to be in a file without prematurely + //tracing dependencies, and allows for anonymous module support, + //where the module name is not known until the script onload event + //occurs. If no context, use the global queue, and get it processed + //in the onscript load callback. + (context ? context.defQueue : globalDefQueue).push([name, deps, callback]); + }; + + define.amd = { + jQuery: true + }; + + /** + * Executes the text. Normally just uses eval, but can be modified + * to use a better, environment-specific call. Only used for transpiling + * loader plugins, not for plain JS modules. + * @param {String} text the text to execute/evaluate. + */ + req.exec = function (text) { + /*jslint evil: true */ + return eval(text); + }; + + //Set up with config info. + req(cfg); +}(this)); diff --git a/dependencies/three.js b/js/dependencies/three.js similarity index 100% rename from dependencies/three.js rename to js/dependencies/three.js diff --git a/dependencies/three.min.js b/js/dependencies/three.min.js similarity index 100% rename from dependencies/three.min.js rename to js/dependencies/three.min.js diff --git a/dependencies/underscore-min.js b/js/dependencies/underscore-min.js similarity index 100% rename from dependencies/underscore-min.js rename to js/dependencies/underscore-min.js diff --git a/dependencies/underscore-min.map b/js/dependencies/underscore-min.map similarity index 100% rename from dependencies/underscore-min.map rename to js/dependencies/underscore-min.map diff --git a/dependencies/underscore.js b/js/dependencies/underscore.js similarity index 100% rename from dependencies/underscore.js rename to js/dependencies/underscore.js diff --git a/js/lattice/Lattice.js b/js/lattice/Lattice.js index 0b4f58287896ff3a1ef93bf12d0830adce1dc958..a4086e6971e8e32b45852b52696fbfb82cb0c59f 100644 --- a/js/lattice/Lattice.js +++ b/js/lattice/Lattice.js @@ -2,592 +2,595 @@ * Created by aghassaei on 1/16/15. */ -latticeSubclasses = {}; -Lattice = Backbone.Model.extend({ +define(['appState', 'plist', 'three'], function(appState, plist, THREE){ - defaults: { + var Lattice = Backbone.Model.extend({ - units: "mm", + defaults: { - nodes: [], - cells: [[[null]]],//3D matrix containing all cells and null, dynamic size - cellsMin: {x:0, y:0, z:0},//min position of cells matrix - cellsMax: {x:0, y:0, z:0},//max position of cells matrix - numCells: 0, + units: "mm", - scale: 20, + nodes: [], + cells: [[[null]]],//3D matrix containing all cells and null, dynamic size + cellsMin: {x:0, y:0, z:0},//min position of cells matrix + cellsMax: {x:0, y:0, z:0},//max position of cells matrix + numCells: 0, - //spacing for connectors/joints - cellSeparation: {xy:0, z:0}, + scale: 20, - cellType: "cube", - connectionType: "gik", - partType: "lego", - materialType: "fiberGlass", - superCellRange: new THREE.Vector3(4,1,1) - }, + //spacing for connectors/joints + cellSeparation: {xy:0, z:0}, - //pass in fillGeometry + cellType: "cube", + connectionType: "gik", + partType: "lego", + materialType: "fiberGlass", + superCellRange: new THREE.Vector3(4,1,1) + }, - initialize: function(){ + //pass in fillGeometry - _.extend(this, latticeSubclasses); + initialize: function(){ - //bind events - this.listenTo(this, "change:partType", this._updatePartType); - this.listenTo(this, "change:cellType change:connectionType", this._updateLatticeType); - this.listenTo(this, "change:cellSeparation", this._updateCellSeparation); + //bind events + this.listenTo(this, "change:partType", this._updatePartType); + this.listenTo(this, "change:cellType change:connectionType", this._updateLatticeType); + this.listenTo(this, "change:cellSeparation", this._updateCellSeparation); - this.listenTo(globals.appState, "change:cellMode", this._updateForMode); - this.listenTo(globals.appState, "change:cellsVisible", this._setCellVisibility); + this.listenTo(appState, "change:cellMode", this._updateForMode); + this.listenTo(appState, "change:cellsVisible", this._setCellVisibility); - changeGikMaterials(); - }, - delayedInit: function(){ - this._updateLatticeType(); - }, + }, - //////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////ADD/REMOVE CELLS///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////// + delayedInit: function(){ + this._updateLatticeType(); + }, - addCellsInRange: function(range){//add a block of cells (extrude) - var cells = this.get("cells"); - var newCells = []; - this.checkForMatrixExpansion(cells, range.max, range.min); + //////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////ADD/REMOVE CELLS///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// - var cellsMin = this.get("cellsMin"); - var relativeMin = this._subtract(range.min, cellsMin); - var relativeMax = this._subtract(range.max, this.get("cellsMin")); + addCellsInRange: function(range){//add a block of cells (extrude) + var cells = this.get("cells"); + var newCells = []; + this.checkForMatrixExpansion(cells, range.max, range.min); - for (var x=relativeMin.x;x<=relativeMax.x;x++){ - for (var y=relativeMin.y;y<=relativeMax.y;y++){ - for (var z=relativeMin.z;z<=relativeMax.z;z++){ - if (!cells[x][y][z]) { - var cell = this.makeCellForLatticeType(this._add({x:x, y:y, z:z}, cellsMin)); - cells[x][y][z] = cell; - newCells.push(cell); - this.set("numCells", this.get("numCells")+1); - } else console.warn("already a cell there"); + var cellsMin = this.get("cellsMin"); + var relativeMin = this._subtract(range.min, cellsMin); + var relativeMax = this._subtract(range.max, this.get("cellsMin")); + + for (var x=relativeMin.x;x<=relativeMax.x;x++){ + for (var y=relativeMin.y;y<=relativeMax.y;y++){ + for (var z=relativeMin.z;z<=relativeMax.z;z++){ + if (!cells[x][y][z]) { + var cell = this.makeCellForLatticeType(this._add({x:x, y:y, z:z}, cellsMin)); + cells[x][y][z] = cell; + newCells.push(cell); + this.set("numCells", this.get("numCells")+1); + } else console.warn("already a cell there"); + } } } - } - globals.three.render(); - return newCells; - }, - - addCellAtIndex: function(indices, noRender, noCheck){//no render no check from fill - - var cells = this.get("cells"); - if (!noCheck) this.checkForMatrixExpansion(cells, indices, indices); - - var index = this._subtract(indices, this.get("cellsMin")); - if (!cells[index.x][index.y][index.z]) { - cells[index.x][index.y][index.z] = this.makeCellForLatticeType(indices); - this.set("numCells", this.get("numCells")+1); - if (!noRender) globals.three.render(); - } else console.warn("already a cell there"); - - }, - - _indexForPosition: function(absPosition){ - var position = {}; - position.x = Math.floor(absPosition.x/this.xScale()); - position.y = Math.floor(absPosition.y/this.yScale()); - position.z = Math.floor(absPosition.z/this.zScale()); - return position; - }, - - _positionForIndex: function(index){ - var position = _.clone(index); - position.x = (position.x+0.5)*this.xScale(); - position.y = (position.y+0.5)*this.yScale(); - position.z = (position.z+0.5)*this.zScale(); - return position; - }, - -// removeCellAtIndex: function(indices){ -// -// var index = this._subtract(indices, this.get("cellsMin")); -// var cells = this.get("cells"); -// if (index.x<cells.length && index.y<cells[0].length && index.z<cells[0][0].length){ -// this.removeCell(cells[index.x][index.y][index.z]); -// } -// }, - - removeCell: function(cell){ - if (!cell) return; - var index = this._subtract(cell.indices, this.get("cellsMin")); - var cells = this.get("cells"); - cell.destroy(); - cells[index.x][index.y][index.z] = null; - - //todo shrink cells matrix if needed - - this.set("numCells", this.get("numCells")-1); - globals.three.render(); - }, - - //todo send clear all to three and destroy without sceneRemove to cell - clearCells: function(){ - this._iterCells(this.get("cells"), function(cell){ - if (cell && cell.destroy) cell.destroy(); - }); - this.set("cells", [[[null]]]); - this.set("cellsMax", {x:0, y:0, z:0}); - this.set("cellsMin", {x:0, y:0, z:0}); - this.set("nodes", []); - this.set("numCells", 0); - if (globals.basePlane) globals.basePlane.set("zIndex", 0); - globals.three.render(); - }, - - calculateBoundingBox: function(){ - var scale = this._allAxesScales(); - var min = _.clone(this.get("cellsMin")); - var max = _.clone(this.get("cellsMax")); - _.each(_.keys(scale), function(key){ - min[key] *= scale[key]; - max[key] *= scale[key]; - }); - return {min:min, max:max}; - }, - - //////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////FILL GEOMETRY//////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////// - - subtractMesh: function(mesh){ - //todo this is specific to octa face - - var xScale = this.xScale(); - var yScale = this.yScale(); - var zScale = this.zScale(); - - var cells = this.get("cells"); - var cellsMin = this.get("cellsMin"); - - var allVertexPos = mesh.geometry.attributes.position.array; - - var zHeight = 0; - for (var x=0;x<cells.length;x++){ - for (var y=0;y<cells[0].length;y++){ - var firstCell = null; - for (var z=0;z<cells[0][0].length;z++){ - firstCell = cells[x][y][z]; - if (firstCell) break; - } - if (!firstCell) continue;//nothing in col + globals.three.render(); + return newCells; + }, + + addCellAtIndex: function(indices, noRender, noCheck){//no render no check from fill + + var cells = this.get("cells"); + if (!noCheck) this.checkForMatrixExpansion(cells, indices, indices); + + var index = this._subtract(indices, this.get("cellsMin")); + if (!cells[index.x][index.y][index.z]) { + cells[index.x][index.y][index.z] = this.makeCellForLatticeType(indices); + this.set("numCells", this.get("numCells")+1); + if (!noRender) globals.three.render(); + } else console.warn("already a cell there"); + + }, + + _indexForPosition: function(absPosition){ + var position = {}; + position.x = Math.floor(absPosition.x/this.xScale()); + position.y = Math.floor(absPosition.y/this.yScale()); + position.z = Math.floor(absPosition.z/this.zScale()); + return position; + }, + + _positionForIndex: function(index){ + var position = _.clone(index); + position.x = (position.x+0.5)*this.xScale(); + position.y = (position.y+0.5)*this.yScale(); + position.z = (position.z+0.5)*this.zScale(); + return position; + }, + + // removeCellAtIndex: function(indices){ + // + // var index = this._subtract(indices, this.get("cellsMin")); + // var cells = this.get("cells"); + // if (index.x<cells.length && index.y<cells[0].length && index.z<cells[0][0].length){ + // this.removeCell(cells[index.x][index.y][index.z]); + // } + // }, + + removeCell: function(cell){ + if (!cell) return; + var index = this._subtract(cell.indices, this.get("cellsMin")); + var cells = this.get("cells"); + cell.destroy(); + cells[index.x][index.y][index.z] = null; + + //todo shrink cells matrix if needed + + this.set("numCells", this.get("numCells")-1); + globals.three.render(); + }, + + //todo send clear all to three and destroy without sceneRemove to cell + clearCells: function(){ + this._iterCells(this.get("cells"), function(cell){ + if (cell && cell.destroy) cell.destroy(); + }); + this.set("cells", [[[null]]]); + this.set("cellsMax", {x:0, y:0, z:0}); + this.set("cellsMin", {x:0, y:0, z:0}); + this.set("nodes", []); + this.set("numCells", 0); + if (globals.basePlane) globals.basePlane.set("zIndex", 0); + globals.three.render(); + }, + + calculateBoundingBox: function(){ + var scale = this._allAxesScales(); + var min = _.clone(this.get("cellsMin")); + var max = _.clone(this.get("cellsMax")); + _.each(_.keys(scale), function(key){ + min[key] *= scale[key]; + max[key] *= scale[key]; + }); + return {min:min, max:max}; + }, + + //////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////FILL GEOMETRY//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + + subtractMesh: function(mesh){ + //todo this is specific to octa face + + var xScale = this.xScale(); + var yScale = this.yScale(); + var zScale = this.zScale(); + + var cells = this.get("cells"); + var cellsMin = this.get("cellsMin"); + + var allVertexPos = mesh.geometry.attributes.position.array; + + var zHeight = 0; + for (var x=0;x<cells.length;x++){ + for (var y=0;y<cells[0].length;y++){ + var firstCell = null; + for (var z=0;z<cells[0][0].length;z++){ + firstCell = cells[x][y][z]; + if (firstCell) break; + } + if (!firstCell) continue;//nothing in col + + var origin = this._positionForIndex(firstCell.indices); + // firstCell._calcPosition(0, this._add({x:x,y:y,z:z}, cellsMin)); + zHeight = this._findIntersectionsInWindow(xScale/2, yScale/2, origin, allVertexPos) || zHeight; - var origin = this._positionForIndex(firstCell.indices); -// firstCell._calcPosition(0, this._add({x:x,y:y,z:z}, cellsMin)); - zHeight = this._findIntersectionsInWindow(xScale/2, yScale/2, origin, allVertexPos) || zHeight; + zHeight = Math.floor(zHeight/zScale); + for (var z=0;z<zHeight;z++){ + var cell = cells[x][y][z]; + if (cell) cell.destroy(); + cells[x][y][z] = null; + } + } - zHeight = Math.floor(zHeight/zScale); - for (var z=0;z<zHeight;z++){ - var cell = cells[x][y][z]; - if (cell) cell.destroy(); - cells[x][y][z] = null; + } + globals.three.render(); + }, + + _findIntersectionsInWindow: function(windowX, windowY, origin, allVertexPos){ + for (var i=0;i<allVertexPos.length;i+=3){ + if (allVertexPos[i] > origin.x-windowX && allVertexPos[i] < origin.x+windowX + && allVertexPos[i+1] > origin.y-windowY && allVertexPos[i+1] < origin.y+windowY){ + return allVertexPos[i+2]; } } + return null + }, + + + //////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////CELLS ARRAY////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// - } - globals.three.render(); - }, + checkForMatrixExpansion: function(cells, indicesMax, indicesMin){ - _findIntersectionsInWindow: function(windowX, windowY, origin, allVertexPos){ - for (var i=0;i<allVertexPos.length;i+=3){ - if (allVertexPos[i] > origin.x-windowX && allVertexPos[i] < origin.x+windowX - && allVertexPos[i+1] > origin.y-windowY && allVertexPos[i+1] < origin.y+windowY){ - return allVertexPos[i+2]; + if (!cells) cells = this.get("cells"); + + var lastMax = this.get("cellsMax"); + var lastMin = this.get("cellsMin"); + var newMax = this._updateCellsMax(indicesMax, lastMax); + var newMin = this._updateCellsMin(indicesMin, lastMin); + if (newMax) { + this._expandCellsArray(cells, this._subtract(newMax, lastMax), false); + this.set("cellsMax", newMax); + } + if (newMin) { + this._expandCellsArray(cells, this._subtract(lastMin, newMin), true); + this.set("cellsMin", newMin); } - } - return null - }, - - - //////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////CELLS ARRAY////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////// - - checkForMatrixExpansion: function(cells, indicesMax, indicesMin){ - - if (!cells) cells = this.get("cells"); - - var lastMax = this.get("cellsMax"); - var lastMin = this.get("cellsMin"); - var newMax = this._updateCellsMax(indicesMax, lastMax); - var newMin = this._updateCellsMin(indicesMin, lastMin); - if (newMax) { - this._expandCellsArray(cells, this._subtract(newMax, lastMax), false); - this.set("cellsMax", newMax); - } - if (newMin) { - this._expandCellsArray(cells, this._subtract(lastMin, newMin), true); - this.set("cellsMin", newMin); - } - }, - - _expandCellsArray: function(cells, expansion, fromFront){ - - _.each(_.keys(expansion), function(key){ - if (expansion[key] == 0) return;//no expansion on this axis - - var cellsX = cells.length; - var cellsY = cells[0].length; - var cellsZ = cells[0][0].length; - - if (key=="x"){ - for (var x=0;x<expansion[key];x++){ - var newLayer = []; - for (var y=0;y<cellsY;y++){ - var newCol = []; - for (var z=0;z<cellsZ;z++){ - newCol.push(null); + }, + + _expandCellsArray: function(cells, expansion, fromFront){ + + _.each(_.keys(expansion), function(key){ + if (expansion[key] == 0) return;//no expansion on this axis + + var cellsX = cells.length; + var cellsY = cells[0].length; + var cellsZ = cells[0][0].length; + + if (key=="x"){ + for (var x=0;x<expansion[key];x++){ + var newLayer = []; + for (var y=0;y<cellsY;y++){ + var newCol = []; + for (var z=0;z<cellsZ;z++){ + newCol.push(null); + } + newLayer.push(newCol); } - newLayer.push(newCol); + if (fromFront) cells.unshift(newLayer); + else cells.push(newLayer); } - if (fromFront) cells.unshift(newLayer); - else cells.push(newLayer); - } - } else if (key=="y"){ - for (var x=0;x<cellsX;x++){ - for (var y=0;y<expansion[key];y++){ - var newCol = []; - for (var z=0;z<cellsZ;z++){ - newCol.push(null); + } else if (key=="y"){ + for (var x=0;x<cellsX;x++){ + for (var y=0;y<expansion[key];y++){ + var newCol = []; + for (var z=0;z<cellsZ;z++){ + newCol.push(null); + } + if (fromFront) cells[x].unshift(newCol); + else cells[x].push(newCol); } - if (fromFront) cells[x].unshift(newCol); - else cells[x].push(newCol); } - } - } else if (key=="z"){ - for (var x=0;x<cellsX;x++){ - for (var y=0;y<cellsY;y++){ - for (var z=0;z<expansion[key];z++){ - if (fromFront) cells[x][y].unshift(null); - else cells[x][y].push(null); + } else if (key=="z"){ + for (var x=0;x<cellsX;x++){ + for (var y=0;y<cellsY;y++){ + for (var z=0;z<expansion[key];z++){ + if (fromFront) cells[x][y].unshift(null); + else cells[x][y].push(null); + } } } } + }); + }, + + _updateCellsMin: function(newPosition, currentMin){ + var newMin = {}; + var hasChanged = false; + _.each(_.keys(newPosition), function(key){ + if (newPosition[key]<currentMin[key]){ + hasChanged = true; + newMin[key] = newPosition[key]; + } else { + newMin[key] = currentMin[key]; + } + }); + if (hasChanged) return newMin; + return false; + }, + + _updateCellsMax: function(newPosition, currentMax){ + var newMax = {}; + var hasChanged = false; + _.each(_.keys(newPosition), function(key){ + if (newPosition[key]>currentMax[key]){ + hasChanged = true; + newMax[key] = newPosition[key]; + } else { + newMax[key] = currentMax[key]; + } + }); + if (hasChanged) return newMax; + return false; + }, + + //////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////EVENTS////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + + _updatePartType: function(){ + this._iterCells(this.get("cells"), function(cell){ + if (cell) cell.destroyParts(); + }); + this._updateForMode(); + }, + + _updateForMode: function(){ + var cellMode = appState.get("cellMode"); + this._iterCells(this.get("cells"), function(cell){ + if (cell) cell.setMode(cellMode); + }); + globals.three.render(); + }, + + _updateCellSeparation: function(){ + var cellSep = this.get("cellSeparation"); + globals.basePlane.updateXYSeparation(cellSep.xy); + + var cellMode = appState.get("cellMode"); + var partType = this.get("partType"); + this._iterCells(this.get("cells"), function(cell){ + if (cell) cell.updateForScale(cellMode, partType); + }); + globals.three.render(); + }, + + _setCellVisibility: function(){ + if (appState.get("cellsVisible")) this.showCells(); + else this.hideCells(); + }, + + //hide/show cells during stock simulation + hideCells: function(){ + this._iterCells(this.get("cells"), function(cell){ + if (cell) cell.hide(); + }); + globals.three.render(); + }, + + showCells: function(){ + var cellMode = appState.get("cellMode"); + this._iterCells(this.get("cells"), function(cell){ + if (cell) cell.show(cellMode) + }); + globals.three.render(); + }, + + showCellAtIndex: function(index){ + var latticeIndex = this._subtract(index, this.get("cellsMin")); + var cell = this.get("cells")[latticeIndex.x][latticeIndex.y][latticeIndex.z]; + if (cell) cell.show(); + else console.warn("placing a cell that does not exist"); + }, + + //////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////CONNECTION TYPE////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + + _updateLatticeType: function(arg1, arg2, arg3, loadingFromFile){//do not clear cells if loading from file (cells array contains important metadata) + + if (this.previous("connectionType") == "gik") this.clearCells(); + + this._setToDefaultsSilently(); + this._setDefaultCellMode(); + + if (loadingFromFile === undefined) loadingFromFile = false; + + if (this._undo) this._undo(); + if (globals.basePlane) globals.basePlane.destroy(); + if (globals.highlighter) globals.highlighter.destroy(); + _.extend(this, this._getSubclassForLatticeType(loadingFromFile)); + this._initLatticeType(); + + + + + //todo refactor this eventually + var self = this; + var cells = this.get("cells"); + this._loopCells(cells, function(cell, x, y, z){ + if (!cell) return; + + var index = _.clone(cell.indices); + //var parts = null; + //if (loadingFromFile) parts = _.clone(cell.parts); + if (cell.parentOrientation) var parentOrientation = new THREE.Quaternion(cell.parentOrientation._x, cell.parentOrientation._y, cell.parentOrientation._z, cell.parentOrientation._w); + if (cell.parentPosition) var parentPos = cell.parentPosition; + if (cell.direction) var direction = new THREE.Vector3(cell.direction.x, cell.direction.y, cell.direction.z); + if (cell.parentType) var parentType = cell.parentType; + if (cell.type) var type = cell.type; + + if (cell.destroy) cell.destroy(); + var newCell = self.makeCellForLatticeType(index, parentPos, parentOrientation, direction, parentType, type); + + //if (parts) { + // //todo make this better + // newCell.parts = newCell._initParts(); + // for (var i=0;i<newCell.parts.length;i++){ + // if (!parts[i]) { + // newCell.parts[i].destroy(); + // newCell.parts[i] = null; + // } + // } + //} + cells[x][y][z] = newCell; + }); + globals.three.render(); + }, + + _getSubclassForLatticeType: function(loadingFromFile){ + var cellType = this.get("cellType"); + var connectionType = this.get("connectionType"); + if (cellType == "octa"){ + if (connectionType == "face"){ + return this.OctaFaceLattice; + } else if (connectionType == "freeformFace"){ + if (!loadingFromFile) this.clearCells(); + return this.OctaFreeFormFaceLattice; + } else if (connectionType == "edge"){ + return this.OctaEdgeLattice; + } else if (connectionType == "edgeRot"){ + return this.OctaRotEdgeLattice; + } else if (connectionType == "vertex"){ + return this.OctaVertexLattice; + } + } else if (cellType == "tetra"){ + return this.CubeLattice; + } else if (cellType == "cube"){ + if (connectionType == "face"){ + return this.CubeLattice; + } else if (connectionType == "gik"){ + if (!loadingFromFile) this.clearCells(); + return this.GIKLattice; + } + } else if (cellType == "truncatedCube"){ + return this.TruncatedCubeLattice; + } else if (cellType == "kelvin"){ + return this.KelvinLattice; } - }); - }, - - _updateCellsMin: function(newPosition, currentMin){ - var newMin = {}; - var hasChanged = false; - _.each(_.keys(newPosition), function(key){ - if (newPosition[key]<currentMin[key]){ - hasChanged = true; - newMin[key] = newPosition[key]; - } else { - newMin[key] = currentMin[key]; - } - }); - if (hasChanged) return newMin; - return false; - }, - - _updateCellsMax: function(newPosition, currentMax){ - var newMax = {}; - var hasChanged = false; - _.each(_.keys(newPosition), function(key){ - if (newPosition[key]>currentMax[key]){ - hasChanged = true; - newMax[key] = newPosition[key]; - } else { - newMax[key] = currentMax[key]; + }, + + _setToDefaultsSilently: function(){ + var newCellType = this.get("cellType"); + var newConnectionType = this.get("connectionType"); + if (newConnectionType == this.previous("connectionType")){ + newConnectionType = _.keys(plist["allConnectionTypes"][newCellType])[0]; + this.set("connectionType", newConnectionType, {silent:true}); } - }); - if (hasChanged) return newMax; - return false; - }, - - //////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////EVENTS////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////// - - _updatePartType: function(){ - this._iterCells(this.get("cells"), function(cell){ - if (cell) cell.destroyParts(); - }); - this._updateForMode(); - }, - - _updateForMode: function(){ - var cellMode = globals.appState.get("cellMode"); - this._iterCells(this.get("cells"), function(cell){ - if (cell) cell.setMode(cellMode); - }); - globals.three.render(); - }, - - _updateCellSeparation: function(){ - var cellSep = this.get("cellSeparation"); - globals.basePlane.updateXYSeparation(cellSep.xy); - - var cellMode = globals.appState.get("cellMode"); - var partType = this.get("partType"); - this._iterCells(this.get("cells"), function(cell){ - if (cell) cell.updateForScale(cellMode, partType); - }); - globals.three.render(); - }, - - _setCellVisibility: function(){ - if (globals.appState.get("cellsVisible")) this.showCells(); - else this.hideCells(); - }, - - //hide/show cells during stock simulation - hideCells: function(){ - this._iterCells(this.get("cells"), function(cell){ - if (cell) cell.hide(); - }); - globals.three.render(); - }, - - showCells: function(){ - var cellMode = globals.appState.get("cellMode"); - this._iterCells(this.get("cells"), function(cell){ - if (cell) cell.show(cellMode) - }); - globals.three.render(); - }, - - showCellAtIndex: function(index){ - var latticeIndex = this._subtract(index, this.get("cellsMin")); - var cell = this.get("cells")[latticeIndex.x][latticeIndex.y][latticeIndex.z]; - if (cell) cell.show(); - else console.warn("placing a cell that does not exist"); - }, - - //////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////CONNECTION TYPE////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////// - - _updateLatticeType: function(arg1, arg2, arg3, loadingFromFile){//do not clear cells if loading from file (cells array contains important metadata) - - if (this.previous("connectionType") == "gik") this.clearCells(); - - this._setToDefaultsSilently(); - this._setDefaultCellMode(); - - if (loadingFromFile === undefined) loadingFromFile = false; - - if (this._undo) this._undo(); - if (globals.basePlane) globals.basePlane.destroy(); - if (globals.highlighter) globals.highlighter.destroy(); - _.extend(this, this._getSubclassForLatticeType(loadingFromFile)); - this._initLatticeType(); - - - - - //todo refactor this eventually - var self = this; - var cells = this.get("cells"); - this._loopCells(cells, function(cell, x, y, z){ - if (!cell) return; + var partType = _.keys(plist["allPartTypes"][newCellType][newConnectionType])[0]; + this.set("partType", partType, {silent:true}); + }, - var index = _.clone(cell.indices); - //var parts = null; - //if (loadingFromFile) parts = _.clone(cell.parts); - if (cell.parentOrientation) var parentOrientation = new THREE.Quaternion(cell.parentOrientation._x, cell.parentOrientation._y, cell.parentOrientation._z, cell.parentOrientation._w); - if (cell.parentPosition) var parentPos = cell.parentPosition; - if (cell.direction) var direction = new THREE.Vector3(cell.direction.x, cell.direction.y, cell.direction.z); - if (cell.parentType) var parentType = cell.parentType; - if (cell.type) var type = cell.type; - - if (cell.destroy) cell.destroy(); - var newCell = self.makeCellForLatticeType(index, parentPos, parentOrientation, direction, parentType, type); - - //if (parts) { - // //todo make this better - // newCell.parts = newCell._initParts(); - // for (var i=0;i<newCell.parts.length;i++){ - // if (!parts[i]) { - // newCell.parts[i].destroy(); - // newCell.parts[i] = null; - // } - // } - //} - cells[x][y][z] = newCell; - }); - globals.three.render(); - }, - - _getSubclassForLatticeType: function(loadingFromFile){ - var cellType = this.get("cellType"); - var connectionType = this.get("connectionType"); - if (cellType == "octa"){ - if (connectionType == "face"){ - return this.OctaFaceLattice; - } else if (connectionType == "freeformFace"){ - if (!loadingFromFile) this.clearCells(); - return this.OctaFreeFormFaceLattice; - } else if (connectionType == "edge"){ - return this.OctaEdgeLattice; - } else if (connectionType == "edgeRot"){ - return this.OctaRotEdgeLattice; - } else if (connectionType == "vertex"){ - return this.OctaVertexLattice; - } - } else if (cellType == "tetra"){ - return this.CubeLattice; - } else if (cellType == "cube"){ - if (connectionType == "face"){ - return this.CubeLattice; - } else if (connectionType == "gik"){ - if (!loadingFromFile) this.clearCells(); - return this.GIKLattice; + _setDefaultCellMode: function(){//if no part associated with this lattice type + if (!plist["allPartTypes"][this.get("cellType")][this.get("connectionType")]){ + appState.set("cellMode", "cell"); } - } else if (cellType == "truncatedCube"){ - return this.TruncatedCubeLattice; - } else if (cellType == "kelvin"){ - return this.KelvinLattice; - } - }, - - _setToDefaultsSilently: function(){ - var newCellType = this.get("cellType"); - var newConnectionType = this.get("connectionType"); - if (newConnectionType == this.previous("connectionType")){ - newConnectionType = _.keys(globals.plist["allConnectionTypes"][newCellType])[0]; - this.set("connectionType", newConnectionType, {silent:true}); - } - var partType = _.keys(globals.plist["allPartTypes"][newCellType][newConnectionType])[0]; - this.set("partType", partType, {silent:true}); - }, - - _setDefaultCellMode: function(){//if no part associated with this lattice type - if (!globals.plist["allPartTypes"][this.get("cellType")][this.get("connectionType")]){ - globals.appState.set("cellMode", "cell"); - } - }, - - //////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////UTILS/////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////// - - _iterCells: function(cells, callback){ - _.each(cells, function(cellLayer){ - _.each(cellLayer, function(cellColumn){ - _.each(cellColumn, function(cell){ - callback(cell, cellColumn, cellLayer); + }, + + //////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////UTILS/////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + + _iterCells: function(cells, callback){ + _.each(cells, function(cellLayer){ + _.each(cellLayer, function(cellColumn){ + _.each(cellColumn, function(cell){ + callback(cell, cellColumn, cellLayer); + }); }); - }); - }); - }, + }); + }, - _loopCells: function(cells, callback){ - for (var x=0;x<cells.length;x++){ - for (var y=0;y<cells[0].length;y++){ - for (var z=0;z<cells[0][0].length;z++){ - callback(cells[x][y][z], x, y, z); + _loopCells: function(cells, callback){ + for (var x=0;x<cells.length;x++){ + for (var y=0;y<cells[0].length;y++){ + for (var z=0;z<cells[0][0].length;z++){ + callback(cells[x][y][z], x, y, z); + } } } - } - }, - - rasterCells: function(order, callback, var1, var2, var3, cells){//used for CAM raster x/y/z in any order permutation - //order is of form 'XYZ' - var firstLetter = order.charAt(0); - order = order.substr(1); - var isNeg = false; - if (firstLetter == "-") { - isNeg = true; - firstLetter = order.charAt(0); + }, + + rasterCells: function(order, callback, var1, var2, var3, cells){//used for CAM raster x/y/z in any order permutation + //order is of form 'XYZ' + var firstLetter = order.charAt(0); order = order.substr(1); - } - if (!cells) cells = this.get("cells");//grab cells once at beginning and hold onto it in case changes are made while looping - var newVarOrder; - var newVarDim; - if (firstLetter == 'X'){ - newVarOrder = 0; - newVarDim = cells.length; - } else if (firstLetter == 'Y'){ - newVarOrder = 1; - newVarDim = cells[0].length; - } else if (firstLetter == 'Z'){ - newVarOrder = 2; - newVarDim = cells[0][0].length; - } else if (firstLetter == ""){ - if (this._rasterGikCells) { - this._rasterGikCells(order, callback, var1, var2, var3, cells); + var isNeg = false; + if (firstLetter == "-") { + isNeg = true; + firstLetter = order.charAt(0); + order = order.substr(1); + } + if (!cells) cells = this.get("cells");//grab cells once at beginning and hold onto it in case changes are made while looping + var newVarOrder; + var newVarDim; + if (firstLetter == 'X'){ + newVarOrder = 0; + newVarDim = cells.length; + } else if (firstLetter == 'Y'){ + newVarOrder = 1; + newVarDim = cells[0].length; + } else if (firstLetter == 'Z'){ + newVarOrder = 2; + newVarDim = cells[0][0].length; + } else if (firstLetter == ""){ + if (this._rasterGikCells) { + this._rasterGikCells(order, callback, var1, var2, var3, cells); + return; + } + this._rasterCells(order, callback, var1, var2, var3, cells); return; } - this._rasterCells(order, callback, var1, var2, var3, cells); - return; - } - if (var3 == null) var3 = {order: newVarOrder, dim: newVarDim, neg:isNeg}; - else if (var2 == null) var2 = {order: newVarOrder, dim: newVarDim, neg:isNeg}; - else var1 = {order: newVarOrder, dim: newVarDim, neg:isNeg}; - this.rasterCells(order, callback, var1, var2, var3, cells); - }, - - _rasterCells: function(order, callback, var1, var2, var3, cells){ - for (var i=this._getRasterLoopInit(var1);this._getRasterLoopCondition(i,var1);i+=this._getRasterLoopIterator(var1)){ - for (var j=this._getRasterLoopInit(var2);this._getRasterLoopCondition(j,var2);j+=this._getRasterLoopIterator(var2)){ - for (var k=this._getRasterLoopInit(var3);this._getRasterLoopCondition(k,var3);k+=this._getRasterLoopIterator(var3)){ - if (var1.order == 0){ - if (var2.order == 1) callback(cells[i][j][k], i, j, k); - else if (var2.order == 2) callback(cells[i][k][j], i, k, j); - } else if (var1.order == 1){ - if (var2.order == 0) callback(cells[j][i][k], j, i, k); - else if (var2.order == 2) callback(cells[k][i][j], k, i, j); - } else { - if (var2.order == 0) callback(cells[j][k][i], j, k, i); - else if (var2.order == 1) { - callback(cells[k][j][i], k, j, i); + if (var3 == null) var3 = {order: newVarOrder, dim: newVarDim, neg:isNeg}; + else if (var2 == null) var2 = {order: newVarOrder, dim: newVarDim, neg:isNeg}; + else var1 = {order: newVarOrder, dim: newVarDim, neg:isNeg}; + this.rasterCells(order, callback, var1, var2, var3, cells); + }, + + _rasterCells: function(order, callback, var1, var2, var3, cells){ + for (var i=this._getRasterLoopInit(var1);this._getRasterLoopCondition(i,var1);i+=this._getRasterLoopIterator(var1)){ + for (var j=this._getRasterLoopInit(var2);this._getRasterLoopCondition(j,var2);j+=this._getRasterLoopIterator(var2)){ + for (var k=this._getRasterLoopInit(var3);this._getRasterLoopCondition(k,var3);k+=this._getRasterLoopIterator(var3)){ + if (var1.order == 0){ + if (var2.order == 1) callback(cells[i][j][k], i, j, k); + else if (var2.order == 2) callback(cells[i][k][j], i, k, j); + } else if (var1.order == 1){ + if (var2.order == 0) callback(cells[j][i][k], j, i, k); + else if (var2.order == 2) callback(cells[k][i][j], k, i, j); + } else { + if (var2.order == 0) callback(cells[j][k][i], j, k, i); + else if (var2.order == 1) { + callback(cells[k][j][i], k, j, i); + } } - } + } } } - } - }, - - _getRasterLoopInit: function(variable){ - if (variable.neg) return variable.dim-1; - return 0; - }, - - _getRasterLoopCondition: function(iter, variable){ - if (variable.neg) return iter>=0; - return iter<variable.dim; - }, - - _getRasterLoopIterator: function(variable){ - if (variable.neg) return -1; - return 1; - }, - - _allAxesScales: function(){ - var xScale = this.xScale(); - var yScale = this.yScale(); - var zScale = this.zScale(); - return {x:xScale, y:yScale, z:zScale}; - }, - - _subtract: function(pos1, pos2){ - return {x:pos1.x-pos2.x, y:pos1.y-pos2.y, z:pos1.z-pos2.z}; - }, - - _add: function(pos1, pos2){ - return {x:pos1.x+pos2.x, y:pos1.y+pos2.y, z:pos1.z+pos2.z}; - }, - - //////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////UI/////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////// - - toJSON: function(){//a minimal toJSON for ui stuff - no need to parse all cells - return _.omit(this.attributes, ["cells", "nodes"]);//omit makes a copy - }//todo something weird here + }, + + _getRasterLoopInit: function(variable){ + if (variable.neg) return variable.dim-1; + return 0; + }, + + _getRasterLoopCondition: function(iter, variable){ + if (variable.neg) return iter>=0; + return iter<variable.dim; + }, + + _getRasterLoopIterator: function(variable){ + if (variable.neg) return -1; + return 1; + }, + + _allAxesScales: function(){ + var xScale = this.xScale(); + var yScale = this.yScale(); + var zScale = this.zScale(); + return {x:xScale, y:yScale, z:zScale}; + }, + + _subtract: function(pos1, pos2){ + return {x:pos1.x-pos2.x, y:pos1.y-pos2.y, z:pos1.z-pos2.z}; + }, + + _add: function(pos1, pos2){ + return {x:pos1.x+pos2.x, y:pos1.y+pos2.y, z:pos1.z+pos2.z}; + }, + + //////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////UI/////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + + toJSON: function(){//a minimal toJSON for ui stuff - no need to parse all cells + return _.omit(this.attributes, ["cells", "nodes"]);//omit makes a copy + }//todo something weird here + + }); + + return new Lattice(); }); \ No newline at end of file diff --git a/js/main.js b/js/main.js index 9d41b3246552e4c0c03e5a2b639b05367739990d..7cb954deda9bef3a5d883e1c4a11d7cdcda85929 100644 --- a/js/main.js +++ b/js/main.js @@ -2,36 +2,60 @@ * Created by aghassaei on 1/7/15. */ -//setup persistent global variables -if (typeof globals === "undefined") globals = {}; - - -$(function(){ - - //init web workers -// window.workers = persistentWorkers(8); - - //init global singletons - globals.three = ThreeModel(); - globals.plist = AppPList(); - globals.appState = new AppState(); - globals.lattice = new Lattice(); - globals.basePlane = null; - globals.highlighter = null; - globals.lattice.delayedInit();//todo need this? - globals.cam = new Cam({appState: globals.appState}); - globals.fileSaver = GlobalFilesaver(); - - //ui - new MenuWrapper({model: globals.appState}); - new NavBar({model:globals.appState}); - new Ribbon({model:globals.appState}); - new ScriptView({model:globals.appState}); +requirejs.config({ + baseUrl: 'js', + paths: { + jquery: 'dependencies/jquery-2.1.3', + underscore: 'dependencies/underscore', + backbone: 'dependencies/backbone', + three: 'dependencies/three', + + plist: 'models/AllAppPLists', + appState: 'models/AppState', + lattice: 'lattice/Lattice' + }, + shim: { + three: { + exports: 'THREE' + } + } +}); - //threeJS View - new ThreeView({model:globals.three}); +requirejs(['jquery', 'lattice'], function($, lattice) { + console.log(lattice); +}); - if (globals.lattice.get("connectionType") != "gik") globals.lattice.addCellAtIndex({x:0,y:0,z:0});//add a cell -// return {globals:globals}; -}); +//setup persistent global variables +//if (typeof globals === "undefined") globals = {}; +// +// +//$(function(){ +// +// //init web workers +//// window.workers = persistentWorkers(8); +// +// //init global singletons +// globals.three = ThreeModel(); +// globals.plist = AppPList(); +// globals.appState = new AppState(); +// globals.lattice = new Lattice(); +// globals.basePlane = null; +// globals.highlighter = null; +// globals.lattice.delayedInit();//todo need this? +// globals.cam = new Cam({appState: globals.appState}); +// globals.fileSaver = GlobalFilesaver(); +// +// //ui +// new MenuWrapper({model: globals.appState}); +// new NavBar({model:globals.appState}); +// new Ribbon({model:globals.appState}); +// new ScriptView({model:globals.appState}); +// +// //threeJS View +// new ThreeView({model:globals.three}); +// +// if (globals.lattice.get("connectionType") != "gik") globals.lattice.addCellAtIndex({x:0,y:0,z:0});//add a cell +// +//// return {globals:globals}; +//}); diff --git a/js/models/AllAppPLists.js b/js/models/AllAppPLists.js index 5d01495bfdc9652dc712206e3e201154cd7c60ca..7f87f81bf05ab4889abee4f750b6cdb6dba06a1b 100644 --- a/js/models/AllAppPLists.js +++ b/js/models/AllAppPLists.js @@ -1,208 +1,210 @@ //all property lists for the app, these are "static" variables -function AppPList(){ - return { +define(['three'], function(THREE){ - allMenuTabs: { - navDesign:{ - lattice:"Lattice", -// import:"Import", - //sketch:"Sketch", - part:"Part", - script:"Script" - }, - navSim:{ - physics:"Physics", - part:"Part", - material:"Material", - optimize:"Optimize" - }, - navAssemble:{ - assembler:"Assembler", - cam: "Process", - animate:"Preview", - send: "Send" - } - }, + return { - allCellTypes: { - octa:"Octahedron", - tetra: "Tetrahedron (Coming Soon)", - cube:"Cube", - truncatedCube:"Cuboctahedron", - kelvin:"Kelvin" - }, - allConnectionTypes: { - octa: {face:"Face", edgeRot:"Edge", vertex:"Vertex"},//edge:"Edge", freeformFace:"Freeform Face" - tetra: {vertex: "Vertex"}, - cube: {face:"Face", gik: "GIK"}, - truncatedCube: {face:"Face"}, - kelvin: {face: "Face"} - }, - allPartTypes:{ - octa:{ - face: { - triangle:"Triangle" - }, - freeformFace: { - trox:"Troxes" + allMenuTabs: { + navDesign:{ + lattice:"Lattice", +// import:"Import", + //sketch:"Sketch", + part:"Part", + script:"Script" }, - edge: null, - edgeRot: { - vox: "Snap Voxel (high res)", - voxLowPoly: "Snap Voxel (low res)" + navSim:{ + physics:"Physics", + part:"Part", + material:"Material", + optimize:"Optimize" }, - vertex: { + navAssemble:{ + assembler:"Assembler", + cam: "Process", + animate:"Preview", + send: "Send" + } + }, + + allCellTypes: { + octa:"Octahedron", + tetra: "Tetrahedron (Coming Soon)", + cube:"Cube", + truncatedCube:"Cuboctahedron", + kelvin:"Kelvin" + }, + allConnectionTypes: { + octa: {face:"Face", edgeRot:"Edge", vertex:"Vertex"},//edge:"Edge", freeformFace:"Freeform Face" + tetra: {vertex: "Vertex"}, + cube: {face:"Face", gik: "GIK"}, + truncatedCube: {face:"Face"}, + kelvin: {face: "Face"} + }, + allPartTypes:{ + octa:{ + face: { + triangle:"Triangle" + }, + freeformFace: { + trox:"Troxes" + }, + edge: null, + edgeRot: { + vox: "Snap Voxel (high res)", + voxLowPoly: "Snap Voxel (low res)" + }, + vertex: { square:"Square", - xShape:"X" + xShape:"X" } - }, - tetra: {vertex: null}, - cube: {face: null, - gik: { + }, + tetra: {vertex: null}, + cube: {face: null, + gik: { lego: "Micro LEGO (high res)", - legoLowPoly: "Micro LEGO (low res)" - } - }, - truncatedCube: { - face: { - square:"Square", - xShape:"X" + legoLowPoly: "Micro LEGO (low res)" } + }, + truncatedCube: { + face: { + square:"Square", + xShape:"X" + } + }, + kelvin: {face: null} }, - kelvin: {face: null} - }, - allMaterialTypes:{ - octa:{ - face: null, - freeformFace: null, - edge: null, - edgeRot: null, - vertex: null - }, - tetra: {vertex: null}, - cube: {face: null, - gik: { + allMaterialTypes:{ + octa:{ + face: null, + freeformFace: null, + edge: null, + edgeRot: null, + vertex: null + }, + tetra: {vertex: null}, + cube: {face: null, + gik: { brass:{ name: "Brass", - color: "#b5a642", - altColor: "#857B64" + color: "#b5a642", + altColor: "#857B64" }, fiberGlass: { name: "Fiberglass", - color: "#fef1b5", + color: "#fef1b5", // opacity: "0.9", - altColor: "#ecf0f1" + altColor: "#ecf0f1" }, carbon: { name: "Carbon Composite", - color: "#222", - altColor: "#000" + color: "#222", + altColor: "#000" }, nType: { name: "Silicon N-Type", - color: "#bcc6cc", - altColor: "#9CC9CB" + color: "#bcc6cc", + altColor: "#9CC9CB" }, nTypePlus: { name: "Silicon Heavily Doped N-Type (N+)", - color: "#c6ccbc", - altColor: "#8391AC" + color: "#c6ccbc", + altColor: "#8391AC" }, pType: { name: "Silicon P-Type", - color: "#ccbcc6", - altColor: "#F5447B" + color: "#ccbcc6", + altColor: "#F5447B" }, pTypePlus: { name: "Silicon Heavily Doped P-Type (P+)", - color: "#ccc2bc", - altColor: "#F99987" + color: "#ccc2bc", + altColor: "#F99987" } //857B64 //FDE2D9 //D77948 } + }, + truncatedCube: {face: null}, + kelvin: {face: null} }, - truncatedCube: {face: null}, - kelvin: {face: null} - }, - allMachineTypes:{ - octa:{ - face: {handOfGod: "Hand of God"}, - freeformFace: {handOfGod: "Hand of God"}, - edgeRot: { - shopbot: "Shopbot", - oneBitBot: "One Bit Bot", - oneBitBotLegs: "One Bit Bot with Legs", - handOfGod: "Hand of God" + allMachineTypes:{ + octa:{ + face: {handOfGod: "Hand of God"}, + freeformFace: {handOfGod: "Hand of God"}, + edgeRot: { + shopbot: "Shopbot", + oneBitBot: "One Bit Bot", + oneBitBotLegs: "One Bit Bot with Legs", + handOfGod: "Hand of God" + }, + vertex: {handOfGod: "Hand of God"} }, - vertex: {handOfGod: "Hand of God"} - }, - tetra: { - vertex:{handOfGod: "Hand of God"} - }, - cube:{ - face:{handOfGod: "Hand of God"}, - gik: { - stapler: "Stapler", - staplerDual: "Dual Head Stapler" + tetra: { + vertex:{handOfGod: "Hand of God"} + }, + cube:{ + face:{handOfGod: "Hand of God"}, + gik: { + stapler: "Stapler", + staplerDual: "Dual Head Stapler" // handOfGod: "Hand of God" + } + }, + truncatedCube:{ + face:{handOfGod: "Hand of God"} + }, + kelvin:{ + face:{handOfGod: "Hand of God"} } }, - truncatedCube:{ - face:{handOfGod: "Hand of God"} + allAssemblyStrategies: { + raster: "Raster" }, - kelvin:{ - face:{handOfGod: "Hand of God"} - } - }, - allAssemblyStrategies: { - raster: "Raster" - }, - allCamProcesses: { - shopbot:{ - shopbot: "Shopbot (sbp)", - gcode: "G-Code" + allCamProcesses: { + shopbot:{ + shopbot: "Shopbot (sbp)", + gcode: "G-Code" + }, + handOfGod:{gcode: "G-Code"}, + oneBitBot:{ + gcode: "G-Code", + tinyG: "TinyG" + }, + stapler: {gcode: "G-Code"}, + staplerDual: {gcode: "G-Code"} }, - handOfGod:{gcode: "G-Code"}, - oneBitBot:{ - gcode: "G-Code", - tinyG: "TinyG" + + allMachineDefaults: { + shopbot:null, + handOfGod:null, + oneBitBot:null, + stapler: { + camStrategy: "raster", + placementOrder: "XYZ",//used for raster strategy entry + camProcess: "gcode", + rapidHeight:3, + rapidHeightRelative: true, + safeHeight: 0.05, + originPosition: new THREE.Vector3(0,0,0), + rapidSpeeds:{xy: 3, z: 2}, + feedRate:{xy: 0.1, z: 0.1} + }, + staplerDual: null }, - stapler: {gcode: "G-Code"}, - staplerDual: {gcode: "G-Code"} - }, - allMachineDefaults: { - shopbot:null, - handOfGod:null, - oneBitBot:null, - stapler: { - camStrategy: "raster", - placementOrder: "XYZ",//used for raster strategy entry - camProcess: "gcode", - rapidHeight:3, - rapidHeightRelative: true, - safeHeight: 0.05, - originPosition: new THREE.Vector3(0,0,0), - rapidSpeeds:{xy: 3, z: 2}, - feedRate:{xy: 0.1, z: 0.1} + allScripts: { + loadFile: "Load From File..." }, - staplerDual: null - }, - allScripts: { - loadFile: "Load From File..." - }, + allUnitTypes: { + inches: "Inches", + mm: "mm" + //um: "micron" + } - allUnitTypes: { - inches: "Inches", - mm: "mm", - //um: "micron" } - -}} \ No newline at end of file +}); \ No newline at end of file diff --git a/js/models/AppState.js b/js/models/AppState.js index ba5855e3ddcbec7256a38440675ad2b3438574da..445327b77e23050f97525ef94be5e343ce03cc1d 100644 --- a/js/models/AppState.js +++ b/js/models/AppState.js @@ -5,212 +5,218 @@ //a class to store global app state, model for navbar and menu wrapper //never deallocated -AppState = Backbone.Model.extend({ +define(['backbone'], function(Backbone){ + + var AppState = Backbone.Model.extend({ + + defaults: {//menu and view/render/interaction states + + currentNav:"navDesign",// design, sim, assemble + currentTab:"lattice", + + //last tab that one open in each of the main menus + lastDesignTab: "lattice", + lastSimulationTab: "physics", + lastAssembleTab: "assembler", + + menuIsVisible: true, + scriptIsVisible: false, + consoleIsVisible: false, + ribbonIsVisible: true, - defaults: {//menu and view/render/interaction states + basePlaneIsVisible:true, + highlighterIsVisible:true, + axesAreVisible: false, - currentNav:"navDesign",// design, sim, assemble - currentTab:"lattice", + //key bindings + shift: false, + deleteMode: false, + highlightMode: true, + extrudeMode: false, + cellMode: "cell",//show cells vs part + cellsVisible: true, - //last tab that one open in each of the main menus - lastDesignTab: "lattice", - lastSimulationTab: "physics", - lastAssembleTab: "assembler", - - menuIsVisible: true, - scriptIsVisible: false, - consoleIsVisible: false, - ribbonIsVisible: true, - - basePlaneIsVisible:true, - highlighterIsVisible:true, - axesAreVisible: false, - - //key bindings - shift: false, - deleteMode: false, - highlightMode: true, - extrudeMode: false, - cellMode: "cell",//show cells vs part - cellsVisible: true, - - superCellIndex: 0,//offset of superCell adds todo lattice? - - realisticColorScheme: false, - - stockSimulationPlaying: false, - manualSelectOrigin: false//mode that allows user ot select origin from existing cell - }, - - initialize: function(){ - - _.bindAll(this, "_handleKeyStroke", "_handleScroll"); - - //bind events - $(document).bind('keydown', {state:true}, this._handleKeyStroke); - $(document).bind('keyup', {state:false}, this._handleKeyStroke); - $(document).bind('mousewheel', {}, this._handleScroll);//disable browser back scroll - - this.listenTo(this, "change:currentTab", this._tabChanged); - this.listenTo(this, "change:currentNav", this._navChanged); - this.listenTo(this, "change:realisticColorScheme", this._updateColorScheme); - - this.downKeys = {};//track keypresses to prevent repeat keystrokeson hold - - if (this.isMobile()) this.set("menuIsVisible", false); - }, - - isMobile: function() { - return (window.innerWidth <= 700); - }, - - - /////////////////////////////////////////////////////////////////////////////// - /////////////////////EVENTS//////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////// - - - _tabChanged: function(){ - var currentTab = this.get("currentTab"); - if (currentTab != "animate") this.set("stockSimulationPlaying", false); - if (currentTab != "cam") this.set("manualSelectOrigin", false); - if (currentTab == "import" && globals.lattice.get("connectionType") == "edgeRot") globals.lattice.set("partType", "voxLowPoly"); - this._storeTab(this.get("currentNav"), currentTab); - this._updateCellMode(currentTab); - }, - - _storeTab: function(currentNav, currentTab){ - if (currentNav == "navDesign") this.set("lastDesignTab", currentTab); - else if (currentNav == "navSim") this.set("lastSimulationTab", currentTab); - else if (currentNav == "navAssemble") this.set("lastAssembleTab", currentTab); - }, - - _updateCellMode: function(currentTab){ - if (currentTab == "lattice" || currentTab == "import") this.set("cellMode", "cell"); - //else if (currentTab == "import") this.set("cellMode", "cell"); - //else if (currentTab == "sketch") this.set("cellMode", "cell"); - else if (currentTab == "part") this.set("cellMode", "part"); - }, - - _navChanged: function(){ - //update to last tab open in that section - var navSelection = this.get("currentNav"); - if (navSelection == "navDesign") { - this.set("currentTab", this.get("lastDesignTab")); - this.set("basePlaneIsVisible", true); - this.set("highlighterIsVisible", true); - } - else if (navSelection == "navSim") { - this.set("currentTab", this.get("lastSimulationTab")); - } - else if (navSelection == "navAssemble") { - this.set("currentTab", this.get("lastAssembleTab")); - } - }, - - _updateColorScheme: function(){ - changeGikMaterials(); - globals.three.render(); - }, - - /////////////////////////////////////////////////////////////////////////////// - /////////////////////KEY BINDINGS////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////// - - _handleKeyStroke: function(e){//receives keyup and keydown - - if ($("input").is(':focus')) return;//we are typing in an input - if ($("textarea").is(':focus')) return;//we are typing in an input - - var state = e.data.state; - var currentTab = this.get("currentTab"); - - this.set("shift", false);//just in case, this is getting all weird during other meta commands in the browser - - if (e.ctrlKey || e.metaKey){ - } else if (state) { - if (this.downKeys[e.keyCode]) return; - this.downKeys[e.keyCode] = true; - } else this.downKeys[e.keyCode] = false; - -// console.log(e); -// console.log(e.keyCode); - switch(e.keyCode){ - case 8://delete key - causes back nav in chrome, super annoying - e.preventDefault(); - e.stopPropagation(); - case 16://shift -// this.set("shift", state); - break; - case 68://d delete mode - this.set("deleteMode", state); - break; - case 69://e -// if (currentTab != "sketch") return; - this.set("extrudeMode", state); - break; - case 80://p part mode - var cellMode = this.get("cellMode"); - if (cellMode == "part") this.set("cellMode", "cell"); - else if (cellMode == "cell") this.set("cellMode", "part"); - break; - case 83://s save - if (e.ctrlKey || e.metaKey){//command + superCellIndex: 0,//offset of superCell adds todo lattice? + + realisticColorScheme: false, + + stockSimulationPlaying: false, + manualSelectOrigin: false//mode that allows user ot select origin from existing cell + }, + + initialize: function(){ + + _.bindAll(this, "_handleKeyStroke", "_handleScroll"); + + //bind events + $(document).bind('keydown', {state:true}, this._handleKeyStroke); + $(document).bind('keyup', {state:false}, this._handleKeyStroke); + $(document).bind('mousewheel', {}, this._handleScroll);//disable browser back scroll + + this.listenTo(this, "change:currentTab", this._tabChanged); + this.listenTo(this, "change:currentNav", this._navChanged); + this.listenTo(this, "change:realisticColorScheme", this._updateColorScheme); + + this.downKeys = {};//track keypresses to prevent repeat keystrokeson hold + + if (this.isMobile()) this.set("menuIsVisible", false); + }, + + isMobile: function() { + return (window.innerWidth <= 700); + }, + + + /////////////////////////////////////////////////////////////////////////////// + /////////////////////EVENTS//////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////// + + + _tabChanged: function(){ + var currentTab = this.get("currentTab"); + if (currentTab != "animate") this.set("stockSimulationPlaying", false); + if (currentTab != "cam") this.set("manualSelectOrigin", false); + if (currentTab == "import" && globals.lattice.get("connectionType") == "edgeRot") globals.lattice.set("partType", "voxLowPoly"); + this._storeTab(this.get("currentNav"), currentTab); + this._updateCellMode(currentTab); + }, + + _storeTab: function(currentNav, currentTab){ + if (currentNav == "navDesign") this.set("lastDesignTab", currentTab); + else if (currentNav == "navSim") this.set("lastSimulationTab", currentTab); + else if (currentNav == "navAssemble") this.set("lastAssembleTab", currentTab); + }, + + _updateCellMode: function(currentTab){ + if (currentTab == "lattice" || currentTab == "import") this.set("cellMode", "cell"); + //else if (currentTab == "import") this.set("cellMode", "cell"); + //else if (currentTab == "sketch") this.set("cellMode", "cell"); + else if (currentTab == "part") this.set("cellMode", "part"); + }, + + _navChanged: function(){ + //update to last tab open in that section + var navSelection = this.get("currentNav"); + if (navSelection == "navDesign") { + this.set("currentTab", this.get("lastDesignTab")); + this.set("basePlaneIsVisible", true); + this.set("highlighterIsVisible", true); + } + else if (navSelection == "navSim") { + this.set("currentTab", this.get("lastSimulationTab")); + } + else if (navSelection == "navAssemble") { + this.set("currentTab", this.get("lastAssembleTab")); + } + }, + + _updateColorScheme: function(){ + changeGikMaterials(); + globals.three.render(); + }, + + /////////////////////////////////////////////////////////////////////////////// + /////////////////////KEY BINDINGS////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////// + + _handleKeyStroke: function(e){//receives keyup and keydown + + if ($("input").is(':focus')) return;//we are typing in an input + if ($("textarea").is(':focus')) return;//we are typing in an input + + var state = e.data.state; + var currentTab = this.get("currentTab"); + + this.set("shift", false);//just in case, this is getting all weird during other meta commands in the browser + + if (e.ctrlKey || e.metaKey){ + } else if (state) { + if (this.downKeys[e.keyCode]) return; + this.downKeys[e.keyCode] = true; + } else this.downKeys[e.keyCode] = false; + + // console.log(e); + // console.log(e.keyCode); + switch(e.keyCode){ + case 8://delete key - causes back nav in chrome, super annoying e.preventDefault(); - if (e.shiftKey){ - this.set("shift", false); - $("#saveAsModel").modal("show"); - } else { - globals.fileSaver.save(); + e.stopPropagation(); + case 16://shift + // this.set("shift", state); + break; + case 68://d delete mode + this.set("deleteMode", state); + break; + case 69://e + // if (currentTab != "sketch") return; + this.set("extrudeMode", state); + break; + case 80://p part mode + var cellMode = this.get("cellMode"); + if (cellMode == "part") this.set("cellMode", "cell"); + else if (cellMode == "cell") this.set("cellMode", "part"); + break; + case 83://s save + if (e.ctrlKey || e.metaKey){//command + e.preventDefault(); + if (e.shiftKey){ + this.set("shift", false); + $("#saveAsModel").modal("show"); + } else { + globals.fileSaver.save(); + } } - } - break; - case 79://o open - if (e.ctrlKey || e.metaKey){//command + break; + case 79://o open + if (e.ctrlKey || e.metaKey){//command + e.preventDefault(); + $("#jsonInput").click(); + } + break; + case 32://space bar (play/pause simulation) e.preventDefault(); - $("#jsonInput").click(); - } - break; - case 32://space bar (play/pause simulation) - e.preventDefault(); - if (state && this.get("currentTab") == "animate") this.set("stockSimulationPlaying", !this.get("stockSimulationPlaying")); - break; - case 50://2-9 - case 51: - case 52: - case 53: - case 54: - case 55: - case 56: - case 57: - if (globals.lattice.get("connectionType") != "gik") break; - if (state) { - var range = globals.lattice.get("superCellRange").clone(); - range.x = e.keyCode-48; - globals.lattice.set("superCellRange", range); - } - break; - case 81://q - increase supercell index - if (state) { - var index = this.get("superCellIndex")+1; - if (index > globals.lattice.get("superCellRange").x-1) index = 0; - this.set("superCellIndex", index); - } - break; - case 65://a - decrease supercell index - if (state) { - var index = this.get("superCellIndex")-1; - if (index < 0) index = globals.lattice.get("superCellRange").x-1; - this.set("superCellIndex", index); - } - break; - default: - break; + if (state && this.get("currentTab") == "animate") this.set("stockSimulationPlaying", !this.get("stockSimulationPlaying")); + break; + case 50://2-9 + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + if (globals.lattice.get("connectionType") != "gik") break; + if (state) { + var range = globals.lattice.get("superCellRange").clone(); + range.x = e.keyCode-48; + globals.lattice.set("superCellRange", range); + } + break; + case 81://q - increase supercell index + if (state) { + var index = this.get("superCellIndex")+1; + if (index > globals.lattice.get("superCellRange").x-1) index = 0; + this.set("superCellIndex", index); + } + break; + case 65://a - decrease supercell index + if (state) { + var index = this.get("superCellIndex")-1; + if (index < 0) index = globals.lattice.get("superCellRange").x-1; + this.set("superCellIndex", index); + } + break; + default: + break; + } + }, + + _handleScroll: function(e){//disable two finger swipe back + if (Math.abs(e.originalEvent.deltaX) > Math.abs(e.originalEvent.deltaY)) e.preventDefault(); } - }, - _handleScroll: function(e){//disable two finger swipe back - if (Math.abs(e.originalEvent.deltaX) > Math.abs(e.originalEvent.deltaY)) e.preventDefault(); - } + }); + + return new AppState();//return singleton }); \ No newline at end of file