├── lab-snowtooth-express ├── public │ ├── main.js │ ├── img │ │ ├── band.png │ │ ├── hotel.png │ │ ├── kids.png │ │ ├── lessons.png │ │ ├── get-some-lg.jpg │ │ ├── get-some-md.jpg │ │ └── get-some-sm.jpg │ ├── _dependencies │ │ ├── normalize.min.css │ │ ├── modernizr.min.js │ │ └── jquery.min.js │ ├── style.css │ ├── source.scss │ └── index.html ├── app.js └── readme.md ├── lab-best-of-3 ├── lib │ └── coinflip.js ├── bestof.js └── readme.md ├── MH - Node js Kickoff.pdf ├── http servers ├── img │ └── pilot.png ├── html │ └── index.html ├── servers.js └── readme.md ├── lab-moodserver ├── public │ ├── img │ │ ├── happy.jpg │ │ └── sad.jpg │ ├── sad.html │ └── happy.html ├── mood-server.js └── readme.md ├── modules ├── game-function.js ├── bin │ ├── dice.js │ └── dice-function.js ├── game.js └── readme.md ├── node core ├── util.js ├── path.js ├── process-argv.js ├── global.js ├── process-stdin-stdout.js ├── timers.js └── readme.md ├── optimist ├── arguments.js └── readme.md ├── fs ├── directories.js ├── readme.md └── files.js ├── readme.md ├── .jshintrc ├── Intro ├── hello-world.js └── readme.md ├── EventEmitter ├── emitter.js ├── say-something.js └── readme.md ├── request ├── request-binary.js ├── readme.md └── request.js ├── .gitignore ├── package.json ├── formidable ├── readme.md └── formidable-server.js ├── LICENSE ├── GruntFile.js ├── parsing post bodies ├── server.js ├── server-upload.js └── readme.md └── npm └── readme.md /lab-snowtooth-express/public/main.js: -------------------------------------------------------------------------------- 1 | $(document).foundation(); -------------------------------------------------------------------------------- /lab-best-of-3/lib/coinflip.js: -------------------------------------------------------------------------------- 1 | // 2 | // TODO: Export a coin flip function 3 | // -------------------------------------------------------------------------------- /lab-best-of-3/bestof.js: -------------------------------------------------------------------------------- 1 | // 2 | // TODO: Code this module, consume ./lib/coinflip 3 | // -------------------------------------------------------------------------------- /MH - Node js Kickoff.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoonHighway/node-js-kickoff/HEAD/MH - Node js Kickoff.pdf -------------------------------------------------------------------------------- /http servers/img/pilot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoonHighway/node-js-kickoff/HEAD/http servers/img/pilot.png -------------------------------------------------------------------------------- /lab-moodserver/public/img/happy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoonHighway/node-js-kickoff/HEAD/lab-moodserver/public/img/happy.jpg -------------------------------------------------------------------------------- /lab-moodserver/public/img/sad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoonHighway/node-js-kickoff/HEAD/lab-moodserver/public/img/sad.jpg -------------------------------------------------------------------------------- /lab-snowtooth-express/public/img/band.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoonHighway/node-js-kickoff/HEAD/lab-snowtooth-express/public/img/band.png -------------------------------------------------------------------------------- /lab-snowtooth-express/public/img/hotel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoonHighway/node-js-kickoff/HEAD/lab-snowtooth-express/public/img/hotel.png -------------------------------------------------------------------------------- /lab-snowtooth-express/public/img/kids.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoonHighway/node-js-kickoff/HEAD/lab-snowtooth-express/public/img/kids.png -------------------------------------------------------------------------------- /lab-snowtooth-express/public/img/lessons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoonHighway/node-js-kickoff/HEAD/lab-snowtooth-express/public/img/lessons.png -------------------------------------------------------------------------------- /lab-snowtooth-express/public/img/get-some-lg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoonHighway/node-js-kickoff/HEAD/lab-snowtooth-express/public/img/get-some-lg.jpg -------------------------------------------------------------------------------- /lab-snowtooth-express/public/img/get-some-md.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoonHighway/node-js-kickoff/HEAD/lab-snowtooth-express/public/img/get-some-md.jpg -------------------------------------------------------------------------------- /lab-snowtooth-express/public/img/get-some-sm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoonHighway/node-js-kickoff/HEAD/lab-snowtooth-express/public/img/get-some-sm.jpg -------------------------------------------------------------------------------- /modules/game-function.js: -------------------------------------------------------------------------------- 1 | var roll = require("./bin/dice-function")(100); 2 | 3 | console.log("Rolling a default sided die and the results are:", roll()); 4 | console.log("Rolling a 20 sided die:", roll()); 5 | -------------------------------------------------------------------------------- /http servers/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HTML Files 6 | 7 | 8 |

Serving HTML FILES!!!

9 | 10 | -------------------------------------------------------------------------------- /node core/util.js: -------------------------------------------------------------------------------- 1 | var util = require('util'); 2 | 3 | util.print("Gives more control "); 4 | util.print("over how things \n are written \n and formatted \n to the console.\n\n\n\n\n"); 5 | 6 | util.log("Some more options"); 7 | -------------------------------------------------------------------------------- /modules/bin/dice.js: -------------------------------------------------------------------------------- 1 | console.log("Initializing the dice module"); 2 | 3 | var defaultFaces = 6; 4 | 5 | exports.roll = function(faces) { 6 | faces = (typeof faces == "number" && faces > 0) ? faces : defaultFaces; 7 | return Math.ceil(Math.random() * faces); 8 | }; -------------------------------------------------------------------------------- /lab-snowtooth-express/app.js: -------------------------------------------------------------------------------- 1 | // 2 | // TODO: Create an Express App that runs on port 3000 3 | // 4 | 5 | // 6 | // TODO: Add Express Static Middleware to serve from public folder 7 | // 8 | 9 | // 10 | // TODO: Add logging middleware 11 | // 12 | 13 | // 14 | // TODO: Add dependencies and scripts to a package.json file 15 | // -------------------------------------------------------------------------------- /modules/bin/dice-function.js: -------------------------------------------------------------------------------- 1 | console.log("Initializing the dice module"); 2 | 3 | var defaultFaces = 6; 4 | 5 | module.exports = function(faces) { 6 | 7 | defaultFaces = faces; 8 | 9 | return function() { 10 | 11 | return Math.floor(Math.random() * defaultFaces); 12 | 13 | } 14 | 15 | }; 16 | 17 | 18 | -------------------------------------------------------------------------------- /optimist/arguments.js: -------------------------------------------------------------------------------- 1 | var argv = require('optimist').argv; 2 | 3 | if (!argv.adj) { 4 | console.log("You need to run this again with arguments --adj, --verb, --pastVerb, --noun"); 5 | process.exit(); 6 | } 7 | 8 | console.log('The %s man %s the dishes before he %s to his %s.', argv.adj, argv.pastVerb, argv.verb, argv.noun); 9 | -------------------------------------------------------------------------------- /node core/path.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var url = "/some//Path\/that is a bit//broken/../.."; 3 | 4 | url = path.normalize(url); 5 | 6 | console.log(url); 7 | 8 | url = path.join('courses', 'class', 'javascript', 'students'); 9 | 10 | console.log(url); 11 | 12 | url += "/studentList.html"; 13 | 14 | console.log(url); 15 | 16 | url = path.basename(__filename); 17 | 18 | console.log(url); 19 | -------------------------------------------------------------------------------- /node core/process-argv.js: -------------------------------------------------------------------------------- 1 | console.log(process.argv); 2 | 3 | function getArgument(name) { 4 | return process.argv[process.argv.indexOf(name)+1]; 5 | } 6 | 7 | /* process argv always contains 'node' and 'filename' 8 | * 9 | */ 10 | if (process.argv.length > 2) { 11 | console.log("INFO: " + getArgument('-info')); 12 | } else { 13 | console.log("This process ran without arguments"); 14 | } 15 | -------------------------------------------------------------------------------- /lab-moodserver/mood-server.js: -------------------------------------------------------------------------------- 1 | // TODO: Create a variable to hold mood 'happy' or 'sad' 2 | // TODO: Create a webserver and serve './public/happy.html' or './public/sad.html' 3 | // TODO: Make sure the server also serves images 4 | // TODO: Collect data from the user using process.stdin.on('data', callback); 5 | // TODO: Allow user to set happy or sad from console 6 | // TODO: Allow user to exit by typing exit into the console -------------------------------------------------------------------------------- /node core/global.js: -------------------------------------------------------------------------------- 1 | var user = { 2 | first: "Leroy", 3 | last: "Brown" 4 | }; 5 | 6 | console.log("This code is located in the file %s", __filename); 7 | console.log("This file is located in the directory %s", __dirname); 8 | 9 | console.log("======================================================="); 10 | 11 | console.log(global); 12 | 13 | console.log("======================================================="); 14 | 15 | -------------------------------------------------------------------------------- /node core/process-stdin-stdout.js: -------------------------------------------------------------------------------- 1 | //Standard Output 2 | process.stdout.write("\nInput: "); 3 | 4 | //Standard Input 5 | process.stdin.on('data', function(data) { 6 | 7 | var input = data.toString().toLowerCase().trim(); 8 | 9 | if (input === "exit") { 10 | 11 | //Exit 12 | process.exit(); 13 | 14 | } 15 | 16 | //Standard Output 17 | process.stdout.write("Output: " + input +"\nInput: "); 18 | 19 | }); -------------------------------------------------------------------------------- /modules/game.js: -------------------------------------------------------------------------------- 1 | var dice = require("./bin/dice"); 2 | 3 | console.log("Rolling a default sided die and the results are:", dice.roll()); 4 | console.log("Rolling a 20 sided die:", dice.roll(20)); 5 | 6 | var roll = require("./bin/dice").roll; 7 | console.log("Rolling with just the imported roll function:", roll(1000)); 8 | 9 | console.log("The typeof defaultFaces is:", typeof defaultFaces); 10 | console.log("The typeof dice.defaultFaces is:", typeof dice.defaultFaces); -------------------------------------------------------------------------------- /lab-moodserver/public/sad.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Soooooo Sad 6 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /lab-moodserver/public/happy.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Happy Happy Happy 6 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /fs/directories.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | 3 | var students = { 4 | 5 | "Leroy": "JAVA", 6 | "Paul": "Javascript", 7 | "JuJuBee": "HTML" 8 | 9 | }; 10 | 11 | if (!fs.existsSync(__dirname + "/students")) { 12 | fs.mkdirSync("./students"); 13 | } 14 | 15 | fs.appendFile('students/index.json', JSON.stringify(students), function(err) { 16 | 17 | if (err) { 18 | throw err; 19 | } 20 | 21 | console.log("Directory and File Created"); 22 | 23 | }); 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | Introduction to Node js 2 | ======================= 3 | This course introduces Javascript Engineers to Node js. This course covers how node works, when to use it, 4 | and how to use it. In this introduction we will look mostly at the core components of node js that 5 | were developed by Joyent. This course wraps with with building a module to publish on the NPM registry. 6 | 7 | Topics 8 | ------ 9 | * Introducing Node js 10 | * Node Core 11 | * fs Module 12 | * Making Requests 13 | * HTTP Servers 14 | * Node Package Manager, NPM 15 | * Using Node Modules 16 | * Introducing Express 17 | 18 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "curly" : true, 3 | "eqeqeq" : true, 4 | "immed" : true, 5 | "latedef" : true, 6 | "newcap" : true, 7 | "noarg" : true, 8 | "sub" : true, 9 | "undef" : true, 10 | "laxbreak": true, 11 | "boss" : true, 12 | "eqnull" : true, 13 | "node" : true, 14 | "globals" : { 15 | "it" : false, 16 | "xit" : false, 17 | "describe" : false, 18 | "xdescribe" : false, 19 | "beforeEach" : false, 20 | "afterEach" : false, 21 | "expect" : false, 22 | "spyOn" : false 23 | } 24 | } -------------------------------------------------------------------------------- /Intro/hello-world.js: -------------------------------------------------------------------------------- 1 | // Setting h to a String "Hello" 2 | var h = "Hello"; 3 | 4 | // Setting w to a String "Hello" 5 | var w = "World"; 6 | 7 | /** 8 | * Concatenates two strings with a space and appends an explanation point and "From Node js ;)" 9 | * @param first {string} The first word 10 | * @param second {string} The second word 11 | * @returns {string} A sentence containing the first and second word 12 | */ 13 | function print(first, second) { 14 | return first + " " + second + "! From Node js ;)"; 15 | } 16 | 17 | // Executes the print function 18 | var r = print(h, w); 19 | 20 | // Outputs the results 21 | console.log(r); 22 | -------------------------------------------------------------------------------- /EventEmitter/emitter.js: -------------------------------------------------------------------------------- 1 | var EventEmitter = require('events').EventEmitter; 2 | 3 | var event = new EventEmitter(); 4 | var count = 0; 5 | 6 | event.on("customEvent", function (message, count) { 7 | console.log(count + " custom: ", message); 8 | }); 9 | 10 | process.stdin.on('data', function (data) { 11 | 12 | var input = data.toString().toLowerCase().trim(); 13 | 14 | if (input === 'exit') { 15 | process.exit(); 16 | } 17 | 18 | event.emit("customEvent", input, ++count); 19 | 20 | }); 21 | 22 | process.on('exit', function () { 23 | 24 | console.log('leaving after ' + count + ' events were emitted'); 25 | 26 | }); 27 | -------------------------------------------------------------------------------- /request/request-binary.js: -------------------------------------------------------------------------------- 1 | var http = require('http'), 2 | fs = require('fs'); 3 | 4 | var options = { 5 | hostname: 'topics.nytimes.com', 6 | port: 80, 7 | path: '/top/reference/timestopics/subjects/a/avalanches/index.html', 8 | method: 'GET' 9 | }; 10 | 11 | var req = http.request(options, function(res) { 12 | 13 | res.on('data', function (chunk) { 14 | fs.appendFile('avi-binary.html.download', chunk); 15 | }); 16 | 17 | res.on('end', function () { 18 | fs.rename('avi-binary.html.download', 'avi-binary.html'); 19 | }); 20 | 21 | }); 22 | 23 | 24 | req.on('error', function(e) { 25 | console.log('problem with request: ' + e.message); 26 | }); 27 | 28 | req.end(); 29 | -------------------------------------------------------------------------------- /request/readme.md: -------------------------------------------------------------------------------- 1 | Making HTTP Requests 2 | ============ 3 | You can use the HTTP object to make a HTTP request for a webpage or a file. 4 | 5 | Making a Request 6 | ---------------- 7 | 8 | ```javascript 9 | var http = require('http'); 10 | 11 | http.request({ 12 | hostname: 'en.wikipedia.org', 13 | port: 80, 14 | path: '/wiki/Mchammer', 15 | method: 'GET' 16 | }, function(res) { 17 | 18 | var body = ""; 19 | 20 | res.on('data', function (chunk) { 21 | body += chunk; 22 | }); 23 | 24 | res.on('end', function() { 25 | console.log(body); 26 | }); 27 | 28 | }).end(); 29 | 30 | ``` 31 | 32 | 33 | -------------------------------------------------------------------------------- /lab-moodserver/readme.md: -------------------------------------------------------------------------------- 1 | Mood Server 2 | =========== 3 | The mood server is an http server that serves html pages 'happy' or 'sad' depending upon the mood variable. The 4 | mood variable is set by collecting console data using process.stdin 5 | 6 | Topics 7 | ------ 8 | * http server 9 | * serving html 10 | * serving img 11 | * process.stdin 12 | 13 | 14 | Instructions 15 | ------------ 16 | 1. Create a variable to hold mood 'happy' or 'sad' 17 | 2. Create a webserver and serve './public/happy.html' or './public/sad.html' 18 | 3. Make sure the server also serves images 19 | 4. Collect data from the user using process.stdin.on('data', callback); 20 | 4. Allow user to set happy or sad from console 21 | 5. Allow user to exit by typing exit into the console 22 | 23 | 24 | -------------------------------------------------------------------------------- /node core/timers.js: -------------------------------------------------------------------------------- 1 | var waitTime = 3000; 2 | var currentTime = 0; 3 | var percentWaited = 0; 4 | var waitInterval = 100; 5 | 6 | function writeWaitingPercent(p) { 7 | process.stdout.clearLine(); 8 | process.stdout.cursorTo(0); 9 | process.stdout.write(`waiting ... ${p}%`); 10 | } 11 | 12 | setTimeout(function () { 13 | 14 | clearInterval(interval); 15 | writeWaitingPercent(100); 16 | process.stdout.write('\n\n\n'); 17 | 18 | }, waitTime); 19 | 20 | var interval = setInterval(function () { 21 | 22 | currentTime += waitInterval; 23 | percentWaited = Math.floor((currentTime / waitTime) * 100); 24 | writeWaitingPercent(percentWaited); 25 | 26 | }, waitInterval); 27 | 28 | 29 | process.stdout.write('\n\n'); 30 | writeWaitingPercent(percentWaited); -------------------------------------------------------------------------------- /optimist/readme.md: -------------------------------------------------------------------------------- 1 | npm optimist module 2 | =================== 3 | A node modules that takes terminal arguments and places them on a hash. 4 | 5 | Installing Optimist 6 | ------------------- 7 | [optimist](https://www.npmjs.org/package/optimist) 8 | 9 | ``` 10 | $ npm install optimist 11 | ``` 12 | 13 | Sending Data to your node app 14 | ----------------------------- 15 | 16 | ``` 17 | $ node arguments.js --adj nice --pastVerb ate --verb ran --noun car 18 | ``` 19 | 20 | Getting the data in the node app 21 | ----------------------------------- 22 | 23 | ```javascript 24 | 25 | var argv = require('optimist').argv; 26 | 27 | argv.adj; // 'nice' 28 | argv.pastVerb; // 'ate' 29 | argv.verb; // 'ran' 30 | argv.noun; // 'car' 31 | 32 | ``` 33 | 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .gitignore support plugin (hsz.mobi) 2 | ### Node template 3 | # Logs 4 | logs 5 | *.log 6 | 7 | # Runtime data 8 | pids 9 | *.pid 10 | *.seed 11 | 12 | # Directory for instrumented libs generated by jscoverage/JSCover 13 | lib-cov 14 | 15 | # Coverage directory used by tools like istanbul 16 | coverage 17 | 18 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 19 | .grunt 20 | 21 | # Compiled binary addons (http://nodejs.org/api/addons.html) 22 | build/Release 23 | 24 | # Dependency directory 25 | # Commenting this out is preferred by some people, see 26 | # https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git 27 | node_modules 28 | 29 | # Users Environment Variables 30 | .lock-wscript 31 | 32 | # IDE Assets 33 | .idea/ 34 | -------------------------------------------------------------------------------- /fs/readme.md: -------------------------------------------------------------------------------- 1 | Node js fs module 2 | ================= 3 | Node js manages the file system through the fs module. This module contains everything required to manage files and 4 | directories. Files can be read as Binary or as a number of different file formats. 5 | 6 | Files 7 | ----- 8 | 9 | ###Reading Files 10 | ```javascript 11 | 12 | fs.readFile("/path/file.txt", 'UTF-8', function(err, fileText) { }); 13 | fs.readFile("/path/file.txt", function(err, buffer) { }); 14 | 15 | ``` 16 | 17 | ###Appending Files 18 | ```javascript 19 | 20 | fs.appendFile("/path/file.txt", "A New Text File", function(err) { }); 21 | fs.appendFileSync("/path/file.txt", "A New Text File"); 22 | 23 | ``` 24 | 25 | ###Removing Files 26 | ```javascript 27 | 28 | fs.unlink("/path/file.txt", function(err) { }); 29 | fs.unlinkSync("/path/file.txt"); 30 | 31 | ``` 32 | -------------------------------------------------------------------------------- /lab-snowtooth-express/readme.md: -------------------------------------------------------------------------------- 1 | Snowtooth Express Static Site 2 | ============================= 3 | In this lab students will create a new website using the express framework. The goal is to create a 4 | package.json file and install the required frameworks using npm. Once the required framewroks are 5 | installed they will be used to host a static website from the public folder. 6 | 7 | Topics 8 | ------ 9 | * npm install 10 | * package.json 11 | * express 12 | * express.static 13 | * morgan 14 | 15 | 16 | Instructions 17 | ------------ 18 | 1. Create a new package.json file for this website 19 | 2. Install express and morgan 20 | 3. Use express.static to serve static files from the __public__ folder 21 | 4. Use the morgan logger to display logging info on the console 22 | 5. Run you app, you should see the snowtooth webpage 23 | 24 | Citations 25 | --------- 26 | [Bassnectar Snowglobe](http://www.bassnectar.net/2012/01/snowglobe-tahoe-family-photo/) 27 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-js-intro", 3 | "version": "1.1.4", 4 | "description": "A series of topics and examples designed to introduce developers to node js", 5 | "main": "GruntFile.js", 6 | "dependencies": { 7 | "grunt": "^0.4.5", 8 | "grunt-contrib-jshint": "^0.10.0", 9 | "grunt-bump": "^0.0.15" 10 | }, 11 | "devDependencies": { 12 | "grunt": "^0.4.5", 13 | "grunt-bump": "0.0.15", 14 | "grunt-contrib-jshint": "^0.10.0" 15 | }, 16 | "scripts": { 17 | "test": "echo \"Error: no test specified\" && exit 1" 18 | }, 19 | "repository": { 20 | "type": "git", 21 | "url": "https://github.com/MoonTahoe/node-js-intro.git" 22 | }, 23 | "keywords": [ 24 | "Node", 25 | "js", 26 | "intro", 27 | "tutorial" 28 | ], 29 | "author": "Moon Highway (Alex Banks)", 30 | "license": "MIT", 31 | "bugs": { 32 | "url": "https://github.com/MoonTahoe/node-js-intro/issues" 33 | }, 34 | "homepage": "https://github.com/MoonTahoe/node-js-intro" 35 | } 36 | -------------------------------------------------------------------------------- /formidable/readme.md: -------------------------------------------------------------------------------- 1 | npm formidable module 2 | ===================== 3 | Formidable is a node module that can speed up your workflow by parsing your post data and injecting the form variables 4 | and uploaded files neatly into a callback function. 5 | 6 | 7 | Installing formidable 8 | --------------------- 9 | 10 | ``` 11 | $ npm install formidable 12 | ``` 13 | 14 | parsing forms data with formidable 15 | ---------------------------------- 16 | 17 | ```javascript 18 | var form = new formidable.IncomingForm(); 19 | 20 | form.uploadDir = __dirname + "/Uploads/"; 21 | 22 | form.parse(req, function (err, fields, files) { 23 | 24 | fs.rename(files['upload-file'].path, 25 | form.uploadDir + "/" 26 | + fields['stoke-level'] + "-" 27 | + fields['fav-color'] + "-" 28 | + files['upload-file'].name); 29 | 30 | res.writeHead(200, {'Content-Type': 'text/plain'}); 31 | res.end('File Uploaded: ' + files['upload-file'].name); 32 | 33 | }); 34 | ``` 35 | 36 | -------------------------------------------------------------------------------- /EventEmitter/say-something.js: -------------------------------------------------------------------------------- 1 | var EventEmitter = require('events').EventEmitter, 2 | util = require('util'); 3 | 4 | var Person = function (name, sayings) { 5 | 6 | var p = this; 7 | 8 | p.name = name; 9 | p.sayings = sayings; 10 | 11 | setInterval(function () { 12 | p.emit('speak', p.saySomething()); 13 | }, 750); 14 | 15 | }; 16 | 17 | util.inherits(Person, EventEmitter); 18 | 19 | Person.prototype.saySomething = function () { 20 | return this.sayings[Math.floor(Math.random() * this.sayings.length)]; 21 | }; 22 | 23 | 24 | 25 | var Leroy = new Person("Leroy Brown", [ 26 | "What's Shaking?", 27 | "I'm all out of Razor Blades!", 28 | "Ain't nobody badder than me", 29 | "Did you know they wrote a song about me?", 30 | "That ain't pizza!", 31 | "That Junk Yard Dog ain't mean!", 32 | "Who is King Kong anyways" 33 | ]); 34 | 35 | Leroy.once('speak', function (say) { 36 | console.log("Leroy Brown won't shut up!"); 37 | }); 38 | 39 | Leroy.on('speak', function (say) { 40 | console.log("Say mannnn, " + say); 41 | }); 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /lab-best-of-3/readme.md: -------------------------------------------------------------------------------- 1 | Challenge Best of 3 2 | ===================== 3 | Create an app that flips a coin 3, 5, 7 or any odd number of times above 3 and records the results. This app 4 | should display the results as well as the winner. 5 | 6 | Requirements 7 | ------------- 8 | 1. The coin flip function must return "heads" or "tails" 50/50 chance 9 | 2. The coin flip function must be located in a separate module 10 | 3. Running __bestof.js__ consumes the __./lib/coinflip.js__ module 11 | 4. First : Invoke coin flip three times and display the results 12 | 5. Next : Allow user to send 3, 5, 7, or any odd number as an argument when starting the __bestof.js__ module 13 | 6. Then : Check the argument to make sure it is odd and greater than 3 14 | 7. Finally : Flip the coin based on the argument 5 times, 7 times, or any odd number of times 15 | 8. Report on the results 16 | 17 | __Demo : Iteration 1__ 18 | 19 | ``` 20 | $ node bestof 21 | Heads it is 22 | { heads: 2, tails: 1 } 23 | ``` 24 | __Demo : Iteration 2__ 25 | 26 | ``` 27 | $ node bestof 9 28 | Tails it is 29 | { heads: 4, tails: 5 } 30 | ``` 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Moon Highway 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /request/request.js: -------------------------------------------------------------------------------- 1 | var http = require('http'), 2 | fs = require('fs'); 3 | 4 | var options = { 5 | hostname: 'topics.nytimes.com', 6 | port: 80, 7 | path: '/top/reference/timestopics/subjects/a/avalanches/index.html', 8 | method: 'GET' 9 | }; 10 | 11 | var req = http.request(options, function(res) { 12 | 13 | var responseBody = ""; 14 | 15 | console.log("Response from server started."); 16 | console.log('Server status: %s', res.statusCode); 17 | console.log('Response headers: %j', res.headers); 18 | 19 | res.setEncoding('utf8'); 20 | 21 | res.once('data', function(chunk) { 22 | console.log(chunk); 23 | }); 24 | 25 | res.on('data', function (chunk) { 26 | console.log("--chunk--" + chunk.length); 27 | responseBody += chunk; 28 | }); 29 | 30 | res.on('end', function() { 31 | fs.writeFile('avi-article.html', responseBody, function(err) { 32 | if (err) { 33 | throw err; 34 | } 35 | console.log("File Downloaded"); 36 | }); 37 | }); 38 | }); 39 | 40 | req.on('error', function(e) { 41 | console.log('problem with request: ' + e.message); 42 | }); 43 | 44 | req.end(); 45 | -------------------------------------------------------------------------------- /EventEmitter/readme.md: -------------------------------------------------------------------------------- 1 | EventEmitter 2 | ============ 3 | The node js EventEmitter allows us to add event handlers to objects and emit events. Any object that handles or 4 | emits events extends the EventEmitter. 5 | 6 | Topics 7 | ------ 8 | * Using EventEmittr 9 | * Emitting Events 10 | * Handling Events 11 | * Passing Parameters 12 | * Extending Objects with EventEmitter 13 | 14 | 15 | ###Emiting Custom Events 16 | ```javascript 17 | var EventEmitter = require('events').EventEmitter; 18 | 19 | var event = new EventEmitter(); 20 | 21 | event.on("customEvent", function(message) { 22 | console.log(message); 23 | }); 24 | 25 | event.emit("customEvent", "Emitted a custom event"); 26 | 27 | ``` 28 | 29 | ###Creating EventEmitter Objects 30 | ```javascript 31 | var EventEmitter = require('events').EventEmitter; 32 | 33 | var Person = function(name){ 34 | this.name = name; 35 | }; 36 | Person.prototype = new EventEmitter(); 37 | 38 | var Leroy = new Person("Leroy Brown"); 39 | 40 | Leroy.on('speak', function(say) { 41 | console.log("Hey mannnn, " + say); 42 | }); 43 | 44 | Leroy.emit('speak', "what's shaking?"); 45 | 46 | 47 | ``` -------------------------------------------------------------------------------- /GruntFile.js: -------------------------------------------------------------------------------- 1 | module.exports = function (grunt) { 2 | 3 | grunt.initConfig({ 4 | pkg: grunt.file.readJSON('package.json'), 5 | jshint: { 6 | all: [ 7 | "*.js", 8 | "*.json", 9 | "./*/*.js", 10 | "./*/*.json" 11 | ], 12 | options: { 13 | jshintrc: ".jshintrc" 14 | } 15 | }, 16 | bump: { 17 | options: { 18 | files: ['package.json'], 19 | updateConfigs: [], 20 | commit: true, 21 | commitMessage: 'Release v%VERSION%', 22 | commitFiles: ['package.json'], 23 | createTag: true, 24 | tagName: 'v%VERSION%', 25 | tagMessage: 'Version %VERSION%', 26 | push: true, 27 | pushTo: 'https://github.com/MoonHighway/node-js-intro.git', 28 | gitDescribeOptions: '--tags --always --abbrev=1 --dirty=-d' 29 | } 30 | } 31 | }); 32 | 33 | grunt.loadNpmTasks('grunt-bump'); 34 | grunt.loadNpmTasks('grunt-contrib-jshint'); 35 | grunt.registerTask('check', ['jshint']); 36 | grunt.registerTask('default', ['check', 'bump']); 37 | 38 | }; -------------------------------------------------------------------------------- /modules/readme.md: -------------------------------------------------------------------------------- 1 | Node Modules 2 | ============ 3 | Node js uses the Common js module patterns for exporting and importing modules. 4 | 5 | Creating Modules 6 | ---------------- 7 | 8 | __counter.js__ 9 | ```javascript 10 | 11 | var privateName = "Leroy Brown"; 12 | 13 | function splitName() { 14 | return privateName.split(" "); 15 | } 16 | 17 | function countWords() { 18 | return splitName().length; 19 | } 20 | 21 | 22 | exports.name = "Counter"; 23 | exports.description = "To learn modules"; 24 | exports.count = countWords; 25 | 26 | ``` 27 | 28 | Consuming Modules 29 | ----------------- 30 | 31 | __counter.js__ 32 | ```javascript 33 | var counter = require('./counter'); 34 | ``` 35 | 36 | __bin/counter.js__ 37 | ```javascript 38 | var counter = require('./bin/counter'); 39 | ``` 40 | 41 | __node_modules/counter.js__ 42 | ```javascript 43 | var counter = require('counter'); 44 | ``` 45 | 46 | Using Modules 47 | ------------- 48 | ```javascript 49 | var counter = require('./counter'); 50 | 51 | console.log( counter.name ); 52 | console.log( counter.description ); 53 | console.log( counter.count() ); 54 | 55 | console.log( counter.privateName ); 56 | 57 | ``` -------------------------------------------------------------------------------- /parsing post bodies/server.js: -------------------------------------------------------------------------------- 1 | var http = require('http'); 2 | 3 | http.createServer(function (req, res) { 4 | 5 | if (req.method === 'GET') { 6 | 7 | var htmlForm = 'Post Body Example' 8 | + '

Fill out the Form

' 9 | + '
' 10 | + '
Super Bummed Hella Stoked
' 11 | + '
' 12 | + '
'; 13 | 14 | res.writeHead(200, {'Content-Type': 'text/html'}); 15 | res.end(htmlForm); 16 | 17 | } else if (req.method === 'POST') { 18 | 19 | var body = ''; 20 | 21 | req.on('data', function (chunk) { 22 | body += chunk; 23 | }); 24 | 25 | req.on('end', function () { 26 | 27 | res.writeHead(200, {'Content-Type': 'text/plain'}); 28 | res.end("Request Body: " + body); 29 | 30 | }); 31 | 32 | } 33 | 34 | }).listen(3000); 35 | 36 | console.log("Server running on port 3000"); 37 | -------------------------------------------------------------------------------- /fs/files.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | 3 | process.stdin.on('data', function(data) { 4 | 5 | var input = data.toString().toLowerCase().trim(), 6 | fileName = 'theFile.txt'; 7 | 8 | switch(input) { 9 | 10 | case "create" : 11 | 12 | fs.writeFileSync(fileName, "A New Text File\n===================\n\r\n\r"); 13 | console.log("File Created"); 14 | 15 | break; 16 | 17 | case "append" : 18 | 19 | fs.appendFile(fileName, "* Item Appended\n\r", function(err) { 20 | 21 | if (err) { 22 | throw err; 23 | } 24 | 25 | console.log("File Appended"); 26 | 27 | }); 28 | 29 | 30 | break; 31 | 32 | case "read" : 33 | 34 | fs.readFile(fileName, 'UTF-8', function(err, data) { 35 | if (err) { 36 | console.error(err); 37 | } else { 38 | console.log(data); 39 | } 40 | }); 41 | 42 | 43 | break; 44 | 45 | case "remove" : 46 | 47 | 48 | fs.unlinkSync(fileName); 49 | console.log("File Removed"); 50 | 51 | break; 52 | 53 | case "exit" : 54 | 55 | process.exit(); 56 | 57 | break; 58 | 59 | } 60 | 61 | 62 | }); 63 | 64 | console.log("create | append | read | remove | exit"); 65 | -------------------------------------------------------------------------------- /parsing post bodies/server-upload.js: -------------------------------------------------------------------------------- 1 | var http = require('http'), 2 | fs = require('fs'); 3 | 4 | http.createServer(function (req, res) { 5 | 6 | if (req.method === 'GET') { 7 | 8 | var htmlForm = 'Post Body Example' 9 | + '

Fill out the Form

' 10 | + '
' 11 | + '
Super Bummed Hella Stoked
' 12 | + '
' 13 | + '
' 14 | + '
'; 15 | 16 | res.writeHead(200, {'Content-Type': 'text/html'}); 17 | res.end(htmlForm); 18 | 19 | } else if (req.method === 'POST') { 20 | 21 | var body = ''; 22 | 23 | req.on('data', function (chunk) { 24 | body += chunk; 25 | }); 26 | 27 | req.on('end', function () { 28 | res.writeHead(200, {'Content-Type': 'text/plain'}); 29 | res.end(body); 30 | }); 31 | 32 | } 33 | 34 | }).listen(3000); 35 | 36 | console.log("Server running on port 3000"); 37 | -------------------------------------------------------------------------------- /parsing post bodies/readme.md: -------------------------------------------------------------------------------- 1 | parsing post bodies 2 | =================== 3 | Whenever form data is sent to the post data needs to be collected from the request in chunks. Once we have the post data 4 | we have to parse it. That could get ugly, so we will use one of many parsing frameworks after this example. 5 | 6 | topic 7 | ----- 8 | * handling a post request 9 | * handling a multi-part post body 10 | * why we need frameworks 11 | 12 | Handling POST Requests 13 | ---------------------- 14 | 15 | ```javascript 16 | http.createServer(function (req, res) { 17 | 18 | if (req.method == 'POST') { 19 | 20 | var body = ''; 21 | 22 | req.on('data', function (chunk) { 23 | body += chunk; 24 | }); 25 | 26 | req.on('end', function () { 27 | 28 | body; // name=value;name2=value2;name3=value3 29 | 30 | }); 31 | 32 | } 33 | 34 | }).listen(3000); 35 | ``` 36 | 37 | Handling File Uploads 38 | --------------------- 39 | When parsing files the form post data and the file post data are handled in the same body. 40 | 41 | ``` 42 | ------WebKitFormBoundaryGsTefag7g3LFBijB 43 | Content-Disposition: form-data; name="fav-color" 44 | 45 | #000000 46 | ------WebKitFormBoundaryGsTefag7g3LFBijB 47 | Content-Disposition: form-data; name="stoke-level" 48 | 49 | 6 50 | ------WebKitFormBoundaryGsTefag7g3LFBijB 51 | Content-Disposition: form-data; name="upload-file"; filename="working.js" 52 | Content-Type: application/javascript 53 | 54 | This is where the file body is placed... 55 | ``` 56 | -------------------------------------------------------------------------------- /Intro/readme.md: -------------------------------------------------------------------------------- 1 | Introduction 2 | ============ 3 | Node js is Javascript on the server, without a browser. The project is officially called node, but we add the js 4 | to eliminate confusion. 5 | 6 | What 7 | ---- 8 | * Javascript without a browser 9 | * Based on Chromes V8 engine 10 | * The project is offically called node 11 | 12 | How 13 | --- 14 | * Open source project 15 | * Hosted on Github 16 | * Community developed modules 17 | * Event Based IO 18 | 19 | What it can do 20 | -------------- 21 | * Act as a web server 22 | * Build Command Line Tools 23 | * Build Socket Applications 24 | * Anything you can do in JS 25 | * Ideal For "Web Stuff" 26 | * Dynamic Websites 27 | * Rest API's 28 | * Web socket Applications 29 | * Sharing Code 30 | 31 | Source 32 | ------ 33 | * [Source on GitHub](https://github.com/joyent/node) 34 | 35 | 36 | 37 | REPL 38 | ==== 39 | ``` 40 | $ node 41 | > var h = "Hello"; 42 | undefined 43 | > var w = "World"; 44 | undefined 45 | > function print(first, second) { 46 | > ... return first + " " + second + "! From Node js ;)" 47 | > ... } 48 | undefined 49 | > var r = print(h, w); 50 | undefined 51 | > console.log(r); 52 | Hello World! From Node js ;) 53 | undefined 54 | > .save hello-world.js 55 | Session saved to:hello-world.js 56 | > 57 | (^C again to quit) 58 | > 59 | 60 | $ node hello-world.js 61 | Hello World! From Node js ;) 62 | 63 | $ 64 | 65 | ``` 66 | 67 | Stopping Node js 68 | ---------------- 69 | 1) Node REPL processes run continuously until stopped. 70 | 2) You can exit by typing "Ctl C" twice 71 | 72 | Commenting a Node js file 73 | ------------------------- 74 | * // Can be used to comment out a line 75 | * /* will continuously comment until */ 76 | * /** Is typically used to describe functions and objects for documentation parsers */ 77 | -------------------------------------------------------------------------------- /lab-snowtooth-express/public/_dependencies/normalize.min.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0} -------------------------------------------------------------------------------- /formidable/formidable-server.js: -------------------------------------------------------------------------------- 1 | var http = require('http'), 2 | fs = require('fs'), 3 | formidable = require('formidable'); 4 | 5 | http.createServer(function (req, res) { 6 | 7 | if (req.method === 'GET') { 8 | 9 | var htmlForm = 'Post Body Example' 10 | + '

Fill out the Form

' 11 | + '
' 12 | + '
Super Bummed Hella Stoked
' 13 | + '
' 14 | + '
' 15 | + '
'; 16 | 17 | res.writeHead(200, {'Content-Type': 'text/html'}); 18 | res.end(htmlForm); 19 | 20 | } else if (req.method === 'POST') { 21 | 22 | var form = new formidable.IncomingForm(); 23 | 24 | if (!fs.existsSync(__dirname + "/Uploads/")) { 25 | fs.mkdirSync("./Uploads/"); 26 | } 27 | 28 | form.uploadDir = __dirname + "/Uploads/"; 29 | 30 | form.parse(req, function (err, fields, files) { 31 | 32 | fs.rename(files['upload-file'].path, 33 | form.uploadDir + "/" 34 | + fields['stoke-level'] + "-" 35 | + fields['fav-color'] + "-" 36 | + files['upload-file'].name); 37 | 38 | res.writeHead(200, {'Content-Type': 'text/plain'}); 39 | res.end('File Uploaded: ' + files['upload-file'].name); 40 | 41 | }); 42 | 43 | } 44 | 45 | }).listen(3000); 46 | 47 | console.log("Server running on port 3000"); 48 | -------------------------------------------------------------------------------- /http servers/servers.js: -------------------------------------------------------------------------------- 1 | var http = require('http'), 2 | fs = require('fs'); 3 | 4 | /** 5 | * Text Server 6 | */ 7 | http.createServer(function (req, res) { 8 | 9 | res.writeHead(200, {'Content-Type': 'text/plain'}); 10 | res.end('Simple Text\n\r\n\rServer...'); 11 | 12 | }).listen(3000); 13 | 14 | /** 15 | * HTML Server 16 | */ 17 | http.createServer(function (req, res) { 18 | 19 | var html = "HTML Files

Served from '" 20 | + req.url 21 | + "'

"; 22 | 23 | res.writeHead(200, {'Content-Type': 'text/html'}); 24 | res.end(html); 25 | 26 | }).listen(3001); 27 | 28 | /** 29 | * JSON Server 30 | */ 31 | http.createServer(function (req, res) { 32 | 33 | var people = [ 34 | { 35 | first: 'Leroy', 36 | last: 'Brown' 37 | }, 38 | { 39 | first: 'Paul', 40 | last: 'Bunyan' 41 | } 42 | ]; 43 | 44 | res.writeHead(200, { 45 | 'Access-Control-Allow-Origin': '*', 46 | 'Access-Control-Allow-Methods': 'GET, POST', 47 | 'Access-Control-Allow-Headers': 'X-Requested-With, Content-Type', 48 | 'Content-Type': 'text/json' 49 | }); 50 | res.end(JSON.stringify(people)); 51 | 52 | }).listen(3002); 53 | 54 | /** 55 | * File Server 56 | */ 57 | http.createServer(function (req, res) { 58 | 59 | fs.readFile('./html/index.html', 'UTF-8', function (err, data) { 60 | 61 | if (err) { 62 | throw err; 63 | } 64 | 65 | res.writeHead(200, {'Content-Type': 'text/html'}); 66 | res.end(data); 67 | 68 | }); 69 | 70 | }).listen(3003); 71 | 72 | /** 73 | * Img Server 74 | */ 75 | http.createServer(function (req, res) { 76 | 77 | fs.readFile('./img/pilot.png', function (err, data) { 78 | 79 | if (err) { 80 | throw err; 81 | } 82 | 83 | res.writeHead(200, {'Content-Type': 'image/png'}); 84 | res.end(data); 85 | 86 | }); 87 | 88 | }).listen(3004); 89 | 90 | console.log("All Servers are running on ports 3000 - 3004"); 91 | -------------------------------------------------------------------------------- /lab-snowtooth-express/public/style.css: -------------------------------------------------------------------------------- 1 | @import url(http://fonts.googleapis.com/css?family=Architects+Daughter); 2 | body > h1:first-child, 3 | section > h2:first-child, 4 | nav > h2:first-child, 5 | section > h1:first-child, 6 | footer > h2:first-child { 7 | display: none; 8 | } 9 | 10 | body { 11 | padding: 0; 12 | background-color: #f1f7f5; 13 | font-size: 100%; 14 | } 15 | 16 | main { 17 | width: 100%; 18 | max-width: 1000px; 19 | background-color: #c2dde4; 20 | margin: 0 auto; 21 | } 22 | @media screen and (min-width: 1000px) { 23 | main { 24 | border-left: solid 1px #3600b6; 25 | border-right: solid 1px #3600b6; 26 | box-shadow: 2px 0px 5px #999; 27 | } 28 | } 29 | 30 | header section#related ul:first-of-type { 31 | text-align: center; 32 | margin: 0; 33 | list-style-type: none; 34 | } 35 | header section#related ul > li > a { 36 | display: block; 37 | padding: 1em 0; 38 | } 39 | @media screen and (min-width: 640px) { 40 | header section#related ul > li > a { 41 | padding: .25em 0; 42 | } 43 | } 44 | header div.logo { 45 | border-top: solid 1px #7462b6; 46 | border-bottom: solid 1px #7462b6; 47 | font-family: "Architects Daughter", cursive, sans-serif; 48 | font-size: 3em; 49 | color: #3600b6; 50 | text-shadow: 2px 2px lightgray; 51 | background-color: snow; 52 | } 53 | header div.logo img { 54 | width: 1em; 55 | } 56 | header div.img-get-some { 57 | position: relative; 58 | } 59 | header div.img-get-some img { 60 | position: relative; 61 | top: -3px; 62 | padding: 0; 63 | } 64 | 65 | nav { 66 | position: relative; 67 | top: -3px; 68 | } 69 | nav div { 70 | text-align: center; 71 | background-color: #3600b6; 72 | } 73 | nav div:hover { 74 | background-color: yellow; 75 | } 76 | nav div a { 77 | font-size: 2em; 78 | color: snow; 79 | padding: .25em; 80 | } 81 | nav div a:hover { 82 | color: #3600b6; 83 | } 84 | 85 | section#calendar { 86 | background-color: snow; 87 | position: relative; 88 | top: -3px; 89 | } 90 | section#calendar section { 91 | margin: 2em 0; 92 | } 93 | section#calendar section h1 { 94 | font-size: 1.5em; 95 | margin: 0; 96 | } 97 | section#calendar section p { 98 | font-size: 1em; 99 | } 100 | section#calendar section a { 101 | padding: 0; 102 | } 103 | section#calendar section a img { 104 | width: 100%; 105 | } 106 | @media screen and (min-width: 1025px) { 107 | section#calendar section a { 108 | width: 50%; 109 | } 110 | } 111 | 112 | section#quotes { 113 | background-color: #7462b6; 114 | position: relative; 115 | top: -3px; 116 | } 117 | section#quotes blockquote { 118 | color: snow; 119 | margin: 1em 0; 120 | } 121 | section#quotes blockquote cite { 122 | color: yellow; 123 | } 124 | 125 | footer { 126 | text-align: center; 127 | font-size: .2em; 128 | } 129 | -------------------------------------------------------------------------------- /lab-snowtooth-express/public/source.scss: -------------------------------------------------------------------------------- 1 | @import url(http://fonts.googleapis.com/css?family=Architects+Daughter); 2 | 3 | $font-logo: "Architects Daughter", cursive, sans-serif; 4 | $dark: black; 5 | $light-bg-a: #f1f7f5; 6 | $light-bg-b: #c2dde4; 7 | $dark-bg-a: #7462B6; 8 | $dark-bg-b: #3600B6; 9 | $light: #d3d3d3; 10 | $contrast: green; 11 | $white: snow; 12 | 13 | body>h1:first-child, 14 | section>h2:first-child, 15 | nav>h2:first-child, 16 | section>h1:first-child, 17 | footer>h2:first-child { 18 | display:none; 19 | } 20 | 21 | body { 22 | padding: 0; 23 | background-color: $light-bg-a; 24 | font-size: 100%; 25 | } 26 | 27 | main { 28 | width: 100%; 29 | max-width: 1000px; 30 | background-color: $light-bg-b; 31 | margin: 0 auto; 32 | 33 | @media screen and (min-width: 1000px) { 34 | border-left: solid 1px $dark-bg-b; 35 | border-right: solid 1px $dark-bg-b; 36 | box-shadow: 2px 0px 5px #999; 37 | } 38 | } 39 | 40 | header { 41 | 42 | section#related { 43 | ul:first-of-type { 44 | text-align: center; 45 | margin: 0; 46 | list-style-type: none; 47 | } 48 | 49 | ul>li>a { 50 | display: block; 51 | padding: 1em 0; 52 | 53 | @media screen and (min-width: 640px) { 54 | padding: .25em 0; 55 | } 56 | 57 | } 58 | } 59 | 60 | div.logo { 61 | border-top: solid 1px $dark-bg-a; 62 | border-bottom: solid 1px $dark-bg-a; 63 | font-family: $font-logo; 64 | font-size: 3em; 65 | color: $dark-bg-b; 66 | text-shadow: 2px 2px $light; 67 | background-color: $white; 68 | 69 | img { 70 | width: 1em; 71 | } 72 | 73 | } 74 | 75 | div.img-get-some { 76 | 77 | position: relative; 78 | 79 | img { 80 | position: relative; 81 | top: -3px; 82 | padding: 0; 83 | } 84 | 85 | } 86 | 87 | } 88 | 89 | nav { 90 | 91 | position: relative; 92 | top: -3px; 93 | 94 | div { 95 | text-align: center; 96 | background-color: $dark-bg-b; 97 | 98 | &:hover { 99 | background-color: yellow; 100 | } 101 | 102 | a { 103 | font-size: 2em; 104 | color: $white; 105 | padding: .25em; 106 | 107 | &:hover { 108 | color: $dark-bg-b; 109 | } 110 | 111 | } 112 | 113 | } 114 | 115 | } 116 | 117 | section#calendar { 118 | background-color: $white; 119 | position: relative; 120 | top: -3px; 121 | 122 | section { 123 | margin: 2em 0; 124 | h1 { 125 | font-size: 1.5em; 126 | margin: 0; 127 | 128 | } 129 | p { 130 | font-size: 1em; 131 | } 132 | a { 133 | padding: 0; 134 | 135 | img { 136 | width: 100%; 137 | } 138 | 139 | @media screen and (min-width: 1025px) { 140 | width: 50%; 141 | } 142 | 143 | } 144 | } 145 | } 146 | 147 | section#quotes { 148 | background-color: $dark-bg-a; 149 | position: relative; 150 | top: -3px; 151 | 152 | blockquote { 153 | color: $white; 154 | margin: 1em 0; 155 | cite { 156 | color: yellow; 157 | } 158 | } 159 | 160 | 161 | } 162 | 163 | footer { 164 | text-align: center; 165 | font-size: .2em; 166 | } 167 | -------------------------------------------------------------------------------- /http servers/readme.md: -------------------------------------------------------------------------------- 1 | http.Server 2 | =========== 3 | One of the most powerful features of Node js is the ability to create http servers. You can program one file... in javascript... 4 | that can act as a webserver on any machine running Node js. Servers are a part of the http module that comes with Node js. 5 | 6 | http.createServer 7 | ----------------- 8 | Creates a new instance of a server. The server then listens on a given port and ip address. 9 | [HTTP](http://nodejs.org/api/http.html) 10 | 11 | 12 | http.ServerRequest 13 | ------------------ 14 | An object representing the request, contains url, all request headers, and any data or files sent with the request. 15 | 16 | http.ServerResponse 17 | ------------------- 18 | A object that handles the server's response. 19 | [resonse status codes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Response_codes) 20 | 21 | * http status codes 22 | 23 | 24 | Serving Text 25 | ------------- 26 | 27 | ```javascript 28 | http.createServer(function (req, res) { 29 | 30 | res.writeHead(200, {'Content-Type': 'text/plain'}); 31 | res.end('Simple Text\n\r\n\rServer...'); 32 | 33 | }).listen(3000); 34 | ``` 35 | 36 | Serving Html 37 | ------------- 38 | 39 | ```javascript 40 | http.createServer(function (req, res) { 41 | 42 | var html = "HTML Files

Served from '" 43 | + req.url 44 | + "'

"; 45 | 46 | res.writeHead(200, {'Content-Type': 'text/html'}); 47 | res.end(html); 48 | 49 | }).listen(3001); 50 | ``` 51 | 52 | Serving JSON with CORS 53 | ---------------------- 54 | 55 | ```javascript 56 | http.createServer(function (req, res) { 57 | 58 | var people = [ 59 | { 60 | first: 'Leroy', 61 | last: 'Brown' 62 | }, 63 | { 64 | first: 'Paul', 65 | last: 'Bunyan' 66 | } 67 | ]; 68 | 69 | res.writeHead(200, { 70 | 'Access-Control-Allow-Origin': '*', 71 | 'Access-Control-Allow-Methods': 'GET, POST', 72 | 'Access-Control-Allow-Headers': 'X-Requested-With, Content-Type', 73 | 'Content-Type': 'text/json' 74 | }); 75 | res.end(JSON.stringify(people)); 76 | 77 | }).listen(3002); 78 | ``` 79 | 80 | Serving Files 81 | ------------- 82 | 83 | ```javascript 84 | fs.readFile(url, 'UTF-8', function (err, data) { 85 | 86 | if (err) { 87 | throw err; 88 | } 89 | 90 | res.writeHead(200, {'Content-Type': 'text/html'}); 91 | res.end(data); 92 | 93 | }); 94 | 95 | ``` 96 | 97 | Serving Binary 98 | -------------- 99 | 100 | ```javascript 101 | fs.readFile(img, function (err, data) { 102 | 103 | if (err) { 104 | throw err; 105 | } 106 | 107 | res.writeHead(200, {'Content-Type': 'image/jpeg'}); 108 | res.end(data); 109 | 110 | }); 111 | ``` 112 | 113 | Citations 114 | --------- 115 | 116 | ####Leroy Brown JPG 117 | Sample Image from Deviant Art 118 | * [Deviant Art](http://www.deviantart.com/) 119 | * [Leroy Brown JPG](http://obscuremailman.deviantart.com/art/Big-Bad-Leroy-Brown-186914374) -------------------------------------------------------------------------------- /node core/readme.md: -------------------------------------------------------------------------------- 1 | Node js Core 2 | ============ 3 | The node core covers the Javascript objects that can be used upon installing node js. 4 | 5 | Global Modules 6 | -------------- 7 | The following objects are already present when you start a Node process. You do not need to require anything 8 | in you document to use them. 9 | 10 | * global 11 | * process 12 | * console 13 | * Class: Buffer 14 | * require() 15 | * __filename 16 | * __dirname 17 | * module 18 | * exports 19 | * setTimeout(cb, ms) 20 | * clearTimeout(t) 21 | * setInterval(cb, ms) 22 | * clearInterval(t) 23 | 24 | ### globals 25 | ```javascript 26 | 27 | console.log("This file: " + __filename); 28 | console.log("The directory: " + __dirname); 29 | console.log("Environment Port: " + process.env.port || 3000); 30 | 31 | ``` 32 | 33 | ###process.argv 34 | ```javascript 35 | 36 | console.log(process.argv); 37 | 38 | /* process argv always contains 'node' and 'filename' 39 | * 40 | */ 41 | if (process.argv.length > 2) { 42 | console.log("INFO: " + getArgument('info')); 43 | } else { 44 | console.log("This process ran without arguments") 45 | } 46 | 47 | function getArgument(name) { 48 | return process.argv[process.argv.indexOf(name)+1]; 49 | } 50 | 51 | ``` 52 | 53 | ``` 54 | $ node process.js varname value varname value info something 55 | [ 'node', 56 | 'C:\\Users\\admin\\Documents\\Moon Highway Training Materials\\Subjects Catalog\\Node\\Topics\\node core\\process.js', 57 | 'varname', 58 | 'value', 59 | 'varname', 60 | 'value', 61 | 'info', 62 | 'something' ] 63 | INFO: something 64 | 65 | $ 66 | 67 | ``` 68 | 69 | ###STDIN, STDOUT, STDERROR 70 | ```javascript 71 | //Standard Output 72 | process.stdout.write("\n\n\nInput: "); 73 | 74 | //Standard Input 75 | process.stdin.on('data', function(data) { 76 | 77 | var input = data.toString().toLowerCase().trim(); 78 | 79 | if (input == "exit") { 80 | 81 | //Exit 82 | process.exit(); 83 | 84 | } 85 | 86 | //Standard Output 87 | process.stdout.write("Output: " + input +"\nInput: "); 88 | 89 | }); 90 | ``` 91 | 92 | Core Modules 93 | ------------ 94 | There are modules that come with your node js installation that need to be loaded in your process using require(). Here 95 | are a few of these modules that we will look at today. 96 | 97 | * util 98 | * path 99 | * http 100 | * fs 101 | * EventEmitter 102 | 103 | ###path module 104 | ```javascript 105 | 106 | var path = require('path'); 107 | var url = "/some//Path\/that is a bit//broken/../.."; 108 | 109 | url = path.normalize(url); 110 | 111 | console.log(url); // \some\Path 112 | 113 | url = path.join('courses', 'class', 'javascript', 'students'); 114 | 115 | console.log(url); // courses\class\javascript\students 116 | 117 | url += "\\studentList.html"; 118 | 119 | console.log(url); // courses\class\javascript\students\studentList.html 120 | 121 | url = path.basename(url); 122 | 123 | console.log(url); // studentList.html 124 | 125 | ``` 126 | 127 | ###util module 128 | ```javascript 129 | 130 | var util = require('util'); 131 | 132 | util.print("Gives more control "); 133 | util.print("over how things \n are written \n and formatted \n to the console.\n\n\n\n\n"); 134 | 135 | util.log("Some more options"); 136 | 137 | ``` 138 | -------------------------------------------------------------------------------- /npm/readme.md: -------------------------------------------------------------------------------- 1 | Node Package Manager NPM 2 | ======================== 3 | The Node Package manager is where we get modules from the node js community. Node modules hosted at github can 4 | be registered here as well. Once we find a module that we like, all we need is it's name. 5 | [npmjs.org](https://www.npmjs.org/) 6 | 7 | ##Create A Package.json 8 | ``` 9 | $ npm init 10 | ``` 11 | 12 | ##Install a Node Module 13 | ``` 14 | $ npm install module 15 | ``` 16 | 17 | ##Save a node module to package.json 18 | ``` 19 | $ npm install module --save 20 | ``` 21 | 22 | ##Save a dev module to package.json 23 | ``` 24 | $ npm install module --save-dev 25 | ``` 26 | 27 | ##Install a global module 28 | ``` 29 | $ npm install module -g 30 | ``` 31 | 32 | ##List Global Modules 33 | ``` 34 | $ npm list -g 35 | ``` 36 | 37 | node_modules 38 | ------------ 39 | Any node package that you install will be located in the node_modules folder. You have access to the source right 40 | within your project! 41 | 42 | Package JSON 43 | ------------ 44 | 45 | ###Package.json for Express 46 | [Express Package.json](https://github.com/visionmedia/express/blob/master/package.json) 47 | ```javascript 48 | { 49 | "name": "express", 50 | "description": "Sinatra inspired web development framework", 51 | "version": "4.2.0", 52 | "author": "TJ Holowaychuk ", 53 | "contributors": [ 54 | { 55 | "name": "TJ Holowaychuk", 56 | "email": "tj@vision-media.ca" 57 | }, 58 | { 59 | "name": "Aaron Heckmann", 60 | "email": "aaron.heckmann+github@gmail.com" 61 | }, 62 | { 63 | "name": "Ciaran Jessup", 64 | "email": "ciaranj@gmail.com" 65 | }, 66 | { 67 | "name": "Douglas Christopher Wilson", 68 | "email": "doug@somethingdoug.com" 69 | }, 70 | { 71 | "name": "Guillermo Rauch", 72 | "email": "rauchg@gmail.com" 73 | }, 74 | { 75 | "name": "Jonathan Ong", 76 | "email": "me@jongleberry.com" 77 | }, 78 | { 79 | "name": "Roman Shtylman", 80 | "email": "shtylman+expressjs@gmail.com" 81 | } 82 | ], 83 | "dependencies": { 84 | "parseurl": "1.0.1", 85 | "accepts": "1.0.1", 86 | "type-is": "1.1.0", 87 | "range-parser": "1.0.0", 88 | "cookie": "0.1.2", 89 | "buffer-crc32": "0.2.1", 90 | "fresh": "0.2.2", 91 | "methods": "1.0.0", 92 | "send": "0.3.0", 93 | "cookie-signature": "1.0.3", 94 | "merge-descriptors": "0.0.2", 95 | "utils-merge": "1.0.0", 96 | "escape-html": "1.0.1", 97 | "qs": "0.6.6", 98 | "serve-static": "1.1.0", 99 | "path-to-regexp": "0.1.2", 100 | "debug": "0.8.1" 101 | }, 102 | "devDependencies": { 103 | "mocha": "~1.18.2", 104 | "body-parser": "~1.1.2", 105 | "connect-redis": "~2.0.0", 106 | "ejs": "~1.0.0", 107 | "jade": "~0.35.0", 108 | "marked": "0.3.2", 109 | "multiparty": "~3.2.4", 110 | "hjs": "~0.0.6", 111 | "should": "~3.3.1", 112 | "supertest": "~0.12.0", 113 | "method-override": "1.0.0", 114 | "cookie-parser": "1.0.1", 115 | "express-session": "1.0.4", 116 | "morgan": "1.0.1", 117 | "vhost": "1.0.0" 118 | }, 119 | "keywords": [ 120 | "express", 121 | "framework", 122 | "sinatra", 123 | "web", 124 | "rest", 125 | "restful", 126 | "router", 127 | "app", 128 | "api" 129 | ], 130 | "repository": "git://github.com/visionmedia/express", 131 | "scripts": { 132 | "prepublish": "npm prune", 133 | "test": "make test" 134 | }, 135 | "engines": { 136 | "node": ">= 0.10.0" 137 | }, 138 | "license": "MIT" 139 | } 140 | ``` 141 | 142 | 143 | 144 | -------------------------------------------------------------------------------- /lab-snowtooth-express/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Snowtooth Ski Resort 13 | 14 | 15 |

Snowtooth Mountain

16 |
17 |
18 | 39 | 40 |
41 | 42 | 57 | 58 |
59 |

Get Some

60 |
61 | 62 |
63 |

Events Calendar

64 | 65 |
66 | 67 | children skiing 68 | 69 |

Learn

70 |

jan 24 - feb 10

71 |

Our learn to ride packages provide everything you need to master the mountain.

72 |
73 | 74 |
75 | 76 | A bluegrass band playing music 77 | 78 |

Music

79 |

feb 12 & feb 14

80 |

Join us in welcoming Sierra bluegrass sensation Green Sky for two nights in February.

81 |
82 | 83 |
84 | 85 | children skiing 86 | 87 |

Play

88 |

mar 2 - apr 30

89 |

Kids ride free every Monday-Thursday this spring. Join us for a full day of fun.

90 |
91 | 92 |
93 | 94 | a snowey hotel 95 | 96 |

Stay

97 |

apr 21 - may 30

98 |

Save up to 40% with advance booking. Mountain views, hot spas, and luxury linens.

99 |
100 | 101 |
102 | 103 |
104 |
105 | High speed lifts and no lines. Nice. 106 | Charley C 107 |
108 |
109 | I really like the all day lessons for kids. That way my husband and I get to go skiing 110 | Mary Mom 111 |
112 |
113 | 114 |
115 |

Legal Information

116 |

© 2015, Snowtooth Holdings, LLC

117 |
118 | 119 |
120 | 121 | 122 | -------------------------------------------------------------------------------- /lab-snowtooth-express/public/_dependencies/modernizr.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Modernizr v2.8.3 3 | * www.modernizr.com 4 | * 5 | * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton 6 | * Available under the BSD and MIT licenses: www.modernizr.com/license/ 7 | */ 8 | window.Modernizr=function(a,b,c){function d(a){t.cssText=a}function e(a,b){return d(x.join(a+";")+(b||""))}function f(a,b){return typeof a===b}function g(a,b){return!!~(""+a).indexOf(b)}function h(a,b){for(var d in a){var e=a[d];if(!g(e,"-")&&t[e]!==c)return"pfx"==b?e:!0}return!1}function i(a,b,d){for(var e in a){var g=b[a[e]];if(g!==c)return d===!1?a[e]:f(g,"function")?g.bind(d||b):g}return!1}function j(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+z.join(d+" ")+d).split(" ");return f(b,"string")||f(b,"undefined")?h(e,b):(e=(a+" "+A.join(d+" ")+d).split(" "),i(e,b,c))}function k(){o.input=function(c){for(var d=0,e=c.length;e>d;d++)E[c[d]]=!!(c[d]in u);return E.list&&(E.list=!(!b.createElement("datalist")||!a.HTMLDataListElement)),E}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),o.inputtypes=function(a){for(var d,e,f,g=0,h=a.length;h>g;g++)u.setAttribute("type",e=a[g]),d="text"!==u.type,d&&(u.value=v,u.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(e)&&u.style.WebkitAppearance!==c?(q.appendChild(u),f=b.defaultView,d=f.getComputedStyle&&"textfield"!==f.getComputedStyle(u,null).WebkitAppearance&&0!==u.offsetHeight,q.removeChild(u)):/^(search|tel)$/.test(e)||(d=/^(url|email)$/.test(e)?u.checkValidity&&u.checkValidity()===!1:u.value!=v)),D[a[g]]=!!d;return D}("search tel url email datetime date month week time datetime-local number range color".split(" "))}var l,m,n="2.8.3",o={},p=!0,q=b.documentElement,r="modernizr",s=b.createElement(r),t=s.style,u=b.createElement("input"),v=":)",w={}.toString,x=" -webkit- -moz- -o- -ms- ".split(" "),y="Webkit Moz O ms",z=y.split(" "),A=y.toLowerCase().split(" "),B={svg:"http://www.w3.org/2000/svg"},C={},D={},E={},F=[],G=F.slice,H=function(a,c,d,e){var f,g,h,i,j=b.createElement("div"),k=b.body,l=k||b.createElement("body");if(parseInt(d,10))for(;d--;)h=b.createElement("div"),h.id=e?e[d]:r+(d+1),j.appendChild(h);return f=["­",'"].join(""),j.id=r,(k?j:l).innerHTML+=f,l.appendChild(j),k||(l.style.background="",l.style.overflow="hidden",i=q.style.overflow,q.style.overflow="hidden",q.appendChild(l)),g=c(j,a),k?j.parentNode.removeChild(j):(l.parentNode.removeChild(l),q.style.overflow=i),!!g},I=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b)&&c(b).matches||!1;var d;return H("@media "+b+" { #"+r+" { position: absolute; } }",function(b){d="absolute"==(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle).position}),d},J=function(){function a(a,e){e=e||b.createElement(d[a]||"div"),a="on"+a;var g=a in e;return g||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(a,""),g=f(e[a],"function"),f(e[a],"undefined")||(e[a]=c),e.removeAttribute(a))),e=null,g}var d={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return a}(),K={}.hasOwnProperty;m=f(K,"undefined")||f(K.call,"undefined")?function(a,b){return b in a&&f(a.constructor.prototype[b],"undefined")}:function(a,b){return K.call(a,b)},Function.prototype.bind||(Function.prototype.bind=function(a){var b=this;if("function"!=typeof b)throw new TypeError;var c=G.call(arguments,1),d=function(){if(this instanceof d){var e=function(){};e.prototype=b.prototype;var f=new e,g=b.apply(f,c.concat(G.call(arguments)));return Object(g)===g?g:f}return b.apply(a,c.concat(G.call(arguments)))};return d}),C.flexbox=function(){return j("flexWrap")},C.flexboxlegacy=function(){return j("boxDirection")},C.canvas=function(){var a=b.createElement("canvas");return!(!a.getContext||!a.getContext("2d"))},C.canvastext=function(){return!(!o.canvas||!f(b.createElement("canvas").getContext("2d").fillText,"function"))},C.webgl=function(){return!!a.WebGLRenderingContext},C.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:H(["@media (",x.join("touch-enabled),("),r,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=9===a.offsetTop}),c},C.geolocation=function(){return"geolocation"in navigator},C.postmessage=function(){return!!a.postMessage},C.websqldatabase=function(){return!!a.openDatabase},C.indexedDB=function(){return!!j("indexedDB",a)},C.hashchange=function(){return J("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},C.history=function(){return!(!a.history||!history.pushState)},C.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},C.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},C.rgba=function(){return d("background-color:rgba(150,255,150,.5)"),g(t.backgroundColor,"rgba")},C.hsla=function(){return d("background-color:hsla(120,40%,100%,.5)"),g(t.backgroundColor,"rgba")||g(t.backgroundColor,"hsla")},C.multiplebgs=function(){return d("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(t.background)},C.backgroundsize=function(){return j("backgroundSize")},C.borderimage=function(){return j("borderImage")},C.borderradius=function(){return j("borderRadius")},C.boxshadow=function(){return j("boxShadow")},C.textshadow=function(){return""===b.createElement("div").style.textShadow},C.opacity=function(){return e("opacity:.55"),/^0.55$/.test(t.opacity)},C.cssanimations=function(){return j("animationName")},C.csscolumns=function(){return j("columnCount")},C.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return d((a+"-webkit- ".split(" ").join(b+a)+x.join(c+a)).slice(0,-a.length)),g(t.backgroundImage,"gradient")},C.cssreflections=function(){return j("boxReflect")},C.csstransforms=function(){return!!j("transform")},C.csstransforms3d=function(){var a=!!j("perspective");return a&&"webkitPerspective"in q.style&&H("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=9===b.offsetLeft&&3===b.offsetHeight}),a},C.csstransitions=function(){return j("transition")},C.fontface=function(){var a;return H('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&0===g.indexOf(d.split(" ")[0])}),a},C.generatedcontent=function(){var a;return H(["#",r,"{font:0/0 a}#",r,':after{content:"',v,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},C.video=function(){var a=b.createElement("video"),c=!1;try{(c=!!a.canPlayType)&&(c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,""))}catch(d){}return c},C.audio=function(){var a=b.createElement("audio"),c=!1;try{(c=!!a.canPlayType)&&(c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,""))}catch(d){}return c},C.localstorage=function(){try{return localStorage.setItem(r,r),localStorage.removeItem(r),!0}catch(a){return!1}},C.sessionstorage=function(){try{return sessionStorage.setItem(r,r),sessionStorage.removeItem(r),!0}catch(a){return!1}},C.webworkers=function(){return!!a.Worker},C.applicationcache=function(){return!!a.applicationCache},C.svg=function(){return!!b.createElementNS&&!!b.createElementNS(B.svg,"svg").createSVGRect},C.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="",(a.firstChild&&a.firstChild.namespaceURI)==B.svg},C.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(w.call(b.createElementNS(B.svg,"animate")))},C.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(w.call(b.createElementNS(B.svg,"clipPath")))};for(var L in C)m(C,L)&&(l=L.toLowerCase(),o[l]=C[L](),F.push((o[l]?"":"no-")+l));return o.input||k(),o.addTest=function(a,b){if("object"==typeof a)for(var d in a)m(a,d)&&o.addTest(d,a[d]);else{if(a=a.toLowerCase(),o[a]!==c)return o;b="function"==typeof b?b():b,"undefined"!=typeof p&&p&&(q.className+=" "+(b?"":"no-")+a),o[a]=b}return o},d(""),s=u=null,function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=s.elements;return"string"==typeof a?a.split(" "):a}function e(a){var b=r[a[p]];return b||(b={},q++,a[p]=q,r[q]=b),b}function f(a,c,d){if(c||(c=b),k)return c.createElement(a);d||(d=e(c));var f;return f=d.cache[a]?d.cache[a].cloneNode():o.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!f.canHaveChildren||n.test(a)||f.tagUrn?f:d.frag.appendChild(f)}function g(a,c){if(a||(a=b),k)return a.createDocumentFragment();c=c||e(a);for(var f=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)f.createElement(h[g]);return f}function h(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return s.shivMethods?f(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(s,b.frag)}function i(a){a||(a=b);var d=e(a);return!s.shivCSS||j||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),k||h(a,d),a}var j,k,l="3.7.0",m=a.html5||{},n=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,o=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,p="_html5shiv",q=0,r={};!function(){try{var a=b.createElement("a");a.innerHTML="",j="hidden"in a,k=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){j=!0,k=!0}}();var s={elements:m.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:l,shivCSS:m.shivCSS!==!1,supportsUnknownElements:k,shivMethods:m.shivMethods!==!1,type:"default",shivDocument:i,createElement:f,createDocumentFragment:g};a.html5=s,i(b)}(this,b),o._version=n,o._prefixes=x,o._domPrefixes=A,o._cssomPrefixes=z,o.mq=I,o.hasEvent=J,o.testProp=function(a){return h([a])},o.testAllProps=j,o.testStyles=H,o.prefixed=function(a,b,c){return b?j(a,b,c):j(a,"pfx")},q.className=q.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(p?" js "+F.join(" "):""),o}(this,this.document); -------------------------------------------------------------------------------- /lab-snowtooth-express/public/_dependencies/jquery.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery JavaScript Library v2.1.4 3 | * http://jquery.com/ 4 | * 5 | * Includes Sizzle.js 6 | * http://sizzlejs.com/ 7 | * 8 | * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors 9 | * Released under the MIT license 10 | * http://jquery.org/license 11 | * 12 | * Date: 2015-04-28T16:01Z 13 | */ 14 | !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){function c(a){var b="length"in a&&a.length,c=_.type(a);return"function"===c||_.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}function d(a,b,c){if(_.isFunction(b))return _.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return _.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(ha.test(b))return _.filter(b,a,c);b=_.filter(b,a)}return _.grep(a,function(a){return U.call(b,a)>=0!==c})}function e(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function f(a){var b=oa[a]={};return _.each(a.match(na)||[],function(a,c){b[c]=!0}),b}function g(){Z.removeEventListener("DOMContentLoaded",g,!1),a.removeEventListener("load",g,!1),_.ready()}function h(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=_.expando+h.uid++}function i(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(ua,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:ta.test(c)?_.parseJSON(c):c}catch(e){}sa.set(a,b,c)}else c=void 0;return c}function j(){return!0}function k(){return!1}function l(){try{return Z.activeElement}catch(a){}}function m(a,b){return _.nodeName(a,"table")&&_.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function n(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function o(a){var b=Ka.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function p(a,b){for(var c=0,d=a.length;d>c;c++)ra.set(a[c],"globalEval",!b||ra.get(b[c],"globalEval"))}function q(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(ra.hasData(a)&&(f=ra.access(a),g=ra.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)_.event.add(b,e,j[e][c])}sa.hasData(a)&&(h=sa.access(a),i=_.extend({},h),sa.set(b,i))}}function r(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&_.nodeName(a,b)?_.merge([a],c):c}function s(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ya.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function t(b,c){var d,e=_(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:_.css(e[0],"display");return e.detach(),f}function u(a){var b=Z,c=Oa[a];return c||(c=t(a,b),"none"!==c&&c||(Na=(Na||_("