Showing preview only (3,561K chars total). Download the full file or copy to clipboard to get everything.
Repository: jsfiddle/togetherjs
Branch: develop
Commit: d0c4254d86a1
Files: 387
Total size: 3.3 MB
Directory structure:
gitextract_f7j0faal/
├── .csslint.rc
├── .gitignore
├── .jshintrc
├── .travis.yml
├── CONTRIBUTING.md
├── Gruntfile.js
├── LICENSE.html
├── Procfile
├── README.md
├── addon/
│ ├── .gitignore
│ ├── Procfile
│ ├── README.md
│ ├── data/
│ │ ├── attachment.js
│ │ ├── button.html
│ │ ├── button.js
│ │ └── startup-help.html
│ ├── lib/
│ │ ├── main.js
│ │ └── startup-panel.js
│ └── package.json
├── client
├── devserver.js
├── hub/
│ ├── server.js
│ └── websocket-compat.js
├── package.json
├── phantomjs/
│ └── bridge.js
├── site/
│ ├── base.tmpl
│ ├── bookmarklet.html
│ ├── css/
│ │ ├── bootstrap.css
│ │ ├── carousel.css
│ │ ├── docco.css
│ │ ├── grid.css
│ │ ├── jumbotron.css
│ │ ├── responsive-video.css
│ │ └── style.css
│ ├── docs/
│ │ ├── contributing.md
│ │ ├── faq.md
│ │ └── index.md
│ ├── docs-contributing.tmpl
│ ├── docs.tmpl
│ ├── errors/
│ │ ├── 404.html
│ │ └── 500.html
│ ├── examples/
│ │ ├── drawing/
│ │ │ ├── css/
│ │ │ │ └── main.css
│ │ │ ├── index.html
│ │ │ └── js/
│ │ │ └── sketch.js
│ │ ├── friendlycode/
│ │ │ ├── .gitignore
│ │ │ ├── .gitmodules
│ │ │ ├── LICENSE.html
│ │ │ ├── LICENSE_files/
│ │ │ │ ├── css.css
│ │ │ │ ├── css_002.css
│ │ │ │ └── css_003.css
│ │ │ ├── README.md
│ │ │ ├── build-require.js
│ │ │ ├── codemirror2/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── codemirror.css
│ │ │ │ │ └── codemirror.js
│ │ │ │ └── mode/
│ │ │ │ ├── css/
│ │ │ │ │ └── css.js
│ │ │ │ ├── htmlmixed/
│ │ │ │ │ └── htmlmixed.js
│ │ │ │ ├── javascript/
│ │ │ │ │ └── javascript.js
│ │ │ │ └── xml/
│ │ │ │ └── xml.js
│ │ │ ├── css/
│ │ │ │ ├── buttons.css
│ │ │ │ ├── editor.css
│ │ │ │ ├── errorhelp.css
│ │ │ │ ├── friendlycode.css
│ │ │ │ ├── jsbin-codemirror-theme.css
│ │ │ │ ├── modals.css
│ │ │ │ ├── modals_full_screen.css
│ │ │ │ ├── opensans/
│ │ │ │ │ └── stylesheet.css
│ │ │ │ ├── opensymbolcropped/
│ │ │ │ │ └── stylesheet.css
│ │ │ │ ├── tipsy.css
│ │ │ │ └── ubuntumono/
│ │ │ │ └── stylesheet.css
│ │ │ ├── examples/
│ │ │ │ ├── alternate-publisher.html
│ │ │ │ ├── bare-optimized.html
│ │ │ │ ├── bare.html
│ │ │ │ └── editor-only.html
│ │ │ ├── index.html
│ │ │ ├── js/
│ │ │ │ ├── backbone-events.js
│ │ │ │ ├── fc/
│ │ │ │ │ ├── current-page-manager.js
│ │ │ │ │ ├── hacktionary-data.js
│ │ │ │ │ ├── help.js
│ │ │ │ │ ├── parachute.js
│ │ │ │ │ ├── prefs.js
│ │ │ │ │ ├── publisher.js
│ │ │ │ │ └── ui/
│ │ │ │ │ ├── context-sensitive-help.js
│ │ │ │ │ ├── editor-panes.js
│ │ │ │ │ ├── editor-toolbar.js
│ │ │ │ │ ├── editor.js
│ │ │ │ │ ├── error-help.js
│ │ │ │ │ ├── gutter-pointer.js
│ │ │ │ │ ├── history.js
│ │ │ │ │ ├── indexable-codemirror.js
│ │ │ │ │ ├── live-preview.js
│ │ │ │ │ ├── mark-tracker.js
│ │ │ │ │ ├── modals.js
│ │ │ │ │ ├── parsing-codemirror.js
│ │ │ │ │ ├── preview-to-editor-mapping.js
│ │ │ │ │ ├── publish.js
│ │ │ │ │ ├── relocator.js
│ │ │ │ │ ├── social-media.js
│ │ │ │ │ └── text.js
│ │ │ │ ├── friendlycode.js
│ │ │ │ ├── jquery.no-conflict.js
│ │ │ │ ├── jquery.tipsy.js
│ │ │ │ ├── lscache.js
│ │ │ │ ├── require-config.js
│ │ │ │ ├── require-plugins/
│ │ │ │ │ ├── template.js
│ │ │ │ │ └── text.js
│ │ │ │ └── slowparse-errors.js
│ │ │ ├── package.json
│ │ │ ├── slowparse/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── LICENSE.html
│ │ │ │ ├── LICENSE_files/
│ │ │ │ │ ├── css.css
│ │ │ │ │ ├── css_002.css
│ │ │ │ │ └── css_003.css
│ │ │ │ ├── README.md
│ │ │ │ ├── demo/
│ │ │ │ │ ├── hierarchic-source-code.css
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── jsbin-codemirror-theme.css
│ │ │ │ │ ├── render-dom.js
│ │ │ │ │ ├── tag-colors.js
│ │ │ │ │ └── utils.js
│ │ │ │ ├── index.html
│ │ │ │ ├── slowparse.js
│ │ │ │ ├── spec/
│ │ │ │ │ ├── errors.base.html
│ │ │ │ │ ├── errors.forbidjs.html
│ │ │ │ │ ├── errors.jquery.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── spec.js
│ │ │ │ ├── test/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── qunit.css
│ │ │ │ │ ├── qunit.js
│ │ │ │ │ ├── test-errors.jquery.js
│ │ │ │ │ ├── test-slowparse.js
│ │ │ │ │ ├── test-spec.js
│ │ │ │ │ ├── test-tree-inspectors.js
│ │ │ │ │ └── testing-utils.js
│ │ │ │ ├── tree-inspectors.js
│ │ │ │ └── vendor/
│ │ │ │ ├── brocco.js
│ │ │ │ ├── codemirror2/
│ │ │ │ │ ├── lib/
│ │ │ │ │ │ ├── codemirror.css
│ │ │ │ │ │ └── codemirror.js
│ │ │ │ │ └── mode/
│ │ │ │ │ ├── css/
│ │ │ │ │ │ └── css.js
│ │ │ │ │ ├── htmlmixed/
│ │ │ │ │ │ └── htmlmixed.js
│ │ │ │ │ ├── javascript/
│ │ │ │ │ │ └── javascript.js
│ │ │ │ │ └── xml/
│ │ │ │ │ └── xml.js
│ │ │ │ ├── docco.css
│ │ │ │ ├── jump-to.js
│ │ │ │ └── showdown.js
│ │ │ ├── templates/
│ │ │ │ ├── confirm-dialog.html
│ │ │ │ ├── default-content.html
│ │ │ │ ├── error-dialog.html
│ │ │ │ ├── error-msg.html
│ │ │ │ ├── help-msg.html
│ │ │ │ ├── nav-options.html
│ │ │ │ └── publish-dialog.html
│ │ │ └── test/
│ │ │ ├── all-tests.js
│ │ │ ├── codemirror-577/
│ │ │ │ ├── original.html
│ │ │ │ ├── replacer.html
│ │ │ │ └── test-codemirror-577.js
│ │ │ ├── define-tests.js
│ │ │ ├── index-optimized.html
│ │ │ ├── index.html
│ │ │ ├── lptest.js
│ │ │ ├── preview-to-editor-mapping/
│ │ │ │ ├── path-to.html
│ │ │ │ └── test-preview-to-editor-mapping.js
│ │ │ ├── publisher/
│ │ │ │ ├── post-publish.html
│ │ │ │ ├── pre-publish.html
│ │ │ │ └── test-publisher.js
│ │ │ ├── qunit.css
│ │ │ ├── qunit.js
│ │ │ ├── test-app-optimized.html
│ │ │ ├── test-app.html
│ │ │ ├── test-app.js
│ │ │ ├── test-current-page-manager.js
│ │ │ ├── test-editor-toolbar.js
│ │ │ ├── test-gutter-pointer.js
│ │ │ ├── test-help.js
│ │ │ ├── test-indexable-codemirror.js
│ │ │ ├── test-live-preview.js
│ │ │ ├── test-mark-tracker.js
│ │ │ ├── test-parsing-codemirror.js
│ │ │ ├── test-prefs.js
│ │ │ ├── test-slowparse-errors.js
│ │ │ └── test-templates.js
│ │ ├── madlibs/
│ │ │ ├── css/
│ │ │ │ ├── app.css
│ │ │ │ └── bootstrap.css
│ │ │ ├── index.html
│ │ │ └── js/
│ │ │ ├── app.js
│ │ │ └── bootstrap.js
│ │ ├── persona/
│ │ │ ├── index.html
│ │ │ └── md5.js
│ │ ├── tinymce/
│ │ │ ├── css/
│ │ │ │ └── application.css
│ │ │ ├── index.html
│ │ │ └── js/
│ │ │ ├── application.js
│ │ │ └── application.js~
│ │ ├── todo/
│ │ │ ├── css/
│ │ │ │ └── bootstrap.css
│ │ │ ├── index.html
│ │ │ └── js/
│ │ │ ├── app.js
│ │ │ └── bootstrap.js
│ │ └── youtube/
│ │ ├── css/
│ │ │ └── application.css
│ │ ├── index.html
│ │ └── js/
│ │ └── application.js
│ ├── faq.html
│ ├── generic-markdown.tmpl
│ ├── index.html
│ ├── js/
│ │ ├── bootstrap.js
│ │ ├── custom.js
│ │ ├── frontpage.js
│ │ ├── how-animations.js
│ │ ├── imageresizer.js
│ │ ├── parallax.js
│ │ ├── retina.js
│ │ ├── scrollTo.js
│ │ ├── scrollspy.js
│ │ └── source-code.js
│ ├── less/
│ │ ├── alerts.less
│ │ ├── badges.less
│ │ ├── bootstrap.less
│ │ ├── breadcrumbs.less
│ │ ├── button-groups.less
│ │ ├── buttons.less
│ │ ├── carousel.less
│ │ ├── close.less
│ │ ├── code.less
│ │ ├── component-animations.less
│ │ ├── dropdowns.less
│ │ ├── forms.less
│ │ ├── grid.less
│ │ ├── input-groups.less
│ │ ├── jumbotron.less
│ │ ├── labels.less
│ │ ├── list-group.less
│ │ ├── media.less
│ │ ├── mixins.less
│ │ ├── modals.less
│ │ ├── navbar.less
│ │ ├── navs.less
│ │ ├── normalize.less
│ │ ├── pager.less
│ │ ├── pagination.less
│ │ ├── panels.less
│ │ ├── popovers.less
│ │ ├── print.less
│ │ ├── progress-bars.less
│ │ ├── responsive-utilities.less
│ │ ├── retina.less
│ │ ├── scaffolding.less
│ │ ├── tables.less
│ │ ├── thumbnails.less
│ │ ├── tooltip.less
│ │ ├── type.less
│ │ ├── utilities.less
│ │ ├── variables.less
│ │ └── wells.less
│ ├── source-code-index.tmpl
│ ├── source-code.tmpl
│ └── the-developers/
│ ├── index.html
│ ├── the-developers.css
│ └── the-developers.js
└── togetherjs/
├── README.md
├── analytics.js
├── channels.js
├── chat.js
├── console.js
├── cursor.js
├── elementFinder.js
├── eventMaker.js
├── forms.js
├── functions.less
├── help.txt
├── images/
│ └── notification.ogg
├── interface.html
├── jqueryPlugins.js
├── libs/
│ ├── almond.js
│ ├── require-nomin.js
│ ├── require.js
│ ├── tinycolor.js
│ ├── walkabout/
│ │ ├── README.md
│ │ ├── index.html
│ │ ├── lib/
│ │ │ ├── esprima.js
│ │ │ └── falafel.js
│ │ ├── node-proxy.js
│ │ ├── test_overlap.html
│ │ ├── test_overlap.js
│ │ ├── test_walkabout.html
│ │ ├── test_walkabout.js
│ │ ├── test_walkabout_nojquery.html
│ │ ├── test_walkabout_nojquery.js
│ │ ├── traverse-rewrite.js
│ │ └── walkabout.js
│ └── whrandom/
│ ├── README.md
│ ├── mersenne.js
│ ├── random.js
│ ├── test_random.html
│ └── test_random.js
├── linkify.js
├── locale/
│ ├── de-DE.json
│ ├── en-US.json
│ ├── es-BO.json
│ ├── pl-PL.json
│ └── ru.json
├── mobile.less
├── module-descriptions.json
├── ot.js
├── peers.js
├── playback.js
├── randomutil.js
├── recorder.html
├── recorder.js
├── recorder.less
├── reset.less
├── session.js
├── startup.js
├── storage.js
├── templates-localized.js
├── templates.js
├── templating.js
├── tests/
│ ├── ace.js
│ ├── codemirror4.js
│ ├── doctestjs/
│ │ ├── .gitignore
│ │ ├── .gitmodules
│ │ ├── .hgignore
│ │ ├── .resources/
│ │ │ ├── CNAME
│ │ │ ├── boilerplate/
│ │ │ │ ├── 404.html
│ │ │ │ ├── css/
│ │ │ │ │ ├── main.css
│ │ │ │ │ └── normalize.css
│ │ │ │ ├── index.html
│ │ │ │ └── js/
│ │ │ │ └── main.js
│ │ │ ├── doc.css
│ │ │ ├── example.xml
│ │ │ ├── footer.html
│ │ │ ├── header.html
│ │ │ ├── include-scripts.sh
│ │ │ ├── retemplate.py
│ │ │ ├── template.html
│ │ │ ├── toc.js
│ │ │ └── try.js
│ │ ├── .syncignore
│ │ ├── README.md
│ │ ├── bin/
│ │ │ └── doctest
│ │ ├── doctest.css
│ │ ├── doctest.js
│ │ ├── examples/
│ │ │ ├── examples-2.html
│ │ │ ├── examples-2.js
│ │ │ ├── examples.html
│ │ │ ├── long-running-tests.html
│ │ │ └── long-running-tests.js
│ │ ├── index.html
│ │ ├── package.json
│ │ ├── reference.html
│ │ ├── try.html
│ │ └── tutorial.html
│ ├── func_ace.js
│ ├── func_codemirror.js
│ ├── func_forms.js
│ ├── func_misc.js
│ ├── func_notifications.js
│ ├── func_peer_status.js
│ ├── func_walkthrough.js
│ ├── index.html
│ ├── interactive.js
│ ├── manual/
│ │ ├── index.html
│ │ ├── multi-textarea-focus.html
│ │ └── youtube-video.html
│ ├── mobiletest.html
│ ├── test_console.js
│ ├── test_elementFinder.js
│ ├── test_linkify.js
│ ├── test_misc.js
│ ├── test_ot.js
│ ├── test_ot_text.js
│ ├── test_resolves.js
│ ├── test_storage.js
│ ├── testutils.js
│ └── togetherjs-animations/
│ ├── css/
│ │ └── styles.css
│ ├── index.html
│ └── js/
│ └── animations.js
├── togetherjs.js
├── togetherjs.less
├── ui.js
├── util.js
├── videos.js
├── visibilityApi.js
├── walkabout.html
├── walkthrough.html
├── walkthrough.js
├── webrtc.js
├── who.js
├── windowing.js
└── youtubeVideos.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .csslint.rc
================================================
{
"empty-rules": false,
"empty-rules-reason": "LESS creates some empty rules",
"bulletproof-font-face": false,
"buttetproof-font-face-reason": "This only seems to apply when you provide multiple formats, and we aren't doing that",
"qualified-headings": false,
"qualified-headings-reason": "This happens as part of the reset, we reset headings inside .towtruck (though technically we aren't using headings so we could remove that reset)",
"adjoining-classes": false,
"adjoining-classes-reason": ".class1.class2 isn't supported in some older browsers, but we don't support those",
"vendor-prefix": false,
"vendor-prefix-reason": "We have some vendor prefixes in vendor-prefix-specific selectors, and CSSLint complains about that.",
"compatible-vendor-prefixes": false,
"compatible-vendor-prefixes-reason": "Same as vendor-prefix",
"duplicate-background-images": false,
"duplicate-background-images-reason": "LESS explodes out some background images, creating duplicates, but they aren't duplicated in the source.",
"fallback-colors": false,
"fallback-colors-reason": "Some old browsers don't support RGBA, but we don't care about those browsers"
}
================================================
FILE: .gitignore
================================================
node_modules
.DS_Store
.env*
addon/Profile
dump.rdb
app/http/public/recorder.css
build
test-build
togetherjs.mozillalabs.com
addon/togetherjs.xpi
togetherjs/togetherjs.css
togetherjs/togetherjsPackage.js
================================================
FILE: .jshintrc
================================================
{
// JSHint configurations for node-jshint.
// install with "npm install -g jshint"
// run with "jshint <file(s)> --config config.json"
"asi" : false, // Semicolons required! we minify.
"undef" : false, // var early, var often
// Predefined globals whom JSHint will accept the existence of.
"browser" : true,
// Require curly braces
"curly": true,
// Require hasOwnProperty check
"forin": true,
"indent": 2,
// No arguments.callee/caller
"noarg": true,
// Warn about unused variables
"unused": true,
// No trailing whitespace
"trailing": true
}
================================================
FILE: .travis.yml
================================================
language: node_js
node_js:
- "0.10"
before_install:
- npm install -g npm
- npm install -g grunt-cli
================================================
FILE: CONTRIBUTING.md
================================================
Thanks for your interest in contributing to TogetherJS!
If you found a bug, if at all possible give us a URL where we can try
TogetherJS. Don't worry about tags or milestones or assigning the
ticket. But a URL is extremely helpful!
## Contributing
The [Contributing](https://togetherjs.com/docs/contributing.html)
document on the site gives some more information. Some relevant
points:
* [Javascript style guide](https://github.com/ianb/javascript)
* If you want to work on a ticket, please leave a comment to that
effect. It gives us a chance to suggest where you'd look in the
code to implement the feature or fix the bug, and makes it less
likely that people's contributions will conflict.
* Anything in the
[Blue Sky](https://github.com/mozilla/togetherjs/issues?milestone=23&page=1&state=open)
you are likely to find something that we're interested in having in
TogetherJS, but that we aren't working on.
* If you have an idea of your own you'd like to implement, please open
a ticket describing it. That will let other people know you are
working on it, and give other people an opportunity to give feedback
or implementation notes.
## Where to start?
You should look at the
[Contribution Wanted](https://github.com/mozilla/togetherjs/issues?labels=contribution-wanted&milestone=&page=1&state=open)
tag to see tickets that fall into two categories:
1. A good introductory task to get started on.
2. Something that requires particular skills (that the core team does
not have) that would make a contribution particular valuable.
================================================
FILE: Gruntfile.js
================================================
/*jshint forin:false */
var fs = require("fs");
var path = require('path');
var nunjucks = require("nunjucks");
var marked = require("marked");
var docco = require("docco");
var vars = {
enableExample: false,
enableHome: false,
GA_ACCOUNT: "UA-35433268-28",
base: ""
};
var TESTDIR = "test-build";
module.exports = function (grunt) {
if (! grunt.option("dest")) {
grunt.option("dest", "build");
}
var dumpLineNumbers = false;
if (grunt.option("less-line-numbers")) {
grunt.verbose.writeln("Enabling LESS line numbers");
dumpLineNumbers = true;
}
function copyLink(src, dest) {
if (grunt.file.isDir(src)) {
grunt.file.mkdir(dest);
return;
}
var destDir = path.dirname(dest);
if (! grunt.file.exists(destDir)) {
grunt.file.mkdir(destDir);
}
if (! grunt.option("no-hardlink")) {
try {
if (grunt.file.exists(dest)) {
grunt.file.delete(dest);
}
fs.linkSync(src, dest);
} catch (e) {
grunt.file.copy(src, dest);
}
} else {
grunt.file.copy(src, dest);
}
}
function copyMany(src, dest, patterns) {
var paths = grunt.file.expand({cwd: src}, patterns);
paths.forEach(function (p) {
var srcPath = path.join(src, p);
var destPath = path.join(dest, p);
copyLink(srcPath, destPath);
});
}
var libs = [];
grunt.file.expand(
["togetherjs/*.js", "!togetherjs/randomutil.js", "!togetherjs/recorder.js", "!togetherjs/togetherjs.js"]
).forEach(function (filename) {
filename = filename.replace(/^togetherjs\//, "");
filename = filename.replace(/\.js$/, "");
libs.push(filename);
});
var langs = [];
grunt.file.expand("togetherjs/locale/*.json").forEach(function (langFilename) {
var lang = path.basename(langFilename).replace(/\.json/, "");
langs.push(lang);
libs.push("templates-" + lang);
});
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
less: {
development: {
files: {
"<%= grunt.option('dest') || 'build' %>/togetherjs/togetherjs.css": "togetherjs/togetherjs.less",
"<%= grunt.option('dest') || 'build' %>/togetherjs/recorder.css": "togetherjs/recorder.less"
},
options: {
dumpLineNumbers: dumpLineNumbers
}
}
},
requirejs: {
compile: {
options: {
baseUrl: "togetherjs/",
//paths: requirejsPaths,
include: ["libs/almond"].concat(libs),
//Wrap any build bundle in a start and end text specified by wrap.
//Use this to encapsulate the module code so that define/require are
//not globals. The end text can expose some globals from your file,
//making it easy to create stand-alone libraries that do not mandate
//the end user use requirejs.
wrap: {
start: "(function() {",
end: "TogetherJS.require = TogetherJS._requireObject = require;\nTogetherJS._loaded = true;\nrequire([\"session\"]);\n}());"
},
optimize: "none",
out: function writer(text) {
var dest = path.join(grunt.option("dest"), "togetherjs/togetherjsPackage.js");
grunt.file.write(dest, text);
}
}
}
},
jshint: {
options: {
curly: true,
browser: true,
globals: {
define: true
}
},
all: [
"Gruntfile",
"togetherjs/*.js"
]
},
csslint: {
// Check here for options: https://github.com/stubbornella/csslint/wiki/Rules
options: {
csslintrc: ".csslint.rc"
},
src: [path.join(grunt.option("dest"), "togetherjs/togetherjs.css")]
},
watch: {
main: {
files: ["togetherjs/**/*", "Gruntfile.js"],
tasks: ["build"],
options: {
nospawn: true
}
},
site: {
files: ["togetherjs/**/*", "Gruntfile.js", "site/**/*", "!**/*_flymake*", "!**/*~", "!**/.*"],
tasks: ["build", "buildsite"]
},
// FIXME: I thought I wouldn't have to watch for
// togetherjs/**/*.js, but because the hard links are regularly
// broken by git, this needs to be run often, and it's easy to
// forget. Then between git action the build will be over-run,
// but that's harmless.
minimal: {
files: ["togetherjs/**/*.less", "togetherjs/togetherjs.js", "togetherjs/templates-localized.js",
"togetherjs/**/*.html", "togetherjs/**/*.js", "!**/*_flymake*", "togetherjs/locales/**/*.json"],
tasks: ["build"]
}
},
'http-server': {
'test': {
// the server root directory
root: '.',
cache: 30,
//showDir: true,
//autoIndex: true,
// run in parallel with other tasks
runInBackground: true
}
},
'phantom-tests': grunt.file.expand({
cwd:"togetherjs/tests/"
}, "test_*.js", "func_*.js", "interactive.js", "!test_ot.js").
reduce(function(o, k) { o[k] = {}; return o; }, {})
});
grunt.loadNpmTasks("grunt-contrib-less");
grunt.loadNpmTasks("grunt-contrib-csslint");
grunt.loadNpmTasks("grunt-contrib-jshint");
grunt.loadNpmTasks("grunt-contrib-requirejs");
grunt.loadNpmTasks("grunt-contrib-watch");
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.registerTask("config-requirejs", function() {
// configure the requirejs paths based on the current options
var requirejsPaths = {
jquery: "libs/jquery-1.11.1.min",
walkabout: "libs/walkabout/walkabout",
esprima: "libs/walkabout/lib/esprima",
falafel: "libs/walkabout/lib/falafel",
tinycolor: "libs/tinycolor",
whrandom: "libs/whrandom/random",
jqueryui: "libs/jquery-ui.min",
jquerypunch: "libs/jquery.ui.touch-punch.min",
// Make sure we get the built form of this one:
templates: path.join("..", grunt.option("dest"), "togetherjs/templates")
};
langs.forEach(function(lang) {
requirejsPaths["templates-" + lang] =
path.join("..", grunt.option("dest"), "togetherjs", "templates-" + lang);
});
grunt.config.merge({
requirejs: {
compile: {
options: {
paths: requirejsPaths
}
}
}
});
grunt.task.run("requirejs");
});
grunt.registerTask("copylib", "copy the library", function () {
var pattern = ["**", "!togetherjs.js", "!templates-localized.js", "!**/*.less", "!#*", "!**/*_flymake*", "!**/*.md", "!**/*.tmp", "!**/#*"];
grunt.log.writeln("Copying files from " + "togetherjs/".cyan + " to " + path.join(grunt.option("dest"), "togetherjs").cyan);
if (grunt.option("exclude-tests")) {
pattern.push("!tests/");
pattern.push("!tests/**");
grunt.log.writeln(" (excluding tests)");
}
copyMany(
"togetherjs/", path.join(grunt.option("dest"), "togetherjs"),
pattern
);
});
grunt.registerTask("copysite", "copy the site (not library)", function () {
grunt.log.writeln("Copying files from " + "site/".cyan + " to " + grunt.option("dest").cyan);
copyMany(
"site/", grunt.option("dest"),
["**", "!**/*.tmpl", "!**/*.html", "!public/**", "!**/*_flymake*", "!**/*.md"]);
copyMany(
"site/public/", grunt.option("dest"),
["**"]);
});
grunt.registerTask("build", ["copylib", "maybeless", "substitute", "config-requirejs"]);
grunt.registerTask("buildsite", ["copysite", "render", "rendermd", "docco"]);
grunt.registerTask("devwatch", ["build", "watch:minimal"]);
// For some reason doing ["build", "buildsite", "watch:site"]
// doesn't work, it gets through buildsite and doesn't watch;
// instead just doing watch:site seems okay:
grunt.registerTask("sitewatch", ["buildsite", "watch:site"]);
function escapeString(s) {
if (typeof s != "string") {
throw new Error("Not a string: " + s);
}
var data = JSON.stringify(s);
return data.substr(1, data.length-2);
}
grunt.registerTask(
"substitute",
"Substitute templates-localized.js and parameters in togetherjs.js",
function () {
// FIXME: I could use grunt.file.copy(..., {process: function (content, path) {}}) here
var baseUrl = grunt.option("base-url") || ""; // baseURL to be entered by the user
if (! baseUrl) {
grunt.log.writeln("No --base-url, using auto-detect");
}
var destBase = grunt.option("dest") || "build"; // where to put the built files. If not indicated then into build/
var hubUrl = grunt.option("hub-url") || process.env.HUB_URL || "https://hub.togetherjs.com"; // URL of the hub server
grunt.log.writeln("Using hub URL " + hubUrl.cyan);
var gitCommit = process.env.GIT_COMMIT || "";
var subs = {
__interface_html__: grunt.file.read("togetherjs/interface.html"),
__help_txt__: grunt.file.read("togetherjs/help.txt"),
__walkthrough_html__: grunt.file.read("togetherjs/walkthrough.html"),
__baseUrl__: baseUrl,
__hubUrl__: hubUrl,
__gitCommit__: gitCommit
};
function substituteContent(content, s) {
for (var v in s) {
var re = new RegExp(v, "g");
if (typeof s[v] != "string") {
grunt.log.error("Substitution variable " + v.cyan + " is not a string")
}
content = content.replace(re, escapeString(s[v]));
}
return content;
}
var filenames = {
"togetherjs.js": {
src: "togetherjs/togetherjs.js",
extraVariables: {__min__: "no"}
},
"togetherjs-min.js": {
src: "togetherjs/togetherjs.js",
extraVariables: {__min__: "yes"}
}
};
for (var dest in filenames) {
var info = filenames[dest];
var src = info.src;
var extraVariables = info.extraVariables;
dest = destBase + "/" + dest;
var content = fs.readFileSync(src, "UTF-8");
var s = subs;
if (extraVariables) {
s = Object.create(subs);
for (var a in extraVariables) {
s[a] = extraVariables[a];
}
}
content = substituteContent(content, s);
grunt.log.writeln("writing " + src.cyan + " to " + dest.cyan);
grunt.file.write(dest, content);
}
grunt.file.expand("togetherjs/locale/*.json").forEach(function (langFilename) {
var templates = grunt.file.read("togetherjs/templates-localized.js");
var lang = path.basename(langFilename).replace(/\.json/, "");
var translation = JSON.parse(grunt.file.read(langFilename));
var dest = path.join(grunt.option("dest"), "togetherjs/templates-" + lang + ".js");
var translatedInterface = translateFile("togetherjs/interface.html", translation);
var translatedHelp = translateFile("togetherjs/help.txt", translation);
var translatedWalkthrough = translateFile("togetherjs/walkthrough.html", translation);
var vars = subs;
subs.__interface_html__ = translatedInterface;
subs.__help_txt__ = translatedHelp;
subs.__walkthrough_html__ = translatedWalkthrough;
subs.__names__ = translation.names;
templates = substituteContent(templates, subs);
grunt.file.write(dest, templates);
grunt.log.writeln("writing " + dest.cyan + " based on " + langFilename.cyan);
});
return true;
}
);
function translateFile(source, translation) {
var env = new nunjucks.Environment(new nunjucks.FileSystemLoader("./"));
var tmpl = env.getTemplate(source);
return tmpl.render({
gettext: function (string) {
return translation[string] || string;
}
});
}
grunt.registerTask("maybeless", "Maybe compile togetherjs.less", function () {
var sources = grunt.file.expand(["togetherjs/**/*.less", "site/**/*.less"]);
var found = false;
sources.forEach(function (fn) {
var source = fs.statSync(fn);
var destFn = grunt.option("dest") + "/" + fn.substr(0, fn.length-4) + "css";
if (! fs.existsSync(destFn)) {
found = true;
return;
}
var dest = fs.statSync(destFn);
if (source.mtime.getTime() > dest.mtime.getTime()) {
grunt.log.writeln("Destination LESS out of date: " + destFn.cyan);
found = true;
}
});
if (found) {
grunt.task.run("less");
} else {
grunt.log.writeln("No .less files need regenerating.");
}
});
grunt.registerTask("render", "Render the site", function () {
var env = new nunjucks.Environment(new nunjucks.FileSystemLoader("site/"));
var sources = grunt.file.expand({cwd: "site/"}, "**/*.html");
sources.forEach(function (source) {
var dest = grunt.option("dest") + "/" + source;
grunt.log.writeln("Rendering " + source.cyan + " to " + dest.cyan);
var data = grunt.file.read("site/" + source);
var tmplVars = Object.create(vars);
while (true) {
var match = /\{\#\s+set\s+([^\s]+)\s+([^#]+)\s*\#\}/.exec(data);
if (! match) {
break;
}
tmplVars[match[1]] = JSON.parse(match[2]);
grunt.log.writeln(" Found variable " + match[1] + " = " + match[2]);
data = data.substr(match.index + match[0].length);
}
tmplVars.base = path.relative(path.dirname("site/" + source), "site/");
if (tmplVars.base && tmplVars.base.search(/\/$/) == -1) {
tmplVars.base += "/";
}
if (tmplVars.absoluteLinks) {
tmplVars.base = "/";
}
tmplVars.base = tmplVars.base.replace(/\\/g, '/');
var tmpl = env.getTemplate(source);
var result = tmpl.render(tmplVars);
grunt.file.write(dest, result);
});
});
function parseMarkdownOutput(doc) {
var title = (/<h1[^>]*>(.*)<\/h1>/i).exec(doc);
title = title[1];
var body = doc.replace(/<h1[^>]*>.*<\/h1>/i, "");
return {
title: title,
body: body
};
}
function addHeaderIds(doc) {
var result = [];
while (doc) {
var match = (/(<h\d)>(.*)(<\/h\d>)/i).exec(doc);
if (! match) {
result.push(doc);
break;
}
var id = match[2];
id = id.toLowerCase();
id = id.replace(/ +/g, "-");
id = id.replace(/[^a-z0-9_\-]/g, "");
var header = match[1] + ' id="' + id + '">' + match[2] + match[3];
result.push(doc.substr(0, match.index));
result.push(header);
doc = doc.substr(match.index + match[0].length);
}
return result.join("");
}
function highlight(code, lang) {
var hjs = require("highlight.js");
var aliases = {
html: "xml",
js: "javascript"
};
lang = aliases[lang] || lang;
try {
if (lang) {
return hjs.highlight(lang, code).value;
} else {
return hjs.highlightAuto(code).value;
}
} catch (e) {
grunt.fail.fatal("Error highlighting: " + e);
throw e;
}
}
marked.setOptions({highlight: highlight});
grunt.registerTask("rendermd", "Render the site Markdown files", function () {
var env = new nunjucks.Environment(new nunjucks.FileSystemLoader("site/"));
var sources = grunt.file.expand({cwd: "site/"}, "**/*.md", "!**/README.md");
sources.forEach(function (source) {
var basename = source.replace(/\.md$/, "");
var dest = grunt.option("dest") + "/" + basename + ".html";
grunt.log.writeln("Rendering " + source.cyan + " to " + dest.cyan);
var data = grunt.file.read("site/" + source);
var templateName = "generic-markdown.tmpl";
var match = (/template:\s*([a-zA-Z_\-0-9.]*)/).exec(data);
if (match) {
templateName = match[1];
}
var html = marked(data, {
smartypants: true
});
var parsed = parseMarkdownOutput(html);
parsed.body = addHeaderIds(parsed.body);
var tmpl = env.getTemplate(templateName);
var tmplVars = Object.create(vars);
tmplVars.markdownBody = parsed.body;
tmplVars.title = parsed.title;
tmplVars.base = path.relative(path.dirname("site/" + source), "site/");
if (tmplVars.base && tmplVars.base.search(/\/$/) == -1) {
tmplVars.base += "/";
}
tmplVars.base = tmplVars.base.replace(/\\/g, '/');
var result = tmpl.render(tmplVars);
grunt.file.write(dest, result);
});
});
function doccoFormat(source, sections) {
sections.forEach(function (section) {
var code = highlight(section.codeText, "javascript");
code = code.replace(/\s+$/, '');
section.codeHtml = "<div class='highlight'><pre>" + code + "</pre></div>";
section.docsHtml = marked(section.docsText);
});
}
grunt.registerTask("docco", "Create comment-separating source code", function () {
var env = new nunjucks.Environment(new nunjucks.FileSystemLoader("site/"));
var sources = grunt.file.expand({cwd: "togetherjs/"}, "*.js");
sources.sort();
var sourceDescriptions = JSON.parse(grunt.file.read("togetherjs/module-descriptions.json"));
var sourceList = [];
sources.forEach(function (source) {
var name = source.replace(/\.js$/, "");
sourceList.push({
name: name,
link: source + ".html",
description: marked(sourceDescriptions[name] || "", {smartypants: true})
});
});
sources.forEach(function (source) {
var sourceName = source.replace(/\.js$/, "");
var dest = grunt.option("dest") + "/source/" + source + ".html";
grunt.log.writeln("Rendering " + source.cyan + " to " + dest.cyan);
var code = grunt.file.read("togetherjs/" + source);
var sections = docco.parse(source, code, {languages:{}});
doccoFormat(source, sections);
sections.forEach(function (section, i) {
section.index = i;
section.empty = section.codeText.replace(/\s/gm, "") === "";
});
var first = marked.lexer(sections[0].docsText)[0];
var hasTitle = first && first.type == 'heading' && first.depth == 1;
var title = hasTitle ? first.text : path.basename(source, ".js");
var tmpl = env.getTemplate("source-code.tmpl");
var tmplVars = Object.create(vars);
tmplVars.title = title;
tmplVars.sections = sections;
tmplVars.source = source;
tmplVars.sourceName = sourceName;
tmplVars.sourceDescription = marked(sourceDescriptions[sourceName] || "", {smartypants: true});
tmplVars.base = "../";
tmplVars.sourceList = sourceList;
var result = tmpl.render(tmplVars);
grunt.file.write(dest, result);
});
var tmplVars = Object.create(vars);
tmplVars.title = "TogetherJS Source Code";
tmplVars.sourceList = sourceList;
tmplVars.base = "../";
var tmpl = env.getTemplate("source-code-index.tmpl");
grunt.file.write(grunt.option("dest") + "/source/index.html", tmpl.render(tmplVars));
});
grunt.registerTask("buildaddon", "Build the Firefox addon and move the XPI into the site", function () {
var done = this.async();
grunt.util.spawn({
cmd: "cfx",
args: ["xpi"],
opts: {
cwd: "addon/"
}
}, function (error, result, code) {
if (error) {
grunt.log.error("Error running cfx xpi: " + error.toString().cyan);
grunt.fail.fatal("Error creating XPI");
done();
return;
}
var dest = path.join(grunt.option("dest"), "togetherjs.xpi");
grunt.file.copy("addon/togetherjs.xpi", dest);
grunt.log.writeln("Created " + dest.cyan);
done();
});
});
grunt.registerTask("publish", "Publish to togetherjs.mozillalabs.com/public/", function () {
if (! grunt.file.isDir("togetherjs.mozillalabs.com")) {
grunt.log.writeln("Error: you must check out togetherjs.mozillalabs.com");
grunt.log.writeln("Use:");
grunt.log.writeln(" $ git clone -b togetherjs.mozillalabs.com git:git@github.com:mozilla/togetherjs.git togetherjs.mozillalabs.com");
grunt.log.writeln(" $ cd togetherjs.mozillalabs.com/.git");
grunt.log.writeln(" $ echo '[remote \"staging\"]\n\turl = git@heroku.com:togetherjs-staging.git\n\tpush = refs/heads/togetherjs.mozillalabs.com:refs/heads/master\n[remote \"production\"]\n\turl = git@heroku.com:togetherjs.git\n\tpush = refs/heads/togetherjs.mozillalabs.com:refs/heads/master\n' >> config");
grunt.fail.fatal("Must checkout togetherjs.mozillalabs.com");
return;
}
var versions = "togetherjs.mozillalabs.com/public/versions";
if (! grunt.file.isDir(versions)) {
grunt.log.writeln("Error: " + versions.cyan + " does not exist");
grunt.fail.fatal("No versions/ directory");
return;
}
var tmp = "togetherjs.mozillalabs.com/public_versions_tmp";
fs.rename(versions, tmp);
grunt.file.delete("togetherjs.mozillalabs.com/public");
grunt.file.mkdir("togetherjs.mozillalabs.com/public");
fs.rename(tmp, versions);
if (! grunt.option("base-url")) {
grunt.option("base-url", "https://togetherjs.com");
}
grunt.option("dest", "togetherjs.mozillalabs.com/public");
grunt.option("exclude-tests", true);
grunt.option("no-hardlink", true);
grunt.task.run(["build", "buildsite", "buildaddon"]);
grunt.task.run(["movecss"]);
grunt.log.writeln("To actually publish you must do:");
grunt.log.writeln(" $ cd togetherjs.mozillalabs.com/");
grunt.log.writeln(" $ git add -A");
grunt.log.writeln(" $ git commit -a -m 'Publish'");
grunt.log.writeln(" $ git push && git push staging");
});
grunt.registerTask("publishversion", "Publish to togetherjs.mozillalabs.com/public/versions/", function () {
var version = grunt.option("togetherjs-version");
if (! version) {
grunt.log.error("You must provide a --togetherjs-version=X.Y argument");
grunt.fail.fatal("No --togetherjs-version");
return;
}
if (! grunt.file.isDir("togetherjs.mozillalabs.com/public/versions")) {
grunt.log.error("The directory togetherjs.mozillalabs.com/public/versions does not exist");
grunt.fail.fatal();
return;
}
var destDir = "togetherjs.mozillalabs.com/public/versions/" + version;
if (grunt.file.exists(destDir)) {
grunt.log.error("The directory " + destDir + " already exists");
grunt.log.error(" Delete it first to re-create version");
grunt.fail.fatal();
return;
}
grunt.option("base-url", "https://togetherjs.com/versions/" + version);
grunt.option("dest", destDir);
grunt.option("exclude-tests", true);
grunt.option("no-hardlink", true);
grunt.task.run(["build"]);
grunt.task.run(["movecss"]);
var readme = grunt.file.read("togetherjs.mozillalabs.com/public/versions/README.md");
readme += " * [" + version + "](./" + version + "/togetherjs.js)\n";
grunt.file.write("togetherjs.mozillalabs.com/public/versions/README.md", readme);
});
grunt.registerTask("movecss", "Publish generated css files to dest", function () {
// Can't figure out how to parameterize the less task, hence this lame move
["togetherjs/togetherjs.css", "togetherjs/recorder.css"].forEach(function (css) {
var src = path.join("build", css);
var dest = path.join(grunt.option("dest"), css);
grunt.file.copy(src, dest);
grunt.log.writeln("Copying " + src.cyan + " to " + dest.cyan);
});
});
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.registerTask('dev', function() {
grunt.util.spawn({
cmd: 'node',
args: ['devserver.js']
});
grunt.task.run('watch');
});
grunt.registerTask("test", "Run jshint and test suite", ["jshint", "phantom"]);
grunt.loadNpmTasks('grunt-http-server');
grunt.registerTask("phantom", ["phantom-setup", "phantom-tests"]);
grunt.registerTask("phantom-setup", "Run jdoctest test suite in phantomjs",
function() {
var done = this.async();
// find unused ports for web server and hub
var freeport = require("freeport");
freeport(function(err1, hubPort) {
freeport(function(err2, webPort) {
if (err1 || err2) { return done(err1 || err2); }
// build togetherjs using these default ports
grunt.option("base-url", "http://localhost:"+webPort+"/"+TESTDIR+"/");
grunt.option("hub-url", "http://localhost:"+hubPort);
grunt.option("no-hardlink", true);
grunt.option("dest", TESTDIR);
// make sure the web server will use the right port
grunt.config.merge({
'http-server': {
test: {
port: webPort,
host: "localhost"
}
}
});
// spawn a hub, using the hub port
var hub = require("./hub/server");
hub.startServer(hubPort, "localhost");
// build & start the web server
grunt.task.run("build", "http-server:test");
// ok, now we can run the tests in phantomjs!
done();
});
});
});
// PhantomJS event handlers
var phantomjs = require("grunt-lib-phantomjs").init(grunt);
var phantomStatus;
phantomjs.on('fail.load', function(url) {
phantomjs.halt();
grunt.verbose.write('Running PhantomJS...').or.write('...');
grunt.log.error('PhantomJS unable to load "' + url + '" URI.');
phantomStatus.failed += 1;
phantomStatus.total += 1;
});
phantomjs.on('fail.timeout', function() {
phantomjs.halt();
grunt.log.writeln();
grunt.log.error('PhantomJS timed out.');
phantomStatus.failed += 1;
phantomStatus.total += 1;
});
phantomjs.on('doctestjs.pass', function(result) {
phantomStatus.total += 1;
grunt.verbose.ok("Passed: "+result.example.summary);
});
phantomjs.on('doctestjs.fail', function(result) {
phantomStatus.failed += 1;
phantomStatus.total += 1;
grunt.log.error("Failed: "+result.example.expr);
grunt.log.subhead("Expected:");
grunt.log.writeln(result.example.expected);
grunt.log.subhead("Got:");
grunt.log.writeln(result.got);
});
phantomjs.on('doctestjs.end', function() {
phantomjs.halt();
});
// Pass through console.log statements (when verbose)
phantomjs.on('console', grunt.verbose.writeln);
grunt.registerMultiTask("phantom-tests", function() {
grunt.task.requires('phantom-setup');
var url = grunt.option('base-url') +
"togetherjs/tests/index.html?name=" + this.target;
grunt.verbose.writeln("Running tests at: "+url);
// Merge task-specific and/or target-specific options with these defaults.
var options = this.options({
// PhantomJS timeout, in ms.
timeout: 10000,
// JDoctest-PhantomJS bridge file to be injected.
inject: path.join(__dirname, 'phantomjs', 'bridge.js'),
//screenshot: true,
page: {
// leave room for the togetherjs sidebar
viewportSize: { width: 1024, height: 1024 }
}
});
// Reset test status
phantomStatus = {failed: 0, passed: 0, total: 0, start: Date.now()};
// Start phantomjs on this URL
var done = this.async();
phantomjs.spawn(url, {
options: options,
done: function() {
var duration = Date.now() - phantomStatus.start;
// Log results.
if (phantomStatus.failed > 0) {
grunt.warn(phantomStatus.failed + '/' + phantomStatus.total +
' assertions failed (' + duration + 'ms)');
} else if (phantomStatus.total === 0) {
grunt.warn('0/0 assertions ran (' + duration + 'ms)');
} else {
grunt.verbose.writeln();
grunt.log.ok(phantomStatus.total + ' assertions passed (' + duration + 'ms)');
}
// All done!
done();
}
});
});
grunt.registerTask('default', 'start');
};
================================================
FILE: LICENSE.html
================================================
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<title>Mozilla Public License, version 2.0</title>
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link href='http://fonts.googleapis.com/css?family=Crimson+Text' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=Lora' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
<style type="text/css">
body { font-family: 'Crimson Text', serif;
max-width: 30em;
margin-left:auto;
margin-right:auto;
text-align: justify;
-moz-hyphens: auto;
font-size: 110%
}
h1, h2, h3 {
font-family: 'Lora', serif;
font-variant: small-caps;
}
h1 {
text-align: center;
-moz-hyphens: none;
font-size: 160%;
}
h2 {
font-size: 140%;
-moz-hyphens: none;
text-align: left;
}
h3 {
font-size: 120%;
-moz-hyphens: none;
text-align: left;
}
blockquote {
font-family: 'Droid Sans Mono', mono;
text-align: left;
-moz-hyphens: none;
}
code {
font-family: 'Droid Sans Mono', mono;
}
em {
background: #FEFD80;
border: 30px solid #FEFD80;
float: left;
line-height: 1.25em;
margin-left: 10px;
margin-right: 10px;
margin-bottom: 10px;
margin-top:-10px;
/* text-transform: uppercase; */
font-style: normal;
}
dt { font-family: 'Lora', serif;
font-weight: bold;
font-size: 100%;
}
</style>
</head>
<body>
<h1 id="mozilla-public-license-version-2.0">Mozilla Public License<br>Version 2.0</h1>
<h2 id="definitions">1. Definitions</h2>
<dl>
<dt>1.1. “Contributor”</dt>
<dd><p>means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software.</p>
</dd>
<dt>1.2. “Contributor Version”</dt>
<dd><p>means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor’s Contribution.</p>
</dd>
<dt>1.3. “Contribution”</dt>
<dd><p>means Covered Software of a particular Contributor.</p>
</dd>
<dt>1.4. “Covered Software”</dt>
<dd><p>means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof.</p>
</dd>
<dt>1.5. “Incompatible With Secondary Licenses”</dt>
<dd><p>means</p>
<ol type="a">
<li><p>that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or</p></li>
<li><p>that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License.</p></li>
</ol>
</dd>
<dt>1.6. “Executable Form”</dt>
<dd><p>means any form of the work other than Source Code Form.</p>
</dd>
<dt>1.7. “Larger Work”</dt>
<dd><p>means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software.</p>
</dd>
<dt>1.8. “License”</dt>
<dd><p>means this document.</p>
</dd>
<dt>1.9. “Licensable”</dt>
<dd><p>means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License.</p>
</dd>
<dt>1.10. “Modifications”</dt>
<dd><p>means any of the following:</p>
<ol type="a">
<li><p>any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or</p></li>
<li><p>any new file in Source Code Form that contains any Covered Software.</p></li>
</ol>
</dd>
<dt>1.11. “Patent Claims” of a Contributor</dt>
<dd><p>means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version.</p>
</dd>
<dt>1.12. “Secondary License”</dt>
<dd><p>means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses.</p>
</dd>
<dt>1.13. “Source Code Form”</dt>
<dd><p>means the form of the work preferred for making modifications.</p>
</dd>
<dt>1.14. “You” (or “Your”)</dt>
<dd><p>means an individual or a legal entity exercising rights under this License. For legal entities, “You” includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.</p>
</dd>
</dl>
<h2 id="license-grants-and-conditions">2. License Grants and Conditions</h2>
<h3 id="grants">2.1. Grants</h3>
<p>Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:</p>
<ol type="a">
<li><p>under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and</p></li>
<li><p>under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version.</p></li>
</ol>
<h3 id="effective-date">2.2. Effective Date</h3>
<p>The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution.</p>
<h3 id="limitations-on-grant-scope">2.3. Limitations on Grant Scope</h3>
<p>The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor:</p>
<ol type="a">
<li><p>for any code that a Contributor has removed from Covered Software; or</p></li>
<li><p>for infringements caused by: (i) Your and any other third party’s modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or</p></li>
<li><p>under Patent Claims infringed by Covered Software in the absence of its Contributions.</p></li>
</ol>
<p>This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4).</p>
<h3 id="subsequent-licenses">2.4. Subsequent Licenses</h3>
<p>No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3).</p>
<h3 id="representation">2.5. Representation</h3>
<p>Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License.</p>
<h3 id="fair-use">2.6. Fair Use</h3>
<p>This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents.</p>
<h3 id="conditions">2.7. Conditions</h3>
<p>Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1.</p>
<h2 id="responsibilities">3. Responsibilities</h2>
<h3 id="distribution-of-source-form">3.1. Distribution of Source Form</h3>
<p>All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients’ rights in the Source Code Form.</p>
<h3 id="distribution-of-executable-form">3.2. Distribution of Executable Form</h3>
<p>If You distribute Covered Software in Executable Form then:</p>
<ol type="a">
<li><p>such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and</p></li>
<li><p>You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients’ rights in the Source Code Form under this License.</p></li>
</ol>
<h3 id="distribution-of-a-larger-work">3.3. Distribution of a Larger Work</h3>
<p>You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s).</p>
<h3 id="notices">3.4. Notices</h3>
<p>You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies.</p>
<h3 id="application-of-additional-terms">3.5. Application of Additional Terms</h3>
<p>You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction.</p>
<h2 id="inability-to-comply-due-to-statute-or-regulation">4. Inability to Comply Due to Statute or Regulation</h2>
<p>If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.</p>
<h2 id="termination">5. Termination</h2>
<p>5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice.</p>
<p>5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate.</p>
<p>5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination.</p>
<h2 id="disclaimer-of-warranty">6. Disclaimer of Warranty</h2>
<p><em>Covered Software is provided under this License on an “as is” basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer.</em></p>
<h2 id="limitation-of-liability">7. Limitation of Liability</h2>
<p><em>Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party’s negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You.</em></p>
<h2 id="litigation">8. Litigation</h2>
<p>Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party’s ability to bring cross-claims or counter-claims.</p>
<h2 id="miscellaneous">9. Miscellaneous</h2>
<p>This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor.</p>
<h2 id="versions-of-the-license">10. Versions of the License</h2>
<h3 id="new-versions">10.1. New Versions</h3>
<p>Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number.</p>
<h3 id="effect-of-new-versions">10.2. Effect of New Versions</h3>
<p>You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward.</p>
<h3 id="modified-versions">10.3. Modified Versions</h3>
<p>If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License).</p>
<h3 id="distributing-source-code-form-that-is-incompatible-with-secondary-licenses">10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses</h3>
<p>If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached.</p>
<h2 id="exhibit-a---source-code-form-license-notice">Exhibit A - Source Code Form License Notice</h2>
<blockquote>
<p>This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.</p>
</blockquote>
<p>If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice.</p>
<p>You may add additional accurate notices of copyright ownership.</p>
<h2 id="exhibit-b---incompatible-with-secondary-licenses-notice">Exhibit B - “Incompatible With Secondary Licenses” Notice</h2>
<blockquote>
<p>This Source Code Form is “Incompatible With Secondary Licenses”, as defined by the Mozilla Public License, v. 2.0.</p>
</blockquote>
</body>
</html>
================================================
FILE: Procfile
================================================
web: node hub/server.js
================================================
FILE: README.md
================================================
TogetherJS - Surprisingly easy collaboration
============================================
What is TogetherJS?
-----------------
TogetherJS is a service for your website that makes it surprisingly easy to collaborate in real-time.
Using TogetherJS two people can interact on the same page, seeing each other's cursors, edits, and browsing a site together. The TogetherJS service is included by the web site owner, and a web site can customize and configure aspects of TogetherJS's behavior on the site.
For more information and to see TogetherJS in action, visit [togetherjs.com](https://togetherjs.com/)
If you want to integrate TogetherJS onto your site see [the wiki](https://github.com/mozilla/togetherjs/wiki) and specifically [Getting Started](https://github.com/mozilla/togetherjs/wiki/Developers:-Getting-Started).
Contributing
============
The remainder of this document is about contributing to TogetherJS - but reports, fixes, features, etc. Look back at those other links if you are looking for something else.
Bug Reports
-----------
Please submit bug reports as [github issues](https://github.com/mozilla/togetherjs/issues/new). Don't worry about labels or milestones. If you use the in-app feedback to give us a bug report that's fine too.
Roadmap & Plans
---------------
To see what we're planning or at least considering to do with TogetherJS, look at [see our bug tracker](https://github.com/mozilla/togetherjs/issues?state=open).
Setting up a development environment
------------------------------------
TogetherJS has two main pieces:
* The [server](https://github.com/mozilla/togetherjs/blob/develop/hub/server.js), which echos messages back and forth between users. The server doesn't do much, you may gaze upon its incredibly boring [history](https://github.com/mozilla/togetherjs/commits/develop/hub/server.js).
* The client in [`togetherjs/`](https://github.com/mozilla/togetherjs/tree/develop/togetherjs) which does all the real work.
There is a TogetherJS hub server deployed at `https://hub.togetherjs.com` - and there's little need for other server deployments. If you want to try TogetherJS out we recommend you use our hub server. Note if you include TogetherJS on an https site, you must use an https hub server.
The files need to be lightly "built": we use [LESS](http://lesscss.org/) for styles, and a couple files are generated. To develop you need to build the library using [Grunt](http://gruntjs.com/).
To build a copy of the library, check out TogetherJS:
```sh
$ git clone git://github.com/mozilla/togetherjs.git
$ cd togetherjs
```
Then [install npm](http://nodejs.org/download/) and run:
```sh
$ npm install
$ npm install -g grunt-cli
```
This will install a bunch of stuff, most of which is only used for development. The only "server" dependency is [WebSocket-Node](https://github.com/Worlize/WebSocket-Node) (and if you use our hub then you don't need to worry about the server). By default everything is installed locally, i.e., in `node_modules/`. This works just fine, but it is useful to install the `grunt` command-line program globally, which `npm install -g grunt-cli` does.
Now you can build TogetherJS, like:
```sh
$ grunt build buildsite --no-hardlink
```
This will create a copy of the entire `togetherjs.com` site in `build/`. You'll need to setup a local web server of your own pointed to the `build/` directory. To start a server on port 8080, run:
```sh
$ node devserver.js
```
If you want to develop with TogetherJS you probably want the files built continually. To do this use:
```sh
$ grunt devwatch
```
This will rebuild when changes are detected. Note that Grunt is configured to create [hard links](http://en.wikipedia.org/wiki/Hard_link) instead of copying so that most changes you make to files in `togetherjs/` don't need to be rebuilt to show up in `build/togetherjs/`. `--no-hardlink` turns this behavior off.
You may wish to create a static copy of the TogetherJS client to distribute and use on your website. To do this run:
```sh
$ grunt build --base-url https://myapp.com --no-hardlink --dest static-myapp
```
Then `static-myapp/togetherjs.js` and `static-myapp/togetherjs-min.js` will be in place, and the rest of the code will be under `static-myapp/togetherjs/`. You would deploy these on your server.
Running a local server
----------------------
You shouldn't need to run your own version of the hub server. But if you
happen to make changes to the server, you can change the default hub
URL by setting the HUB_URL environment variable when building. For example:
```
$ HUB_URL=http://localhost:8080 grunt devwatch
```
Testing
-------
Tests are in `togetherjs/tests/` -- these are [doctest.js](http://doctestjs.org/) tests. To actually run the tests build togetherjs, serve it up, and go to `http://localhost:PORT/togetherjs/tests/` -- from there the tests are linked to from the top of the page. The actual tests are `*.js` files in `togetherjs/tests/`, generally `test_*.js` for unit-style tests, and `func_*.js` for functional tests.
The "Manual testing" link is something that lets you simulate different conditions in TogetherJS without setting up a second browser/client.
There is unfortunately no automated runner for these tests. It might be nice if [Karma](http://karma-runner.github.io/) could be setup with doctest.js in general, but so far that isn't done.
License
-------
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this file,
You can obtain one at [http://mozilla.org/MPL/2.0/](http://mozilla.org/MPL/2.0/).
================================================
FILE: addon/.gitignore
================================================
Profile*
================================================
FILE: addon/Procfile
================================================
profilea: cfx run --binary /Applications/FirefoxNightly.app -p ProfileA
profileb: sleep 1; cfx run --binary /Applications/FirefoxNightly.app -p ProfileB
================================================
FILE: addon/README.md
================================================
The Firefox Addon simply adds togetherjs.js to a window - when you turn
it on the tab gets togetherjs for that one tab, and when you turn it off
it stops.
================================================
FILE: addon/data/attachment.js
================================================
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
self.port.on("Config", function (config) {
var doc = unsafeWindow.document;
unsafeWindow._TogetherJSBookmarklet = true;
unsafeWindow.TogetherJSConfig_hubBase = config.hubBase;
if (config.shareId) {
unsafeWindow._TogetherJSShareId = config.shareId;
}
var script = doc.createElement("script");
script.src = config.url;
console.log("Attaching:", script.outerHTML, "to:", window.location.href);
doc.head.appendChild(script);
});
// FIXME: need to bind to session.on("close") and emit this:
// self.port.emit("Close");
================================================
FILE: addon/data/button.html
================================================
<div>
<a id="togetherjs-button" href="#">togetherjs</span>
</div>
================================================
FILE: addon/data/button.js
================================================
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
self.port.on("TogetherJSOn", function () {
document.getElementById("togetherjs-button").innerHTML = "truckin'";
});
self.port.on("TogetherJSOff", function () {
document.getElementById("togetherjs-button").innerHTML = "togetherjs";
});
================================================
FILE: addon/data/startup-help.html
================================================
<!DOCTYPE html>
<html>
<head>
<title>Welcome to TogetherJS</title>
</head>
<body>
<p>Thanks for checking out TogetherJS.</p>
<p>You should see a link/button at the bottom right of the
browser: <span style="text-decoration: underline; color:
#00f">togetherjs</span> — if you don't then you need to show the
Add-on Bar:</p>
<p>Go to <strong>View > Toolbars > Add-on bar</strong> to
display the bar
(or <a href="http://support.mozilla.org/en-US/kb/add-on-bar-quick-access-to-add-ons">read
more here</a>).</p>
<p>Once you see the button, click it to start sharing your session.
Once you are sharing you have to tell someone else (more instructions
here) </p>
</body>
</html>
================================================
FILE: addon/lib/main.js
================================================
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
const widgets = require("widget");
const data = require("self").data;
const tabs = require("tabs");
const { StartupPanel } = require("./startup-panel");
const { Page } = require("page-worker");
const simplePrefs = require('simple-prefs');
var button = widgets.Widget({
id: "togetherjs-starter",
label: "Start TogetherJS",
contentURL: data.url("button.html"),
contentScriptFile: data.url("button.js"),
onClick: function () {
console.log("Starting TogetherJS because of click");
startTogetherJS();
},
width: 48
});
StartupPanel({
name: "TogetherJS",
contentURL: data.url("startup-help.html")
});
var autoDomains = [];
function updateAutoDomains() {
var domains = simplePrefs.prefs.autoDomains;
domains = domains.split(/,/g);
autoDomains = [];
domains.forEach(function (item) {
if (item.search(/^\s*$/) === 0) {
return;
}
item = item.replace(/^\s+/, "").replace(/\s+$/, "");
item = item.split(/;/);
var domain = item[0];
var shareId = item[1] || null;
if (domain.indexOf("//") == -1) {
// Just a plain domain
domain = "^https?:\\/\\/" + domain;
}
domain = new RegExp(domain, "i");
autoDomains.push({domain: domain, shareId: shareId});
});
}
simplePrefs.on("autoDomains", updateAutoDomains);
updateAutoDomains();
function startTogetherJS(shareId) {
var tab = tabs.activeTab;
if (tab.togetherjsCloser) {
tab.togetherjsCloser();
return;
}
tab.togetherjsCloser = function () {
tab.togetherjsCloser = null;
button.port.emit("TogetherJSOff");
tab.removeListener("ready", attachWorker);
};
var worker;
function attachWorker() {
worker = tab.attach({
contentScriptFile: [
data.url("attachment.js")
]
});
worker.port.on("Close", function () {
tab.togetherjsCloser();
});
worker.port.emit("Config", {url: simplePrefs.prefs.togetherjsJs, hubBase: simplePrefs.prefs.hubBase, shareId: shareId || null});
}
button.port.emit("TogetherJSOn");
tab.on("ready", attachWorker);
attachWorker();
}
// Need poll for back button code
tabs.on("open", watchTab);
function watchTab(tab) {
tab.on("ready", function () {
if (tabs.activeTab == tab && tab.url.indexOf("#&togetherjs") != -1) {
console.log("Starting TogetherJS on share link", tab.url);
startTogetherJS();
}
if (tabs.activeTab == tab && ! tab.togetherjsCloser) {
var started = false;
autoDomains.forEach(function (matcher) {
console.log("matcher", matcher, matcher.domain);
if ((! started) && tab.url.search(matcher.domain) != -1) {
console.log("Start TogetherJS autoDomain");
startTogetherJS(matcher.shareId);
started = true;
}
});
}
});
}
for (var i=0; i<tabs.length; i++) {
watchTab(tabs[i]);
}
tabs.on("activate", function () {
if (tabs.activeTab.togetherjsCloser) {
button.port.emit("TogetherJSOn");
} else {
button.port.emit("TogetherJSOff");
}
});
================================================
FILE: addon/lib/startup-panel.js
================================================
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
// Shows a panel (typically describing the addon) the first time an addon is installed.
const { Panel } = require("panel");
const ss = require("simple-storage");
const { setTimeout } = require("timers");
const { publicConstructor } = require("api-utils");
const { env } = require('api-utils/environment');
const self = require("self");
// Show panel 1 second after startup:
var DEFAULT_TIMEOUT = 1000;
function StartupPanel(options) {
this.name = options.name;
if (! this.name) {
throw 'You must give the panel a name';
}
options.width = options.width || 400;
options.height = options.height || 400;
// FIXME: should append this if necessary:
options.contentScript = SCRIPT;
this.options = options;
var seen = ss.storage[this.name + '-seen'];
if (env.SHOW_STARTUP_PANEL) {
// Primarily for development/testing
seen = false;
}
if (self.loadReason == "install" || self.loadReason == "enable") {
// Re-installed or re-enabled:
seen = false;
}
if (! seen) {
setTimeout(this.display.bind(this), options.startupTimeout || DEFAULT_TIMEOUT);
}
};
StartupPanel.prototype = {
display: function () {
this.panel = Panel(this.options);
this.panel.on("hide", (function () {
ss.storage[this.name + '-seen'] = true;
}).bind(this));
this.panel.port.on("Close", (function () {
this.panel.hide();
}).bind(this));
this.panel.show();
}
};
var SCRIPT = [
'window.addEventListener("load", function () {',
' var el = document.getElementById("close");',
' if (! el) {',
' el = document.createElement("A");',
' el.innerHTML = "×";',
' el.href = "#";',
' el.setAttribute("style", "position: absolute; font-weight: bold; top: 2px; right: 6px; text-decoration: none; color: #000;");',
' document.body.appendChild(el);',
' }',
' el.addEventListener("click", function () {',
' self.port.emit("Close");',
' }, false);',
'}, false);'
].join("\n");
exports.StartupPanel = publicConstructor(StartupPanel);
================================================
FILE: addon/package.json
================================================
{
"preferences": [
{
"title": "togetherjs.js location",
"type": "string",
"description": "This is where to find the script to inject",
"value": "https://togetherjs.com/togetherjs.js",
"name": "togetherjsJs"
},
{
"title": "Hub URL",
"type": "string",
"description": "Override the location of the hub",
"value": "https://hub.togetherjs.com",
"name": "hubBase"
},
{
"title": "Auto domains",
"type": "string",
"description": "Domains on which to automatically start TogetherJS (comma-separated)",
"value": "",
"name": "autoDomains"
}
],
"license": "MPL 2.0",
"author": "",
"description": "Runs TogetherJS",
"version": "0.1",
"fullName": "TogetherJS",
"id": "jid1-9cBzV13kcAXp8A",
"name": "togetherjs"
}
================================================
FILE: client
================================================
================================================
FILE: devserver.js
================================================
var
http = require("http"),
url = require("url"),
path = require("path"),
fs = require("fs"),
port = process.argv[2] || process.env['PORT'] || 8080;
http.createServer(function(request, response) {
var uri = url.parse(request.url).pathname
var filename = path.join(process.cwd(), 'build', uri);
fs.exists(filename, function(exists) {
if(!exists) {
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 Not Found\n");
response.end();
return;
}
if (fs.statSync(filename).isDirectory()) filename += '/index.html';
fs.readFile(filename, "binary", function(err, file) {
if(err) {
response.writeHead(500, {"Content-Type": "text/plain"});
response.write(err + "\n");
response.end();
return;
}
response.writeHead(200);
response.write(file, "binary");
response.end();
});
});
}).listen(parseInt(port, 10));
console.log("Static file server running at\n => http://localhost:" + port + "/\nCTRL + C to shutdown");
================================================
FILE: hub/server.js
================================================
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
// New Relic Server monitoring support
if ( process.env.NEW_RELIC_HOME ) {
require("newrelic");
}
var SAMPLE_STATS_INTERVAL = 60*1000; // 1 minute
var SAMPLE_LOAD_INTERVAL = 5*60*1000; // 5 minutes
var EMPTY_ROOM_LOG_TIMEOUT = 3*60*1000; // 3 minutes
var WEBSOCKET_COMPAT = true;
var WebSocketServer = WEBSOCKET_COMPAT ?
require("./websocket-compat").server :
require("websocket").server;
var http = require('http');
var parseUrl = require('url').parse;
var fs = require('fs');
// FIXME: not sure what logger to use
//var logger = require('../../lib/logger');
// LOG_LEVEL values:
// 0: show everything (including debug)
// 1: don't show debug, do show logger.log
// 2: don't show logger.log and debug, do show logger.info (and STATS)
// 3: don't show info, do show warn
// 4: don't show warn, do show error
// 5: don't show anything
// Stats are at level 2
var thisSource = "// What follows is the source for the server.\n" +
"// Obviously we can't prove this is the actual source, but if it isn't then we're \n" +
"// a bunch of lying liars, so at least you have us on record.\n\n" +
fs.readFileSync(__filename);
var Logger = function (level, filename, stdout) {
this.level = level;
this.filename = filename;
this.stdout = !!stdout;
this._open();
process.on("SIGUSR2", (function () {
this._open();
}).bind(this));
};
Logger.prototype = {
write: function () {
if (this.stdout) {
console.log.apply(console, arguments);
}
if (this.file) {
var s = [];
for (var i=0; i<arguments.length; i++) {
var a = arguments[i];
if (typeof a == "string") {
s.push(a);
} else {
s.push(JSON.stringify(a));
}
}
s = s.join(" ") + "\n";
this.file.write(this.date() + " " + s);
}
},
date: function () {
return (new Date()).toISOString();
},
_open: function () {
if (this.file) {
this.file.end(this.date() + " Logs rotating\n");
this.file = null;
}
if (this.filename) {
this.file = fs.createWriteStream(this.filename, {flags: 'a', mode: parseInt('644', 8), encoding: "UTF-8"});
}
}
};
[["error", 4], ["warn", 3], ["info", 2], ["log", 1], ["debug", 0]].forEach(function (nameLevel) {
var name = nameLevel[0];
var level = nameLevel[1];
Logger.prototype[name] = function () {
if (logLevel <= level) {
if (name != "log") {
this.write.apply(this, [name.toUpperCase()].concat(Array.prototype.slice.call(arguments)));
} else {
this.write.apply(this, arguments);
}
}
};
});
var logger = new Logger(0, null, true);
var server = http.createServer(function(request, response) {
var url = parseUrl(request.url, true);
var protocol = request.headers["forwarded-proto"] || "http:";
var host = request.headers.host;
var base = protocol + "//" + host;
if (url.pathname == '/status') {
response.end("OK");
} else if (url.pathname == '/load') {
var load = getLoad();
response.writeHead(200, {"Content-Type": "text/plain"});
response.end("OK " + load.connections + " connections " +
load.sessions + " sessions; " +
load.solo + " are single-user and " +
(load.sessions - load.solo) + " active sessions");
} else if (url.pathname == '/server-source') {
response.writeHead(200, {"Content-Type": "text/plain"});
response.end(thisSource);
} else if (url.pathname == '/findroom') {
if (request.method == "OPTIONS") {
// CORS preflight
corsAccept(request, response);
return;
}
var prefix = url.query.prefix;
var max = parseInt(url.query.max, 10);
if (! (prefix && max)) {
write400("You must include a valid prefix=CHARS&max=NUM portion of the URL", response);
return;
}
if (prefix.search(/[^a-zA-Z0-9]/) != -1) {
write400("Invalid prefix", response);
return;
}
findRoom(prefix, max, response);
} else {
write404(response);
}
});
function corsAccept(request, response) {
response.writeHead(200, {
"Access-Control-Allow-Origin": "*"
});
response.end();
}
function write500(error, response) {
response.writeHead(500, {"Content-Type": "text/plain"});
if (typeof error != "string") {
error = "\n" + JSON.stringify(error, null, " ");
}
response.end("Error: " + error);
}
function write404(response) {
response.writeHead(404, {"Content-Type": "text/plain"});
response.end("Resource not found");
}
function write400(error, response) {
response.writeHead(400, {"Content-Type": "text/plain", "Access-Control-Allow-Origin": "*"});
response.end("Bad request: " + error);
}
function findRoom(prefix, max, response) {
response.writeHead(200, {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*"
});
var smallestNumber;
var smallestRooms = [];
for (var candidate in allConnections) {
if (candidate.indexOf(prefix + "__") === 0) {
var count = allConnections[candidate].length;
if (count < max && (smallestNumber === undefined || count <= smallestNumber)) {
if (smallestNumber === undefined || count < smallestNumber) {
smallestNumber = count;
smallestRooms = [candidate];
} else {
smallestRooms.push(candidate);
}
}
}
}
var room;
if (! smallestRooms.length) {
room = prefix + "__" + generateId();
} else {
room = pickRandom(smallestRooms);
}
response.end(JSON.stringify({name: room}));
}
function generateId(length) {
length = length || 10;
var letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV0123456789';
var s = '';
for (var i=0; i<length; i++) {
s += letters.charAt(Math.floor(Math.random() * letters.length));
}
return s;
}
function pickRandom(seq) {
return seq[Math.floor(Math.random() * seq.length)];
}
function startServer(port, host) {
server.listen(port, host, function() {
logger.info('HUB Server listening on port ' + port + " interface: " + host + " PID: " + process.pid);
});
}
var wsServer = new WebSocketServer({
httpServer: server,
// 10Mb max size (1Mb is default, maybe this bump is unnecessary)
maxReceivedMessageSize: 0x1000000,
// The browser doesn't seem to break things up into frames (not sure what this means)
// and the default of 64Kb was exceeded; raised to 1Mb
maxReceivedFrameSize: 0x100000,
// Using autoaccept because the origin is somewhat dynamic
// FIXME: make this smarter?
autoAcceptConnections: false
});
function originIsAllowed(origin) {
// Unfortunately the origin will be whatever page you are sharing,
// which could be any origin
return true;
}
var allConnections = {};
var connectionStats = {};
var ID = 0;
wsServer.on('request', function(request) {
if (!originIsAllowed(request.origin)) {
// Make sure we only accept requests from an allowed origin
request.reject();
logger.info('Connection from origin ' + request.origin + ' rejected.');
return;
}
var id = request.httpRequest.url.replace(/^\/+hub\/+/, '').replace(/\//g, "");
if (! id) {
request.reject(404, 'No ID Found');
return;
}
// FIXME: we should use a protocol here instead of null, but I can't
// get it to work. "Protocol" is what the two clients are using
// this channel for (we don't bother to specify this)
var connection = request.accept(null, request.origin);
connection.ID = ID++;
if (! allConnections[id]) {
allConnections[id] = [];
connectionStats[id] = {
created: Date.now(),
sample: [],
clients: {},
domains: {},
urls: {},
firstDomain: null,
totalMessageChars: 0,
totalMessages: 0,
connections: 0
};
}
allConnections[id].push(connection);
connectionStats[id].connections++;
connectionStats[id].lastLeft = null;
logger.debug('Connection accepted to ' + JSON.stringify(id) + ' ID:' + connection.ID);
connection.sendUTF(JSON.stringify({
type: "init-connection",
peerCount: allConnections[id].length-1
}));
connection.on('message', function(message) {
var parsed;
try {
parsed = JSON.parse(message.utf8Data);
} catch (e) {
logger.warn('Error parsing JSON: ' + JSON.stringify(message.utf8Data) + ": " + e);
return;
}
connectionStats[id].clients[parsed.clientId] = true;
var domain = null;
if (parsed.url) {
domain = parseUrl(parsed.url).hostname;
connectionStats[id].urls[parsed.url] = true;
}
if ((! connectionStats[id].firstDomain) && domain) {
connectionStats[id].firstDomain = domain;
}
connectionStats[id].domains[domain] = true;
connectionStats[id].totalMessageChars += message.utf8Data.length;
connectionStats[id].totalMessages++;
logger.debug('Message on ' + id + ' bytes: ' +
(message.utf8Data && message.utf8Data.length) +
' conn ID: ' + connection.ID + ' data:' + message.utf8Data.substr(0, 20) +
' connections: ' + allConnections[id].length);
for (var i=0; i<allConnections[id].length; i++) {
var c = allConnections[id][i];
if (c == connection && !parsed["server-echo"]) {
continue;
}
if (message.type === 'utf8') {
c.sendUTF(message.utf8Data);
} else if (message.type === 'binary') {
c.sendBytes(message.binaryData);
}
}
});
connection.on('close', function(reasonCode, description) {
if (! allConnections[id]) {
// Got cleaned up entirely, somehow?
logger.info("Connection ID", id, "was cleaned up entirely before last connection closed");
return;
}
var index = allConnections[id].indexOf(connection);
if (index != -1) {
allConnections[id].splice(index, 1);
}
if (! allConnections[id].length) {
delete allConnections[id];
connectionStats[id].lastLeft = Date.now();
}
logger.debug('Peer ' + connection.remoteAddress + ' disconnected, ID: ' + connection.ID);
});
});
setInterval(function () {
for (var id in connectionStats) {
if (connectionStats[id].lastLeft && Date.now() - connectionStats[id].lastLeft > EMPTY_ROOM_LOG_TIMEOUT) {
logStats(id, connectionStats[id]);
delete connectionStats[id];
continue;
}
var totalClients = countClients(connectionStats[id].clients);
var connections = 0;
if (allConnections[id]) {
connections = allConnections[id].length;
}
connectionStats[id].sample.push({
time: Date.now(),
totalClients: totalClients,
connections: connections
});
}
}, SAMPLE_STATS_INTERVAL);
setInterval(function () {
var load = getLoad();
load.time = Date.now();
logger.info("LOAD", JSON.stringify(load));
}, SAMPLE_LOAD_INTERVAL);
function getLoad() {
var sessions = 0;
var connections = 0;
var empty = 0;
var solo = 0;
for (var id in allConnections) {
if (allConnections[id].length) {
sessions++;
connections += allConnections[id].length;
if (allConnections[id].length == 1) {
solo++;
}
} else {
empty++;
}
}
return {
sessions: sessions,
connections: connections,
empty: empty,
solo: solo
};
}
function countClients(clients) {
var n = 0;
for (var clientId in clients) {
n++;
}
return n;
}
function logStats(id, stats) {
logger.info("STATS", JSON.stringify({
id: id,
created: stats.created,
sample: stats.sample,
totalClients: countClients(stats.clients),
totalMessageChars: stats.totalMessageChars,
totalMessages: stats.totalMessages,
domain: stats.firstDomain || null,
domainCount: countClients(stats.domains),
urls: countClients(stats.urls)
}));
}
if (require.main == module) {
var ops = require('optimist')
.usage("Usage: $0 [--port 8080] [--host=localhost] [--log=filename] [--log-level=N]")
.describe("port", "The port to server on (default $HUB_SERVER_PORT, $PORT, $VCAP_APP_PORT, or 8080")
.describe("host", "The interface to serve on (default $HUB_SERVER_HOST, $HOST, $VCAP_APP_HOST, 127.0.0.1). Use 0.0.0.0 to make it public")
.describe("log-level", "The level of logging to do, from 0 (very verbose) to 5 (nothing) (default $LOG_LEVEL or 0)")
.describe("log", "A file to log to (default $LOG_FILE or stdout)")
.describe("stdout", "Log to both stdout and the log file");
var port = ops.argv.port || process.env.HUB_SERVER_PORT || process.env.VCAP_APP_PORT ||
process.env.PORT || 8080;
var host = ops.argv.host || process.env.HUB_SERVER_HOST || process.env.VCAP_APP_HOST ||
process.env.HOST || '127.0.0.1';
var logLevel = process.env.LOG_LEVEL || 0;
var logFile = process.env.LOG_FILE || ops.argv.log;
var stdout = ops.argv.stdout || !logFile;
if (ops.argv['log-level']) {
logLevel = parseInt(ops.argv['log-level'], 10);
}
logger = new Logger(logLevel, logFile, stdout);
if (ops.argv.h || ops.argv.help) {
console.log(ops.help());
process.exit();
} else {
startServer(port, host);
}
}
exports.startServer = startServer;
================================================
FILE: hub/websocket-compat.js
================================================
/*
* A hacked websocket module which retains compatibility with the old
* Hixie-76 version of the standard, needed for phantom JS (and,
* presumably, very old browsers).
*
* This file released into the public domain
* by C. Scott Ananian <cscott@cscott.net> 2014-08-26
*
* Based on https://gist.github.com/toshirot/1428579
*/
var events = require("events");
var util = require("util");
var WebSocketRequest = require('websocket').request;
var WebSocketServer = require('websocket').server;
// Copy helpers from WebSocketServer to WebSocketRequest
WebSocketRequest.prototype.connections = [];
WebSocketRequest.prototype.handleRequestAccepted =
WebSocketServer.prototype.handleRequestAccepted;
WebSocketRequest.prototype.handleConnectionClose =
WebSocketServer.prototype.handleConnectionClose;
WebSocketRequest.prototype.broadcastUTF =
WebSocketServer.prototype.broadcastUTF;
var miksagoServerFactory = require('websocket-server');
var miksagoConnection = require('../node_modules/websocket-server/lib/ws/connection');
var CompatWebSocketServer = function(options) {
events.EventEmitter.call(this); // superclass constructor
var self = this;
var handleConnection;
// node-websocket-server (hixie-75 and hixie-76 support)
var miksagoServer = miksagoServerFactory.createServer();
miksagoServer.server = options.httpServer;
miksagoServer.addListener('connection', function(connection) {
// Add remoteAddress property
connection.remoteAddress = connection._socket.remoteAddress;
// We want to use "sendUTF" regardless of the server implementation
connection.sendUTF = connection.send;
handleConnection(connection);
});
// WebSocket-Node config (modern websocket support)
var wsServerConfig = {
// All options *except* 'httpServer' are required when bypassing
// WebSocketServer.
maxReceivedFrameSize: options.maxReceivedFrameSize || 0x10000,
maxReceivedMessageSize: options.maxReceivedMessageSize || 0x100000,
fragmentOutgoingMessages: true,
fragmentationThreshold: 0x4000,
keepalive: true,
keepaliveInterval: 20000,
assembleFragments: true,
// autoAcceptConnections is not applicable when bypassing WebSocketServer
// autoAcceptConnections: false,
disableNagleAlgorithm: true,
closeTimeout: 5000
};
// Handle the upgrade event ourselves instead of using WebSocketServer
var wsRequest={};
options.httpServer.on('upgrade', function(req, socket, head) {
if (typeof req.headers['sec-websocket-version'] !== 'undefined') {
// WebSocket hybi-08/-09/-10 connection (WebSocket-Node)
wsRequest = new WebSocketRequest(socket, req, wsServerConfig);
try {
wsRequest.readHandshake();
} catch (e) {
wsRequest.reject(
e.httpCode ? e.httpCode : 400,
e.message,
e.headers
);
return;
}
wsRequest.once('requestAccepted', function(connection) {
wsRequest.handleRequestAccepted(connection);
});
self.emit('request', wsRequest);
} else {
// WebSocket hixie-75/-76/hybi-00 connection (node-websocket-server)
if (req.method === 'GET' &&
(req.headers.upgrade && req.headers.connection) &&
req.headers.upgrade.toLowerCase() === 'websocket' &&
req.headers.connection.toLowerCase() === 'upgrade') {
new miksagoConnection(
miksagoServer.manager, miksagoServer.options, req, socket, head
);
}
}
});
// A connection handler for old-style websockets
handleConnection = function(connection) {
// fake a request
self.emit('request', new CompatRequest(self, connection));
};
};
util.inherits(CompatWebSocketServer, events.EventEmitter);
var CompatRequest = function(server, connection) {
this._server = server;
this._connection = connection;
this.origin = connection._options.origin || '*';
this.httpRequest = connection._req;
// create wrapper right away in order to install event handlers promptly
this._connectionWrapper = new CompatConnection(server, connection);
};
CompatRequest.prototype.reject = function(code, message) {
this._connection.reject(message || "no reason");
};
CompatRequest.prototype.accept = function(proto, origin) {
// this is faked: we've already accepted the connection
return this._connectionWrapper;
};
var CompatConnection = function(server, connection) {
var self = this;
events.EventEmitter.call(this); // superclass constructor
this._server = server;
this._connection = connection;
this.remoteAddress = connection.remoteAddress;
connection.addListener('message', function(wsMessage) {
// make the argument compatible with WebSocket-Node
self.emit('message', {
type: 'utf8',
utf8Data: wsMessage
});
});
connection.addListener('close', function() {
self.emit('close');
});
};
util.inherits(CompatConnection, events.EventEmitter);
CompatConnection.prototype.sendUTF = function(message) {
return this._connection.sendUTF(message);
};
module.exports.server = CompatWebSocketServer;
================================================
FILE: package.json
================================================
{
"name": "togetherjs",
"version": "0.4.0a",
"main": "hub/server.js",
"description": "Collaborative help system",
"keywords": [],
"repository": {
"type": "git",
"url": "https://github.com/mozilla/togetherjs.git"
},
"dependencies": {
"ejs": "~2.5.5",
"ejs-locals": "~1.0.2",
"express": "~3.0.6",
"grunt-amd-check": "~0.5.1",
"habitat": "~0.4.0",
"less": "~1.3.1",
"less-middleware": "~0.1.9",
"newrelic": "0.9.20",
"node-static": "~0.6.5",
"optimist": "~0.6.0",
"universal-analytics": "~0.1.3",
"websocket": "~1.0.7",
"websocket-server": "github:miksago/node-websocket-server#master",
"winston": "~0.6.2"
},
"devDependencies": {
"grunt-contrib-less": "~0.5.1",
"grunt-contrib-csslint": "~0.1.2",
"grunt-contrib-jshint": "~0.4.3",
"grunt-contrib-requirejs": "~0.4.1",
"grunt-contrib-watch": "~0.4.3",
"grunt": "~0.4.1",
"grunt-contrib-copy": "~0.4.1",
"grunt-http-server": "~0.0.5",
"nunjucks": "~0.1.8a",
"marked": "~0.3.4",
"docco": "~0.6.2",
"highlight.js": "~7.3.0",
"optimist": "~0.6.0",
"freeport": "~1.0.3",
"grunt-lib-phantomjs": "~0.6.0"
},
"engines": {
"node": "~0.12.7",
"npm": "^2.11.3"
},
"scripts": {
"start": "node hub/server.js",
"test": "grunt test"
}
}
================================================
FILE: phantomjs/bridge.js
================================================
(function (doctest) {
'use strict';
// Function.bind is not defined in phantomjs (!) so polyfill it
if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
if (typeof this !== "function") {
// closest thing possible to the ECMAScript 5
// internal IsCallable function
throw new TypeError("can't bind");
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function () {},
fBound = function () {
return fToBind.apply(this instanceof fNOP && oThis
? this
: oThis,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
}
// default phantomjs background is transparent
document.body.bgColor = 'white';
// Send messages to the parent PhantomJS process via alert! Good times!!
function sendMessage() {
var args = [].slice.call(arguments);
alert(JSON.stringify(args));
}
// doctestjs-specific stuff. First, be sure we don't autostart:
document.body.className = document.body.className.replace(/autodoctest/,'');
// Now define a custom reporter which will pass the results up to grunt
var PhantomReporter = function(runner) {
this.runner = runner;
};
PhantomReporter.prototype.logSuccess = function(example, got) {
this._send('doctestjs.pass', example, got);
};
PhantomReporter.prototype.logFailure = function(example, got) {
this._send('doctestjs.fail', example, got);
};
PhantomReporter.prototype._send = function(msg, example, got) {
sendMessage(msg, {
example: {
expr: example.expr,
summary: example.textSummary(),
expected: example.expected
},
got: got
});
};
// Start/finish the doctest runner.
window.doctestReporterHook = {
finish: function() {
sendMessage('doctestjs.end');
}
};
window.addEventListener('load', function() {
var runner = new doctest.Runner({
Reporter: PhantomReporter
});
var parser = new doctest.HTMLParser(runner);
parser.loadRemotes(function() {
runner.init();
parser.parse();
sendMessage('doctestjs.start');
runner.run();
});
});
})(window.doctest);
================================================
FILE: site/base.tmpl
================================================
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<title>{% block title %}
Mozilla Labs : TogetherJS
{% endblock %}</title>
<meta name="viewport" content="width=320, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
<meta name="description" content="Real time collaboration features for your website or app.">
<meta name="author" content="">
<link rel="shortcut icon" href="{{ base }}images/fav-icon.ico">
<!-- use this block to set togetherjs config -->
{% block configs %}{% endblock %}
<script src="{{ base }}js/jquery-1.10.2.min.js"></script>
<script src="{{ base }}js/bootstrap.min.js"></script>
<script src="{{ base }}js/parallax.js"></script>
<script src="{{ base }}js/custom.js"></script>
<script src="{{ base }}js/scrollTo.js"></script>
<script src="{{ base }}js/scrollspy.js"></script>
<script src="{{ base }}js/waypoints.min.js"></script>
<script src="{{ base }}js/how-animations.js"></script>
<script src="{{ base }}togetherjs.js"></script>
<!-- retina library -->
<script src="{{ base }}js/retina.js"></script>
<script src="//mozorg.cdn.mozilla.net/tabzilla/tabzilla.js"></script>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', '{{ GA_ACCOUNT }}']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<!-- Bootstrap core CSS -->
<link href="{{ base }}css/bootstrap.css" rel="stylesheet">
<link href="{{ base }}css/jumbotron.css" rel="stylesheet">
<link href="{{ base }}css/carousel.css" rel="stylesheet">
<link href="{{ base }}css/grid.css" rel="stylesheet">
<link href="{{ base }}css/style.css" rel="stylesheet">
<link href="//mozorg.cdn.mozilla.net/media/css/tabzilla-min.css" rel="stylesheet" />
{% block styles %}{% endblock %}
<!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js">
</script>
<![endif]-->
<!-- Le fav and touch icons -->
<link rel="shortcut icon" href="{{ base }}assets/ico/favicon.ico">
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ base }}assets/ico/apple-touch-icon-144-precomposed.png">
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="{{ base }}assets/ico/apple-touch-icon-114-precomposed.png">
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="{{ base }}assets/ico/apple-touch-icon-72-precomposed.png">
<link rel="apple-touch-icon-precomposed" href="{{ base }}assets/ico/apple-touch-icon-57-precomposed.png">
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-35433268-43', 'togetherjs.com');
ga('send', 'pageview');
</script>
</head>
<body {% block body_tag %}{% endblock %}>
<div class="navbar main-header" id="main-navbar">
<!-- Tabzilla -->
<a href="https://www.mozilla.org/" id="tabzilla">mozilla</a>
<!-- start container -->
<div class="container navbox">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand main-logo" href="{{base}}./"></a>
<a class="navbar-brand masthead-title" href="{{base}}./">TogetherJS</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right main-nav">
<li><a href="{{base}}./" {% if (enableHome) %}class="scrollnav active"{% endif %} >Overview</a></li>
<li><a class="documentationActive"href="{{base}}./docs/" {% if (enableMarkdown) %}class="scrollnav active"{% endif %} >Documentation</a></li>
<li><a href="https://github.com/mozilla/togetherjs" target="_blank">Github</a></li>
<li><a href="mailto:togetherjs@mozilla.com">Contact</a></li>
</ul>
</div><!--/.navbar-collapse -->
</div>
</div>
{% block body %}{% endblock %}
<hr>
<footer>
<section class="row" id="footer">
<div class="col-xs-12 col-sm-3 text-left">
<p><a href="https://mozillalabs.com/en-US/" target="_blank"><img src="{{ base }}images/footer-mozilla-labs.png"></a></p>
</div>
<div class="col-xs-12 col-sm-3">
<ul class="list-unstyled text-left">
<li class=""><a href="{{ base }}./" class="">Overview</a></li>
<li><a href="{{base}}./docs/" target="_blank">Docs</a></li>
<li class=""><a href="https://github.com/mozilla/togetherjs" target="_blank">GitHub</a></li>
<li class=""><a href="mailto:togetherjs@mozilla.com" target="_blank">Contact</a></li>
</ul>
</div>
<div class="col-xs-12 col-sm-3">
<ul class="list-unstyled text-left">
<li class=""><a href="https://mozillalabs.com/en-US/togetherjs/" target="_blank">About</a></li>
<li><a href="{{base}}./docs/contributing.html">Contributing</a></li>
<li><a href="{{ base }}source/">Source Code</a></li>
<li><a href="{{ base }}faq.html">FAQ</a></li>
<li class=""><a href="https://twitter.com/togetherjs" target="_blank">Twitter</a></li>
</ul>
</div>
<div class="col-xs-12 col-sm-3">
<ul class="list-unstyled text-left">
<li class=""><a href="https://www.mozilla.org/privacy/websites/" target="_blank">Privacy Policy</a></li>
<li class=""><a href="https://www.mozilla.org/about/legal/" target="_blank">Legal Notices</a></li>
<li class=""><a href="https://www.mozilla.org/legal/fraud-report/" target="_blank">Report Trademark Abuses</a></li>
<li class="ph-credit">Thanks to Yuan Wang for the cover photo!</li>
</ul>
</div>
</section>
</footer>
</section>
</div> <!-- /container -->
</body>
</html>
================================================
FILE: site/bookmarklet.html
================================================
{% extends "base.tmpl" %}
{% block title %}TogetherJS Bookmarklet{% endblock %}
{% block styles %}
<script>
function bookmarklet() {
var s = "window._TogetherJSBookmarklet = true;";
s += "s=document.createElement('script');";
s += "s.src=" + JSON.stringify(TogetherJS.baseUrl + "/togetherjs.js") + ";";
s += "document.head.appendChild(s);";
s = "(function () {" + s + "})();void(0)";
return "javascript:" + encodeURIComponent(s);
};
window.addEventListener("load", function () {
var el = document.getElementById("towtruck-bookmarklet");
el.href = bookmarklet();
}, false);
</script>
{% endblock %}
{% block body %}
<div class="container">
<h1>TogetherJS Bookmarklet</h1>
<p>
To use this bookmarklet, drag the button below to your bookmark toolbar:
</p>
<p>
<a id="towtruck-bookmarklet" class="button fade-half" href="#">Start TogetherJS</a>
</p>
</div>
{% endblock %}
================================================
FILE: site/css/bootstrap.css
================================================
/*!
* Bootstrap v3.0.0
*
* Copyright 2013 Twitter, Inc
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Designed and built with all the love in the world by @mdo and @fat.
*/
/*! normalize.css v2.1.0 | MIT License | git.io/normalize */
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
nav,
section,
summary {
display: block;
}
audio,
canvas,
video {
display: inline-block;
}
audio:not([controls]) {
display: none;
height: 0;
}
[hidden] {
display: none;
}
html {
font-family: sans-serif;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
body {
margin: 0;
}
a:focus {
outline: thin dotted;
}
a:active,
a:hover {
outline: 0;
}
h1 {
margin: 0.67em 0;
font-size: 2em;
}
abbr[title] {
border-bottom: 1px dotted;
}
b,
strong {
font-weight: bold;
}
dfn {
font-style: italic;
}
hr {
height: 0;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
mark {
color: #000;
background: #ff0;
}
code,
kbd,
pre,
samp {
font-family: monospace, serif;
font-size: 1em;
}
pre {
white-space: pre-wrap;
}
q {
quotes: "\201C" "\201D" "\2018" "\2019";
}
small {
font-size: 80%;
}
sub,
sup {
position: relative;
font-size: 75%;
line-height: 0;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
img {
border: 0;
}
svg:not(:root) {
overflow: hidden;
}
figure {
margin: 0;
}
fieldset {
padding: 0.35em 0.625em 0.75em;
margin: 0 2px;
border: 1px solid #c0c0c0;
}
legend {
padding: 0;
border: 0;
}
button,
input,
select,
textarea {
margin: 0;
font-family: inherit;
font-size: 100%;
}
button,
input {
line-height: normal;
}
button,
select {
text-transform: none;
}
button,
html input[type="button"],
input[type="reset"],
input[type="submit"] {
cursor: pointer;
-webkit-appearance: button;
}
button[disabled],
html input[disabled] {
cursor: default;
}
input[type="checkbox"],
input[type="radio"] {
padding: 0;
box-sizing: border-box;
}
input[type="search"] {
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
-webkit-appearance: textfield;
}
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
button::-moz-focus-inner,
input::-moz-focus-inner {
padding: 0;
border: 0;
}
textarea {
overflow: auto;
vertical-align: top;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
@media print {
* {
color: #000 !important;
text-shadow: none !important;
background: transparent !important;
box-shadow: none !important;
}
a,
a:visited {
text-decoration: underline;
}
a[href]:after {
content: " (" attr(href) ")";
}
abbr[title]:after {
content: " (" attr(title) ")";
}
.ir a:after,
a[href^="javascript:"]:after,
a[href^="#"]:after {
content: "";
}
pre,
blockquote {
border: 1px solid #999;
page-break-inside: avoid;
}
thead {
display: table-header-group;
}
tr,
img {
page-break-inside: avoid;
}
img {
max-width: 100% !important;
}
@page {
margin: 2cm .5cm;
}
p,
h2,
h3 {
orphans: 3;
widows: 3;
}
h2,
h3 {
page-break-after: avoid;
}
.navbar {
display: none;
}
.table td,
.table th {
background-color: #fff !important;
}
.btn > .caret,
.dropup > .btn > .caret {
border-top-color: #000 !important;
}
.label {
border: 1px solid #000;
}
.table {
border-collapse: collapse !important;
}
.table-bordered th,
.table-bordered td {
border: 1px solid #ddd !important;
}
}
*,
*:before,
*:after {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
html {
font-size: 62.5%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
body {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
line-height: 1.428571429;
color: #333333;
background-color: #ffffff;
}
input,
button,
select,
textarea {
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
input,
select[multiple],
textarea {
background-image: none;
}
a {
color: #428bca;
text-decoration: none;
}
a:hover,
a:focus {
color: #2a6496;
text-decoration: underline;
}
a:focus {
outline: thin dotted #333;
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
img {
vertical-align: middle;
}
.img-responsive {
display: block;
height: auto;
max-width: 100%;
}
.img-rounded {
border-radius: 6px;
}
.img-circle {
border-radius: 50%;
}
hr {
margin-top: 20px;
margin-bottom: 20px;
border: 0;
border-top: 1px solid #eeeeee;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0 0 0 0);
border: 0;
}
p {
margin: 0 0 10px;
}
.lead {
margin-bottom: 20px;
font-size: 16.099999999999998px;
font-weight: 200;
line-height: 1.4;
}
@media (min-width: 768px) {
.lead {
font-size: 21px;
}
}
small {
font-size: 85%;
}
cite {
font-style: normal;
}
.text-muted {
color: #999999;
}
.text-primary {
color: #428bca;
}
.text-warning {
color: #c09853;
}
.text-danger {
color: #b94a48;
}
.text-success {
color: #468847;
}
.text-info {
color: #3a87ad;
}
.text-left {
text-align: left;
}
.text-right {
text-align: right;
}
.text-center {
text-align: center;
}
h1,
h2,
h3,
h4,
h5,
h6,
.h1,
.h2,
.h3,
.h4,
.h5,
.h6 {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-weight: 500;
line-height: 1.1;
}
h1 small,
h2 small,
h3 small,
h4 small,
h5 small,
h6 small,
.h1 small,
.h2 small,
.h3 small,
.h4 small,
.h5 small,
.h6 small {
font-weight: normal;
line-height: 1;
color: #999999;
}
h1,
h2,
h3 {
margin-top: 20px;
margin-bottom: 10px;
}
h4,
h5,
h6 {
margin-top: 10px;
margin-bottom: 10px;
}
h1,
.h1 {
font-size: 38px;
}
h2,
.h2 {
font-size: 32px;
}
h3,
.h3 {
font-size: 24px;
}
h4,
.h4 {
font-size: 18px;
}
h5,
.h5 {
font-size: 14px;
}
h6,
.h6 {
font-size: 12px;
}
h1 small,
.h1 small {
font-size: 24px;
}
h2 small,
.h2 small {
font-size: 18px;
}
h3 small,
.h3 small,
h4 small,
.h4 small {
font-size: 14px;
}
.page-header {
padding-bottom: 9px;
margin: 40px 0 20px;
border-bottom: 1px solid #eeeeee;
}
ul,
ol {
margin-top: 0;
margin-bottom: 10px;
}
ul ul,
ol ul,
ul ol,
ol ol {
margin-bottom: 0;
}
.list-unstyled {
padding-left: 0;
list-style: none;
}
.list-inline {
padding-left: 0;
list-style: none;
}
.list-inline > li {
display: inline-block;
padding-right: 5px;
padding-left: 5px;
}
dl {
margin-bottom: 20px;
}
dt,
dd {
line-height: 1.428571429;
}
dt {
font-weight: bold;
}
dd {
margin-left: 0;
}
@media (min-width: 768px) {
.dl-horizontal dt {
float: left;
width: 160px;
overflow: hidden;
clear: left;
text-align: right;
text-overflow: ellipsis;
white-space: nowrap;
}
.dl-horizontal dd {
margin-left: 180px;
}
.dl-horizontal dd:before,
.dl-horizontal dd:after {
display: table;
content: " ";
}
.dl-horizontal dd:after {
clear: both;
}
.dl-horizontal dd:before,
.dl-horizontal dd:after {
display: table;
content: " ";
}
.dl-horizontal dd:after {
clear: both;
}
}
abbr[title],
abbr[data-original-title] {
cursor: help;
border-bottom: 1px dotted #999999;
}
abbr.initialism {
font-size: 90%;
text-transform: uppercase;
}
blockquote {
padding: 10px 20px;
margin: 0 0 20px;
border-left: 5px solid #eeeeee;
}
blockquote p {
font-size: 17.5px;
font-weight: 300;
line-height: 1.25;
}
blockquote p:last-child {
margin-bottom: 0;
}
blockquote small {
display: block;
line-height: 1.428571429;
color: #999999;
}
blockquote small:before {
content: '\2014 \00A0';
}
blockquote.pull-right {
padding-right: 15px;
padding-left: 0;
border-right: 5px solid #eeeeee;
border-left: 0;
}
blockquote.pull-right p,
blockquote.pull-right small {
text-align: right;
}
blockquote.pull-right small:before {
content: '';
}
blockquote.pull-right small:after {
content: '\00A0 \2014';
}
q:before,
q:after,
blockquote:before,
blockquote:after {
content: "";
}
address {
display: block;
margin-bottom: 20px;
font-style: normal;
line-height: 1.428571429;
}
code,
pre {
font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
}
code {
padding: 2px 4px;
font-size: 90%;
color: #c7254e;
white-space: nowrap;
background-color: #f9f2f4;
border-radius: 4px;
}
pre {
display: block;
padding: 9.5px;
margin: 0 0 10px;
font-size: 13px;
line-height: 1.428571429;
color: #333333;
word-break: break-all;
word-wrap: break-word;
background-color: #f5f5f5;
border: 1px solid #cccccc;
border-radius: 4px;
}
pre.prettyprint {
margin-bottom: 20px;
}
pre code {
padding: 0;
font-size: inherit;
color: inherit;
white-space: pre-wrap;
background-color: transparent;
border: 0;
}
.pre-scrollable {
max-height: 340px;
overflow-y: scroll;
}
.container {
margin-right: auto;
margin-left: auto;
}
.container:before,
.container:after {
display: table;
content: " ";
}
.container:after {
clear: both;
}
.container:before,
.container:after {
display: table;
content: " ";
}
.container:after {
clear: both;
}
.row:before,
.row:after {
display: table;
content: " ";
}
.row:after {
clear: both;
}
.row:before,
.row:after {
display: table;
content: " ";
}
.row:after {
clear: both;
}
@media (min-width: 768px) {
.container .row {
margin-right: -15px;
margin-left: -15px;
}
}
.row .row {
margin-right: -15px;
margin-left: -15px;
}
.col-xs-1,
.col-xs-2,
.col-xs-3,
.col-xs-4,
.col-xs-5,
.col-xs-6,
.col-xs-7,
.col-xs-8,
.col-xs-9,
.col-xs-10,
.col-xs-11,
.col-xs-12,
.col-sm-1,
.col-sm-2,
.col-sm-3,
.col-sm-4,
.col-sm-5,
.col-sm-6,
.col-sm-7,
.col-sm-8,
.col-sm-9,
.col-sm-10,
.col-sm-11,
.col-sm-12,
.col-md-1,
.col-md-2,
.col-md-3,
.col-md-4,
.col-md-5,
.col-md-6,
.col-md-7,
.col-md-8,
.col-md-9,
.col-md-10,
.col-md-11,
.col-md-12,
.col-lg-1,
.col-lg-2,
.col-lg-3,
.col-lg-4,
.col-lg-5,
.col-lg-6,
.col-lg-7,
.col-lg-8,
.col-lg-9,
.col-lg-10,
.col-lg-11,
.col-lg-12 {
position: relative;
min-height: 1px;
padding-right: 15px;
padding-left: 15px;
}
.col-xs-1,
.col-xs-2,
.col-xs-3,
.col-xs-4,
.col-xs-5,
.col-xs-6,
.col-xs-7,
.col-xs-8,
.col-xs-9,
.col-xs-10,
.col-xs-11 {
float: left;
}
.col-xs-1 {
width: 8.333333333333332%;
}
.col-xs-2 {
width: 16.666666666666664%;
}
.col-xs-3 {
width: 25%;
}
.col-xs-4 {
width: 33.33333333333333%;
}
.col-xs-5 {
width: 41.66666666666667%;
}
.col-xs-6 {
width: 50%;
}
.col-xs-7 {
width: 58.333333333333336%;
}
.col-xs-8 {
width: 66.66666666666666%;
}
.col-xs-9 {
width: 75%;
}
.col-xs-10 {
width: 83.33333333333334%;
}
.col-xs-11 {
width: 91.66666666666666%;
}
.col-xs-12 {
width: 100%;
}
@media (min-width: 768px) {
.container {
max-width: 720px;
}
.col-sm-1,
.col-sm-2,
.col-sm-3,
.col-sm-4,
.col-sm-5,
.col-sm-6,
.col-sm-7,
.col-sm-8,
.col-sm-9,
.col-sm-10,
.col-sm-11 {
float: left;
}
.col-sm-1 {
width: 8.333333333333332%;
}
.col-sm-2 {
width: 16.666666666666664%;
}
.col-sm-3 {
width: 25%;
}
.col-sm-4 {
width: 33.33333333333333%;
}
.col-sm-5 {
width: 41.66666666666667%;
}
.col-sm-6 {
width: 50%;
}
.col-sm-7 {
width: 58.333333333333336%;
}
.col-sm-8 {
width: 66.66666666666666%;
}
.col-sm-9 {
width: 75%;
}
.col-sm-10 {
width: 83.33333333333334%;
}
.col-sm-11 {
width: 91.66666666666666%;
}
.col-sm-12 {
width: 100%;
}
.col-sm-push-1 {
left: 8.333333333333332%;
}
.col-sm-push-2 {
left: 16.666666666666664%;
}
.col-sm-push-3 {
left: 25%;
}
.col-sm-push-4 {
left: 33.33333333333333%;
}
.col-sm-push-5 {
left: 41.66666666666667%;
}
.col-sm-push-6 {
left: 50%;
}
.col-sm-push-7 {
left: 58.333333333333336%;
}
.col-sm-push-8 {
left: 66.66666666666666%;
}
.col-sm-push-9 {
left: 75%;
}
.col-sm-push-10 {
left: 83.33333333333334%;
}
.col-sm-push-11 {
left: 91.66666666666666%;
}
.col-sm-pull-1 {
right: 8.333333333333332%;
}
.col-sm-pull-2 {
right: 16.666666666666664%;
}
.col-sm-pull-3 {
right: 25%;
}
.col-sm-pull-4 {
right: 33.33333333333333%;
}
.col-sm-pull-5 {
right: 41.66666666666667%;
}
.col-sm-pull-6 {
right: 50%;
}
.col-sm-pull-7 {
right: 58.333333333333336%;
}
.col-sm-pull-8 {
right: 66.66666666666666%;
}
.col-sm-pull-9 {
right: 75%;
}
.col-sm-pull-10 {
right: 83.33333333333334%;
}
.col-sm-pull-11 {
right: 91.66666666666666%;
}
.col-sm-offset-1 {
margin-left: 8.333333333333332%;
}
.col-sm-offset-2 {
margin-left: 16.666666666666664%;
}
.col-sm-offset-3 {
margin-left: 25%;
}
.col-sm-offset-4 {
margin-left: 33.33333333333333%;
}
.col-sm-offset-5 {
margin-left: 41.66666666666667%;
}
.col-sm-offset-6 {
margin-left: 50%;
}
.col-sm-offset-7 {
margin-left: 58.333333333333336%;
}
.col-sm-offset-8 {
margin-left: 66.66666666666666%;
}
.col-sm-offset-9 {
margin-left: 75%;
}
.col-sm-offset-10 {
margin-left: 83.33333333333334%;
}
.col-sm-offset-11 {
margin-left: 91.66666666666666%;
}
}
@media (min-width: 992px) {
.container {
max-width: 940px;
}
.col-md-1,
.col-md-2,
.col-md-3,
.col-md-4,
.col-md-5,
.col-md-6,
.col-md-7,
.col-md-8,
.col-md-9,
.col-md-10,
.col-md-11 {
float: left;
}
.col-md-1 {
width: 8.333333333333332%;
}
.col-md-2 {
width: 16.666666666666664%;
}
.col-md-3 {
width: 25%;
}
.col-md-4 {
width: 33.33333333333333%;
}
.col-md-5 {
width: 41.66666666666667%;
}
.col-md-6 {
width: 50%;
}
.col-md-7 {
width: 58.333333333333336%;
}
.col-md-8 {
width: 66.66666666666666%;
}
.col-md-9 {
width: 75%;
}
.col-md-10 {
width: 83.33333333333334%;
}
.col-md-11 {
width: 91.66666666666666%;
}
.col-md-12 {
width: 100%;
}
.col-md-push-0 {
left: auto;
}
.col-md-push-1 {
left: 8.333333333333332%;
}
.col-md-push-2 {
left: 16.666666666666664%;
}
.col-md-push-3 {
left: 25%;
}
.col-md-push-4 {
left: 33.33333333333333%;
}
.col-md-push-5 {
left: 41.66666666666667%;
}
.col-md-push-6 {
left: 50%;
}
.col-md-push-7 {
left: 58.333333333333336%;
}
.col-md-push-8 {
left: 66.66666666666666%;
}
.col-md-push-9 {
left: 75%;
}
.col-md-push-10 {
left: 83.33333333333334%;
}
.col-md-push-11 {
left: 91.66666666666666%;
}
.col-md-pull-0 {
right: auto;
}
.col-md-pull-1 {
right: 8.333333333333332%;
}
.col-md-pull-2 {
right: 16.666666666666664%;
}
.col-md-pull-3 {
right: 25%;
}
.col-md-pull-4 {
right: 33.33333333333333%;
}
.col-md-pull-5 {
right: 41.66666666666667%;
}
.col-md-pull-6 {
right: 50%;
}
.col-md-pull-7 {
right: 58.333333333333336%;
}
.col-md-pull-8 {
right: 66.66666666666666%;
}
.col-md-pull-9 {
right: 75%;
}
.col-md-pull-10 {
right: 83.33333333333334%;
}
.col-md-pull-11 {
right: 91.66666666666666%;
}
.col-md-offset-0 {
margin-left: 0;
}
.col-md-offset-1 {
margin-left: 8.333333333333332%;
}
.col-md-offset-2 {
margin-left: 16.666666666666664%;
}
.col-md-offset-3 {
margin-left: 25%;
}
.col-md-offset-4 {
margin-left: 33.33333333333333%;
}
.col-md-offset-5 {
margin-left: 41.66666666666667%;
}
.col-md-offset-6 {
margin-left: 50%;
}
.col-md-offset-7 {
margin-left: 58.333333333333336%;
}
.col-md-offset-8 {
margin-left: 66.66666666666666%;
}
.col-md-offset-9 {
margin-left: 75%;
}
.col-md-offset-10 {
margin-left: 83.33333333333334%;
}
.col-md-offset-11 {
margin-left: 91.66666666666666%;
}
}
@media (min-width: 1200px) {
.container {
max-width: 1140px;
}
.col-lg-1,
.col-lg-2,
.col-lg-3,
.col-lg-4,
.col-lg-5,
.col-lg-6,
.col-lg-7,
.col-lg-8,
.col-lg-9,
.col-lg-10,
.col-lg-11 {
float: left;
}
.col-lg-1 {
width: 8.333333333333332%;
}
.col-lg-2 {
width: 16.666666666666664%;
}
.col-lg-3 {
width: 25%;
}
.col-lg-4 {
width: 33.33333333333333%;
}
.col-lg-5 {
width: 41.66666666666667%;
}
.col-lg-6 {
width: 50%;
}
.col-lg-7 {
width: 58.333333333333336%;
}
.col-lg-8 {
width: 66.66666666666666%;
}
.col-lg-9 {
width: 75%;
}
.col-lg-10 {
width: 83.33333333333334%;
}
.col-lg-11 {
width: 91.66666666666666%;
}
.col-lg-12 {
width: 100%;
}
.col-lg-push-0 {
left: auto;
}
.col-lg-push-1 {
left: 8.333333333333332%;
}
.col-lg-push-2 {
left: 16.666666666666664%;
}
.col-lg-push-3 {
left: 25%;
}
.col-lg-push-4 {
left: 33.33333333333333%;
}
.col-lg-push-5 {
left: 41.66666666666667%;
}
.col-lg-push-6 {
left: 50%;
}
.col-lg-push-7 {
left: 58.333333333333336%;
}
.col-lg-push-8 {
left: 66.66666666666666%;
}
.col-lg-push-9 {
left: 75%;
}
.col-lg-push-10 {
left: 83.33333333333334%;
}
.col-lg-push-11 {
left: 91.66666666666666%;
}
.col-lg-pull-0 {
right: auto;
}
.col-lg-pull-1 {
right: 8.333333333333332%;
}
.col-lg-pull-2 {
right: 16.666666666666664%;
}
.col-lg-pull-3 {
right: 25%;
}
.col-lg-pull-4 {
right: 33.33333333333333%;
}
.col-lg-pull-5 {
right: 41.66666666666667%;
}
.col-lg-pull-6 {
right: 50%;
}
.col-lg-pull-7 {
right: 58.333333333333336%;
}
.col-lg-pull-8 {
right: 66.66666666666666%;
}
.col-lg-pull-9 {
right: 75%;
}
.col-lg-pull-10 {
right: 83.33333333333334%;
}
.col-lg-pull-11 {
right: 91.66666666666666%;
}
.col-lg-offset-0 {
margin-left: 0;
}
.col-lg-offset-1 {
margin-left: 8.333333333333332%;
}
.col-lg-offset-2 {
margin-left: 16.666666666666664%;
}
.col-lg-offset-3 {
margin-left: 25%;
}
.col-lg-offset-4 {
margin-left: 33.33333333333333%;
}
.col-lg-offset-5 {
margin-left: 41.66666666666667%;
}
.col-lg-offset-6 {
margin-left: 50%;
}
.col-lg-offset-7 {
margin-left: 58.333333333333336%;
}
.col-lg-offset-8 {
margin-left: 66.66666666666666%;
}
.col-lg-offset-9 {
margin-left: 75%;
}
.col-lg-offset-10 {
margin-left: 83.33333333333334%;
}
.col-lg-offset-11 {
margin-left: 91.66666666666666%;
}
}
table {
max-width: 100%;
background-color: transparent;
}
th {
text-align: left;
}
.table {
width: 100%;
margin-bottom: 20px;
}
.table thead > tr > th,
.table tbody > tr > th,
.table tfoot > tr > th,
.table thead > tr > td,
.table tbody > tr > td,
.table tfoot > tr > td {
padding: 8px;
line-height: 1.428571429;
vertical-align: top;
border-top: 1px solid #dddddd;
}
.table thead > tr > th {
vertical-align: bottom;
}
.table caption + thead tr:first-child th,
.table colgroup + thead tr:first-child th,
.table thead:first-child tr:first-child th,
.table caption + thead tr:first-child td,
.table colgroup + thead tr:first-child td,
.table thead:first-child tr:first-child td {
border-top: 0;
}
.table tbody + tbody {
border-top: 2px solid #dddddd;
}
.table .table {
background-color: #ffffff;
}
.table-condensed thead > tr > th,
.table-condensed tbody > tr > th,
.table-condensed tfoot > tr > th,
.table-condensed thead > tr > td,
.table-condensed tbody > tr > td,
.table-condensed tfoot > tr > td {
padding: 5px;
}
.table-bordered {
border: 1px solid #dddddd;
}
.table-bordered > thead > tr > th,
.table-bordered > tbody > tr > th,
.table-bordered > tfoot > tr > th,
.table-bordered > thead > tr > td,
.table-bordered > tbody > tr > td,
.table-bordered > tfoot > tr > td {
border: 1px solid #dddddd;
}
.table-striped > tbody > tr:nth-child(odd) > td,
.table-striped > tbody > tr:nth-child(odd) > th {
background-color: #f9f9f9;
}
.table-hover > tbody > tr:hover > td,
.table-hover > tbody > tr:hover > th {
background-color: #f5f5f5;
}
table col[class^="col-"] {
display: table-column;
float: none;
}
table td[class^="col-"],
table th[class^="col-"] {
display: table-cell;
float: none;
}
.table > thead > tr > td.active,
.table > tbody > tr > td.active,
.table > tfoot > tr > td.active,
.table > thead > tr > th.active,
.table > tbody > tr > th.active,
.table > tfoot > tr > th.active,
.table > thead > tr.active > td,
.table > tbody > tr.active > td,
.table > tfoot > tr.active > td,
.table > thead > tr.active > th,
.table > tbody > tr.active > th,
.table > tfoot > tr.active > th {
background-color: #f5f5f5;
}
.table > thead > tr > td.success,
.table > tbody > tr > td.success,
.table > tfoot > tr > td.success,
.table > thead > tr > th.success,
.table > tbody > tr > th.success,
.table > tfoot > tr > th.success,
.table > thead > tr.success > td,
.table > tbody > tr.success > td,
.table > tfoot > tr.success > td,
.table > thead > tr.success > th,
.table > tbody > tr.success > th,
.table > tfoot > tr.success > th {
background-color: #dff0d8;
border-color: #d6e9c6;
}
.table-hover > tbody > tr > td.success:hover,
.table-hover > tbody > tr > th.success:hover,
.table-hover > tbody > tr.success:hover > td {
background-color: #d0e9c6;
border-color: #c9e2b3;
}
.table > thead > tr > td.danger,
.table > tbody > tr > td.danger,
.table > tfoot > tr > td.danger,
.table > thead > tr > th.danger,
.table > tbody > tr > th.danger,
.table > tfoot > tr > th.danger,
.table > thead > tr.danger > td,
.table > tbody > tr.danger > td,
.table > tfoot > tr.danger > td,
.table > thead > tr.danger > th,
.table > tbody > tr.danger > th,
.table > tfoot > tr.danger > th {
background-color: #f2dede;
border-color: #eed3d7;
}
.table-hover > tbody > tr > td.danger:hover,
.table-hover > tbody > tr > th.danger:hover,
.table-hover > tbody > tr.danger:hover > td {
background-color: #ebcccc;
border-color: #e6c1c7;
}
.table > thead > tr > td.warning,
.table > tbody > tr > td.warning,
.table > tfoot > tr > td.warning,
.table > thead > tr > th.warning,
.table > tbody > tr > th.warning,
.table > tfoot > tr > th.warning,
.table > thead > tr.warning > td,
.table > tbody > tr.warning > td,
.table > tfoot > tr.warning > td,
.table > thead > tr.warning > th,
.table > tbody > tr.warning > th,
.table > tfoot > tr.warning > th {
background-color: #fcf8e3;
border-color: #fbeed5;
}
.table-hover > tbody > tr > td.warning:hover,
.table-hover > tbody > tr > th.warning:hover,
.table-hover > tbody > tr.warning:hover > td {
background-color: #faf2cc;
border-color: #f8e5be;
}
fieldset {
padding: 0;
margin: 0;
border: 0;
}
legend {
display: block;
width: 100%;
padding: 0;
margin-bottom: 20px;
font-size: 21px;
line-height: inherit;
color: #333333;
border: 0;
border-bottom: 1px solid #e5e5e5;
}
label {
display: inline-block;
margin-bottom: 5px;
font-weight: bold;
}
input[type="search"] {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
input[type="radio"],
input[type="checkbox"] {
margin: 4px 0 0;
margin-top: 1px \9;
/* IE8-9 */
line-height: normal;
}
input[type="file"] {
display: block;
}
select[multiple],
select[size] {
height: auto;
}
select optgroup {
font-family: inherit;
font-size: inherit;
font-style: inherit;
}
input[type="file"]:focus,
input[type="radio"]:focus,
input[type="checkbox"]:focus {
outline: thin dotted #333;
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
height: auto;
}
.form-control:-moz-placeholder {
color: #999999;
}
.form-control::-moz-placeholder {
color: #999999;
}
.form-control:-ms-input-placeholder {
color: #999999;
}
.form-control::-webkit-input-placeholder {
color: #999999;
}
.form-control {
display: block;
width: 100%;
height: 34px;
padding: 6px 12px;
font-size: 14px;
line-height: 1.428571429;
color: #555555;
vertical-align: middle;
background-color: #ffffff;
border: 1px solid #cccccc;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
}
.form-control:focus {
border-color: #66afe9;
outline: 0;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
}
.form-control[disabled],
.form-control[readonly],
fieldset[disabled] .form-control {
cursor: not-allowed;
background-color: #eeeeee;
}
textarea.form-control {
height: auto;
}
.form-group {
margin-bottom: 15px;
}
.radio,
.checkbox {
display: block;
min-height: 20px;
padding-left: 20px;
margin-top: 10px;
margin-bottom: 10px;
vertical-align: middle;
}
.radio label,
.checkbox label {
display: inline;
margin-bottom: 0;
font-weight: normal;
cursor: pointer;
}
.radio input[type="radio"],
.radio-inline input[type="radio"],
.checkbox input[type="checkbox"],
.checkbox-inline input[type="checkbox"] {
float: left;
margin-left: -20px;
}
.radio + .radio,
.checkbox + .checkbox {
margin-top: -5px;
}
.radio-inline,
.checkbox-inline {
display: inline-block;
padding-left: 20px;
margin-bottom: 0;
font-weight: normal;
vertical-align: middle;
cursor: pointer;
}
.radio-inline + .radio-inline,
.checkbox-inline + .checkbox-inline {
margin-top: 0;
margin-left: 10px;
}
input[type="radio"][disabled],
input[type="checkbox"][disabled],
.radio[disabled],
.radio-inline[disabled],
.checkbox[disabled],
.checkbox-inline[disabled],
fieldset[disabled] input[type="radio"],
fieldset[disabled] input[type="checkbox"],
fieldset[disabled] .radio,
fieldset[disabled] .radio-inline,
fieldset[disabled] .checkbox,
fieldset[disabled] .checkbox-inline {
cursor: not-allowed;
}
.input-sm {
height: 30px;
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
select.input-sm {
height: 30px;
line-height: 30px;
}
textarea.input-sm {
height: auto;
}
.input-lg {
height: 45px;
padding: 10px 16px;
font-size: 18px;
line-height: 1.33;
border-radius: 6px;
}
select.input-lg {
height: 45px;
line-height: 45px;
}
textarea.input-lg {
height: auto;
}
.has-warning .help-block,
.has-warning .control-label {
color: #c09853;
}
.has-warning .form-control {
border-color: #c09853;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.has-warning .form-control:focus {
border-color: #a47e3c;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
}
.has-warning .input-group-addon {
color: #c09853;
background-color: #fcf8e3;
border-color: #c09853;
}
.has-error .help-block,
.has-error .control-label {
color: #b94a48;
}
.has-error .form-control {
border-color: #b94a48;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.has-error .form-control:focus {
border-color: #953b39;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
}
.has-error .input-group-addon {
color: #b94a48;
background-color: #f2dede;
border-color: #b94a48;
}
.has-success .help-block,
.has-success .control-label {
color: #468847;
}
.has-success .form-control {
border-color: #468847;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.has-success .form-control:focus {
border-color: #356635;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
}
.has-success .input-group-addon {
color: #468847;
background-color: #dff0d8;
border-color: #468847;
}
.form-control-static {
padding-top: 6px;
margin-bottom: 0;
}
.help-block {
display: block;
margin-top: 5px;
margin-bottom: 10px;
color: #737373;
}
@media (min-width: 768px) {
.form-inline .form-group {
display: inline-block;
margin-bottom: 0;
vertical-align: middle;
}
.form-inline .form-control {
display: inline-block;
}
.form-inline .radio,
.form-inline .checkbox {
display: inline-block;
padding-left: 0;
margin-top: 0;
margin-bottom: 0;
}
.form-inline .radio input[type="radio"],
.form-inline .checkbox input[type="checkbox"] {
float: none;
margin-left: 0;
}
}
.form-horizontal .control-label,
.form-horizontal .radio-inline,
.form-horizontal .checkbox-inline {
padding-top: 6px;
}
.form-horizontal .form-group:before,
.form-horizontal .form-group:after {
display: table;
content: " ";
}
.form-horizontal .form-group:after {
clear: both;
}
.form-horizontal .form-group:before,
.form-horizontal .form-group:after {
display: table;
content: " ";
}
.form-horizontal .form-group:after {
clear: both;
}
@media (min-width: 768px) {
.container .form-horizontal .form-group {
margin-right: -15px;
margin-left: -15px;
}
}
.form-horizontal .form-group .row {
margin-right: -15px;
margin-left: -15px;
}
@media (min-width: 768px) {
.form-horizontal .control-label {
text-align: right;
}
}
.btn {
display: inline-block;
padding: 6px 12px;
margin-bottom: 0;
font-size: 14px;
font-weight: bold;
line-height: 1.428571429;
text-align: center;
white-space: nowrap;
vertical-align: middle;
cursor: pointer;
border: 1px solid transparent;
border-radius: 4px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
}
.btn:focus {
outline: thin dotted #333;
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
.btn:hover,
.btn:focus {
color: #333333;
text-decoration: none;
}
.btn:active,
.btn.active {
background-image: none;
outline: 0;
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
}
.btn.disabled,
.btn[disabled],
fieldset[disabled] .btn {
pointer-events: none;
cursor: not-allowed;
opacity: 0.65;
filter: alpha(opacity=65);
-webkit-box-shadow: none;
box-shadow: none;
}
.btn-default {
color: #333333;
background-color: #ffffff;
border-color: #cccccc;
}
.btn-default:hover,
.btn-default:focus,
.btn-default:active,
.btn-default.active,
.open .dropdown-toggle.btn-default {
color: #333333;
background-color: #ebebeb;
border-color: #adadad;
}
.btn-default:active,
.btn-default.active,
.open .dropdown-toggle.btn-default {
background-image: none;
}
.btn-default.disabled,
.btn-default[disabled],
fieldset[disabled] .btn-default,
.btn-default.disabled:hover,
.btn-default[disabled]:hover,
fieldset[disabled] .btn-default:hover,
.btn-default.disabled:focus,
.btn-default[disabled]:focus,
fieldset[disabled] .btn-default:focus,
.btn-default.disabled:active,
.btn-default[disabled]:active,
fieldset[disabled] .btn-default:active,
.btn-default.disabled.active,
.btn-default[disabled].active,
fieldset[disabled] .btn-default.active {
background-color: #ffffff;
border-color: #cccccc;
}
.btn-primary {
color: #ffffff;
background-color: #428bca;
border-color: #357ebd;
}
.btn-primary:hover,
.btn-primary:focus,
.btn-primary:active,
.btn-primary.active,
.open .dropdown-toggle.btn-primary {
color: #ffffff;
background-color: #3276b1;
border-color: #285e8e;
}
.btn-primary:active,
.btn-primary.active,
.open .dropdown-toggle.btn-primary {
background-image: none;
}
.btn-primary.disabled,
.btn-primary[disabled],
fieldset[disabled] .btn-primary,
.btn-primary.disabled:hover,
.btn-primary[disabled]:hover,
fieldset[disabled] .btn-primary:hover,
.btn-primary.disabled:focus,
.btn-primary[disabled]:focus,
fieldset[disabled] .btn-primary:focus,
.btn-primary.disabled:active,
.btn-primary[disabled]:active,
fieldset[disabled] .btn-primary:active,
.btn-primary.disabled.active,
.btn-primary[disabled].active,
fieldset[disabled] .btn-primary.active {
background-color: #428bca;
border-color: #357ebd;
}
.btn-warning {
color: #ffffff;
background-color: #f0ad4e;
border-color: #eea236;
}
.btn-warning:hover,
.btn-warning:focus,
.btn-warning:active,
.btn-warning.active,
.open .dropdown-toggle.btn-warning {
color: #ffffff;
background-color: #ed9c28;
border-color: #d58512;
}
.btn-warning:active,
.btn-warning.active,
.open .dropdown-toggle.btn-warning {
background-image: none;
}
.btn-warning.disabled,
.btn-warning[disabled],
fieldset[disabled] .btn-warning,
.btn-warning.disabled:hover,
.btn-warning[disabled]:hover,
fieldset[disabled] .btn-warning:hover,
.btn-warning.disabled:focus,
.btn-warning[disabled]:focus,
fieldset[disabled] .btn-warning:focus,
.btn-warning.disabled:active,
.btn-warning[disabled]:active,
fieldset[disabled] .btn-warning:active,
.btn-warning.disabled.active,
.btn-warning[disabled].active,
fieldset[disabled] .btn-warning.active {
background-color: #f0ad4e;
border-color: #eea236;
}
.btn-danger {
color: #ffffff;
background-color: #d9534f;
border-color: #d43f3a;
}
.btn-danger:hover,
.btn-danger:focus,
.btn-danger:active,
.btn-danger.active,
.open .dropdown-toggle.btn-danger {
color: #ffffff;
background-color: #d2322d;
border-color: #ac2925;
}
.btn-danger:active,
.btn-danger.active,
.open .dropdown-toggle.btn-danger {
background-image: none;
}
.btn-danger.disabled,
.btn-danger[disabled],
fieldset[disabled] .btn-danger,
.btn-danger.disabled:hover,
.btn-danger[disabled]:hover,
fieldset[disabled] .btn-danger:hover,
.btn-danger.disabled:focus,
.btn-danger[disabled]:focus,
fieldset[disabled] .btn-danger:focus,
.btn-danger.disabled:active,
.btn-danger[disabled]:active,
fieldset[disabled] .btn-danger:active,
.btn-danger.disabled.active,
.btn-danger[disabled].active,
fieldset[disabled] .btn-danger.active {
background-color: #d9534f;
border-color: #d43f3a;
}
.btn-success {
color: #ffffff;
background-color: #5cb85c;
border-color: #4cae4c;
}
.btn-success:hover,
.btn-success:focus,
.btn-success:active,
.btn-success.active,
.open .dropdown-toggle.btn-success {
color: #ffffff;
background-color: #47a447;
border-color: #398439;
}
.btn-success:active,
.btn-success.active,
.open .dropdown-toggle.btn-success {
background-image: none;
}
.btn-success.disabled,
.btn-success[disabled],
fieldset[disabled] .btn-success,
.btn-success.disabled:hover,
.btn-success[disabled]:hover,
fieldset[disabled] .btn-success:hover,
.btn-success.disabled:focus,
.btn-success[disabled]:focus,
fieldset[disabled] .btn-success:focus,
.btn-success.disabled:active,
.btn-success[disabled]:active,
fieldset[disabled] .btn-success:active,
.btn-success.disabled.active,
.btn-success[disabled].active,
fieldset[disabled] .btn-success.active {
background-color: #5cb85c;
border-color: #4cae4c;
}
.btn-info {
color: #ffffff;
background-color: #5bc0de;
border-color: #46b8da;
}
.btn-info:hover,
.btn-info:focus,
.btn-info:active,
.btn-info.active,
.open .dropdown-toggle.btn-info {
color: #ffffff;
background-color: #39b3d7;
border-color: #269abc;
}
.btn-info:active,
.btn-info.active,
.open .dropdown-toggle.btn-info {
background-image: none;
}
.btn-info.disabled,
.btn-info[disabled],
fieldset[disabled] .btn-info,
.btn-info.disabled:hover,
.btn-info[disabled]:hover,
fieldset[disabled] .btn-info:hover,
.btn-info.disabled:focus,
.btn-info[disabled]:focus,
fieldset[disabled] .btn-info:focus,
.btn-info.disabled:active,
.btn-info[disabled]:active,
fieldset[disabled] .btn-info:active,
.btn-info.disabled.active,
.btn-info[disabled].active,
fieldset[disabled] .btn-info.active {
background-color: #5bc0de;
border-color: #46b8da;
}
.btn-link {
font-weight: normal;
color: #428bca;
cursor: pointer;
border-radius: 0;
}
.btn-link,
.btn-link:active,
.btn-link[disabled],
fieldset[disabled] .btn-link {
background-color: transparent;
-webkit-box-shadow: none;
box-shadow: none;
}
.btn-link,
.btn-link:hover,
.btn-link:focus,
.btn-link:active {
border-color: transparent;
}
.btn-link:hover,
.btn-link:focus {
color: #2a6496;
text-decoration: underline;
background-color: transparent;
}
.btn-link[disabled]:hover,
fieldset[disabled] .btn-link:hover,
.btn-link[disabled]:focus,
fieldset[disabled] .btn-link:focus {
color: #999999;
text-decoration: none;
}
.btn-lg {
padding: 10px 16px;
font-size: 18px;
line-height: 1.33;
border-radius: 6px;
}
.btn-sm,
.btn-xs {
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
.btn-xs {
padding: 1px 5px;
}
.btn-block {
display: block;
width: 100%;
padding-right: 0;
padding-left: 0;
}
.btn-block + .btn-block {
margin-top: 5px;
}
input[type="submit"].btn-block,
input[type="reset"].btn-block,
input[type="button"].btn-block {
width: 100%;
}
.fade {
opacity: 0;
-webkit-transition: opacity 0.15s linear;
transition: opacity 0.15s linear;
}
.fade.in {
opacity: 1;
}
.collapse {
display: none;
}
.collapse.in {
display: block;
}
.collapsing {
position: relative;
height: 0;
overflow: hidden;
-webkit-transition: height 0.35s ease;
transition: height 0.35s ease;
}
.input-group {
position: relative;
display: table;
border-collapse: separate;
}
.input-group.col {
float: none;
padding-right: 0;
padding-left: 0;
}
.input-group .form-control {
width: 100%;
margin-bottom: 0;
}
.input-group-lg > .form-control,
.input-group-lg > .input-group-addon,
.input-group-lg > .input-group-btn > .btn {
height: 45px;
padding: 10px 16px;
font-size: 18px;
line-height: 1.33;
border-radius: 6px;
}
select.input-group-lg > .form-control,
select.input-group-lg > .input-group-addon,
select.input-group-lg > .input-group-btn > .btn {
height: 45px;
line-height: 45px;
}
textarea.input-group-lg > .form-control,
textarea.input-group-lg > .input-group-addon,
textarea.input-group-lg > .input-group-btn > .btn {
height: auto;
}
.input-group-sm > .form-control,
.input-group-sm > .input-group-addon,
.input-group-sm > .input-group-btn > .btn {
height: 30px;
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
select.input-group-sm > .form-control,
select.input-group-sm > .input-group-addon,
select.input-group-sm > .input-group-btn > .btn {
height: 30px;
line-height: 30px;
}
textarea.input-group-sm > .form-control,
textarea.input-group-sm > .input-group-addon,
textarea.input-group-sm > .input-group-btn > .btn {
height: auto;
}
.input-group-addon,
.input-group-btn,
.input-group .form-control {
display: table-cell;
}
.input-group-addon:not(:first-child):not(:last-child),
.input-group-btn:not(:first-child):not(:last-child),
.input-group .form-control:not(:first-child):not(:last-child) {
border-radius: 0;
}
.input-group-addon,
.input-group-btn {
width: 1%;
white-space: nowrap;
vertical-align: middle;
}
.input-group-addon {
padding: 6px 12px;
font-size: 14px;
font-weight: normal;
line-height: 1;
text-align: center;
background-color: #eeeeee;
border: 1px solid #cccccc;
border-radius: 4px;
}
.input-group-addon.input-sm {
padding: 5px 10px;
font-size: 12px;
border-radius: 3px;
}
.input-group-addon.input-lg {
padding: 10px 16px;
font-size: 18px;
border-radius: 6px;
}
.input-group-addon input[type="radio"],
.input-group-addon input[type="checkbox"] {
margin-top: 0;
}
.input-group .form-control:first-child,
.input-group-addon:first-child,
.input-group-btn:first-child > .btn,
.input-group-btn:first-child > .dropdown-toggle,
.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.input-group-addon:first-child {
border-right: 0;
}
.input-group .form-control:last-child,
.input-group-addon:last-child,
.input-group-btn:last-child > .btn,
.input-group-btn:last-child > .dropdown-toggle,
.input-group-btn:first-child > .btn:not(:first-child) {
border-bottom-left-radius: 0;
border-top-left-radius: 0;
}
.input-group-addon:last-child {
border-left: 0;
}
.input-group-btn {
position: relative;
white-space: nowrap;
}
.input-group-btn > .btn {
position: relative;
}
.input-group-btn > .btn + .btn {
margin-left: -4px;
}
.input-group-btn > .btn:hover,
.input-group-btn > .btn:active {
z-index: 2;
}
.caret {
display: inline-block;
width: 0;
height: 0;
margin-left: 2px;
vertical-align: middle;
border-top: 4px solid #000000;
border-right: 4px solid transparent;
border-left: 4px solid transparent;
content: "";
}
.dropdown {
position: relative;
}
.dropdown-toggle:focus {
outline: 0;
}
.dropdown-menu {
position: absolute;
top: 100%;
left: 0;
z-index: 1000;
display: none;
float: left;
min-width: 160px;
padding: 5px 0;
margin: 2px 0 0;
font-size: 14px;
list-style: none;
background-color: #ffffff;
border: 1px solid #cccccc;
border: 1px solid rgba(0, 0, 0, 0.15);
border-radius: 4px;
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
background-clip: padding-box;
}
.dropdown-menu.pull-right {
right: 0;
left: auto;
}
.dropdown-menu .divider {
height: 1px;
margin: 9px 0;
overflow: hidden;
background-color: #e5e5e5;
}
.dropdown-menu > li > a {
display: block;
padding: 3px 20px;
clear: both;
font-weight: normal;
line-height: 1.428571429;
color: #333333;
white-space: nowrap;
}
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus {
color: #ffffff;
text-decoration: none;
background-color: #428bca;
}
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
color: #ffffff;
text-decoration: none;
background-color: #428bca;
outline: 0;
}
.dropdown-menu > .disabled > a,
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
color: #999999;
}
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
text-decoration: none;
cursor: not-allowed;
background-color: transparent;
background-image: none;
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
}
.open > .dropdown-menu {
display: block;
}
.open > a {
outline: 0;
}
.dropdown-header {
display: block;
padding: 3px 20px;
font-size: 12px;
line-height: 1.428571429;
color: #999999;
}
.dropdown-backdrop {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 990;
}
.pull-right > .dropdown-menu {
right: 0;
left: auto;
}
.dropup .caret,
.navbar-fixed-bottom .dropdown .caret {
border-top: 0;
border-bottom: 4px solid #000000;
content: "";
}
.dropup .dropdown-menu,
.navbar-fixed-bottom .dropdown .dropdown-menu {
top: auto;
bottom: 100%;
margin-bottom: 1px;
}
.list-group {
padding-left: 0;
margin-bottom: 20px;
}
.list-group-item {
position: relative;
display: block;
padding: 10px 15px;
margin-bottom: -1px;
background-color: #ffffff;
border: 1px solid #dddddd;
}
.list-group-item:first-child {
border-top-right-radius: 4px;
border-top-left-radius: 4px;
}
.list-group-item:last-child {
margin-bottom: 0;
border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px;
}
.list-group-item > .badge {
float: right;
}
.list-group-item > .badge + .badge {
margin-right: 5px;
}
a.list-group-item {
color: #555555;
}
a.list-group-item .list-group-item-heading {
color: #333333;
}
a.list-group-item:hover,
a.list-group-item:focus {
text-decoration: none;
background-color: #f5f5f5;
}
.list-group-item.active,
.list-group-item.active:hover,
.list-group-item.active:focus {
z-index: 2;
color: #ffffff;
background-color: #428bca;
border-color: #428bca;
}
.list-group-item.active .list-group-item-heading,
.list-group-item.active:hover .list-group-item-heading,
.list-group-item.active:focus .list-group-item-heading {
color: inherit;
}
.list-group-item.active .list-group-item-text,
.list-group-item.active:hover .list-group-item-text,
.list-group-item.active:focus .list-group-item-text {
color: #e1edf7;
}
.list-group-item-heading {
margin-top: 0;
margin-bottom: 5px;
}
.list-group-item-text {
margin-bottom: 0;
line-height: 1.3;
}
.panel {
margin-bottom: 20px;
background-color: #ffffff;
border: 1px solid #dddddd;
border-radius: 4px;
-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
}
.panel-body {
padding: 15px;
}
.panel > .list-group {
margin-bottom: 0;
}
.panel > .list-group .list-group-item {
border-width: 1px 0;
}
.panel > .list-group .list-group-item:first-child {
border-top-right-radius: 0;
border-top-left-radius: 0;
}
.panel > .list-group .list-group-item:last-child {
border-bottom: 0;
}
.panel-heading + .list-group .list-group-item:first-child {
border-top-width: 0;
}
.panel-heading {
padding: 10px 15px;
background-color: #f5f5f5;
border-bottom: 1px solid #dddddd;
border-top-right-radius: 3px;
border-top-left-radius: 3px;
}
.panel-title {
margin-top: 0;
margin-bottom: 0;
font-size: 17.5px;
}
.panel-title > a {
color: inherit;
}
.panel-footer {
padding: 10px 15px;
background-color: #f5f5f5;
border-top: 1px solid #dddddd;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
}
.panel-group .panel {
margin-bottom: 0;
overflow: hidden;
border-radius: 4px;
}
.panel-group .panel + .panel {
margin-top: 5px;
}
.panel-group .panel-heading {
border-bottom: 0;
}
.panel-group .panel-heading + .panel-collapse .panel-body {
border-top: 1px solid #dddddd;
}
.panel-group .panel-footer {
border-top: 0;
}
.panel-group .panel-footer + .panel-collapse .panel-body {
border-bottom: 1px solid #dddddd;
}
.panel-primary {
border-color: #428bca;
}
.panel-primary > .panel-heading {
color: #ffffff;
background-color: #428bca;
border-color: #428bca;
}
.panel-primary > .panel-heading + .panel-collapse .panel-body {
border-top-color: #428bca;
}
.panel-primary > .panel-footer + .panel-collapse .panel-body {
border-bottom-color: #428bca;
}
.panel-success {
border-color: #d6e9c6;
}
.panel-success > .panel-heading {
color: #468847;
background-color: #dff0d8;
border-color: #d6e9c6;
}
.panel-success > .panel-heading + .panel-collapse .panel-body {
border-top-color: #d6e9c6;
}
.panel-success > .panel-footer + .panel-collapse .panel-body {
border-bottom-color: #d6e9c6;
}
.panel-warning {
border-color: #fbeed5;
}
.panel-warning > .panel-heading {
color: #c09853;
background-color: #fcf8e3;
border-color: #fbeed5;
}
.panel-warning > .panel-heading + .panel-collapse .panel-body {
border-top-color: #fbeed5;
}
.panel-warning > .panel-footer + .panel-collapse .panel-body {
border-bottom-color: #fbeed5;
}
.panel-danger {
border-color: #eed3d7;
}
.panel-danger > .panel-heading {
color: #b94a48;
background-color: #f2dede;
border-color: #eed3d7;
}
.panel-danger > .panel-heading + .panel-collapse .panel-body {
border-top-color: #eed3d7;
}
.panel-danger > .panel-footer + .panel-collapse .panel-body {
border-bottom-color: #eed3d7;
}
.panel-info {
border-color: #bce8f1;
}
.panel-info > .panel-heading {
color: #3a87ad;
background-color: #d9edf7;
border-color: #bce8f1;
}
.panel-info > .panel-heading + .panel-collapse .panel-body {
border-top-color: #bce8f1;
}
.panel-info > .panel-footer + .panel-collapse .panel-body {
border-bottom-color: #bce8f1;
}
.well {
min-height: 20px;
padding: 19px;
margin-bottom: 20px;
background-color: #f5f5f5;
border: 1px solid #e3e3e3;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
}
.well blockquote {
border-color: #ddd;
border-color: rgba(0, 0, 0, 0.15);
}
.well-lg {
padding: 24px;
border-radius: 6px;
}
.well-sm {
padding: 9px;
border-radius: 3px;
}
.close {
float: right;
font-size: 21px;
font-weight: bold;
line-height: 1;
color: #000000;
text-shadow: 0 1px 0 #ffffff;
opacity: 0.2;
filter: alpha(opacity=20);
}
.close:hover,
.close:focus {
color: #000000;
text-decoration: none;
cursor: pointer;
opacity: 0.5;
filter: alpha(opacity=50);
}
button.close {
padding: 0;
cursor: pointer;
background: transparent;
border: 0;
-webkit-appearance: none;
}
.nav {
padding-left: 0;
margin-bottom: 0;
list-style: none;
}
.nav:before,
.nav:after {
display: table;
content: " ";
}
.nav:after {
clear: both;
}
.nav:before,
.nav:after {
display: table;
content: " ";
}
.nav:after {
clear: both;
}
.nav > li {
position: relative;
display: block;
}
.nav > li > a {
position: relative;
display: block;
padding: 10px 15px;
}
.nav > li > a:hover,
.nav > li > a:focus {
text-decoration: none;
background-color: #eeeeee;
}
.nav > li.disabled > a {
color: #999999;
}
.nav > li.disabled > a:hover,
.nav > li.disabled > a:focus {
color: #999999;
text-decoration: none;
cursor: not-allowed;
background-color: transparent;
}
.nav .open > a,
.nav .open > a:hover,
.nav .open > a:focus {
background-color: #eeeeee;
border-color: #428bca;
}
.nav .nav-divider {
height: 1px;
margin: 9px 0;
overflow: hidden;
background-color: #e5e5e5;
}
.nav > li > a > img {
max-width: none;
}
.nav-tabs {
border-bottom: 1px solid #dddddd;
}
.nav-tabs > li {
float: left;
margin-bottom: -1px;
}
.nav-tabs > li > a {
margin-right: 2px;
line-height: 1.428571429;
border: 1px solid transparent;
border-radius: 4px 4px 0 0;
}
.nav-tabs > li > a:hover {
border-color: #eeeeee #eeeeee #dddddd;
}
.nav-tabs > li.active > a,
.nav-tabs > li.active > a:hover,
.nav-tabs > li.active > a:focus {
color: #555555;
cursor: default;
background-color: #ffffff;
border: 1px solid #dddddd;
border-bottom-color: transparent;
}
.nav-tabs.nav-justified {
width: 100%;
border-bottom: 0;
}
.nav-tabs.nav-justified > li {
display: table-cell;
float: none;
width: 1%;
}
.nav-tabs.nav-justified > li > a {
text-align: center;
}
.nav-tabs.nav-justified > li > a {
margin-right: 0;
border-bottom: 1px solid #dddddd;
}
.nav-tabs.nav-justified > .active > a {
border-bottom-color: #ffffff;
}
.nav-pills > li {
float: left;
}
.nav-pills > li > a {
border-radius: 5px;
}
.nav-pills > li + li {
margin-left: 2px;
}
.nav-pills > li.active > a,
.nav-pills > li.active > a:hover,
.nav-pills > li.active > a:focus {
color: #ffffff;
background-color: #428bca;
}
.nav-stacked > li {
float: none;
}
.nav-stacked > li + li {
margin-top: 2px;
margin-left: 0;
}
.nav-justified {
width: 100%;
}
.nav-justified > li {
display: table-cell;
float: none;
width: 1%;
}
.nav-justified > li > a {
text-align: center;
}
.nav-tabs-justified {
border-bottom: 0;
}
.nav-tabs-justified > li > a {
margin-right: 0;
border-bottom: 1px solid #dddddd;
}
.nav-tabs-justified > .active > a {
border-bottom-color: #ffffff;
}
.tabbable:before,
.tabbable:after {
display: table;
content: " ";
}
.tabbable:after {
clear: both;
}
.tabbable:before,
.tabbable:after {
display: table;
content: " ";
}
.tabbable:after {
clear: both;
}
.tab-content > .tab-pane,
.pill-content > .pill-pane {
display: none;
}
.tab-content > .active,
.pill-content > .active {
display: block;
}
.nav .caret {
border-top-color: #428bca;
border-bottom-color: #428bca;
}
.nav a:hover .caret {
border-top-color: #2a6496;
border-bottom-color: #2a6496;
}
.nav-tabs .dropdown-menu {
margin-top: -1px;
border-top-right-radius: 0;
border-top-left-radius: 0;
}
.navbar {
position: relative;
min-height: 50px;
margin-bottom: 20px;
background-color: #f8f8f8;
border: 1px solid #e7e7e7;
}
.navbar:before,
.navbar:after {
display: table;
content: " ";
}
.navbar:after {
clear: both;
}
.navbar:before,
.navbar:after {
display: table;
content: " ";
}
.navbar:after {
clear: both;
}
@media (min-width: 768px) {
.navbar {
border-radius: 4px;
}
}
.navbar-header {
padding-right: 15px;
padding-left: 15px;
}
.navbar-header:before,
.navbar-header:after {
display: table;
content: " ";
}
.navbar-header:after {
clear: both;
}
.navbar-header:before,
.navbar-header:after {
display: table;
content: " ";
}
.navbar-header:after {
clear: both;
}
@media (min-width: 768px) {
.navbar-header {
float: left;
}
}
.navbar-collapse {
max-height: 340px;
padding-right: 15px;
padding-left: 15px;
overflow-x: visible;
overflow-y: auto;
border-top: 1px solid #e6e6e6;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
-webkit-overflow-scrolling: touch;
}
.navbar-collapse:before,
.navbar-collapse:after {
display: table;
content: " ";
}
.navbar-collapse:after {
clear: both;
}
.navbar-collapse:before,
.navbar-collapse:after {
display: table;
content: " ";
}
.navbar-collapse:after {
clear: both;
}
@media (min-width: 768px) {
.navbar-collapse {
width: auto;
padding-right: 0;
padding-left: 0;
border-top: 0;
box-shadow: none;
}
.navbar-collapse.collapse {
display: block !important;
height: auto !important;
padding-bottom: 0;
overflow: visible !important;
}
.navbar-collapse.in {
overflow-y: visible;
}
}
.navbar-static-top {
border-width: 0 0 1px;
}
@media (min-width: 768px) {
.navbar-static-top {
border-radius: 0;
}
}
.navbar-fixed-top,
.navbar-fixed-bottom {
position: fixed;
right: 0;
left: 0;
z-index: 1030;
border-width: 0 0 1px;
}
@media (min-width: 768px) {
.navbar-fixed-top,
.navbar-fixed-bottom {
border-radius: 0;
}
}
.navbar-fixed-top {
top: 0;
}
.navbar-fixed-bottom {
bottom: 0;
margin-bottom: 0;
}
.navbar-brand {
float: left;
padding-top: 15px;
padding-bottom: 15px;
font-size: 18px;
line-height: 20px;
color: #777777;
}
.navbar-brand:hover,
.navbar-brand:focus {
color: #5e5e5e;
text-decoration: none;
background-color: transparent;
}
.navbar-toggle {
position: relative;
float: right;
padding: 9px 10px;
margin-top: 8px;
margin-bottom: 8px;
background-color: transparent;
border: 1px solid #dddddd;
border-radius: 4px;
}
.navbar-toggle:hover,
.navbar-toggle:focus {
background-color: #dddddd;
}
.navbar-toggle .icon-bar {
display: block;
width: 22px;
height: 2px;
background-color: #cccccc;
border-radius: 1px;
}
.navbar-toggle .icon-bar + .icon-bar {
margin-top: 4px;
}
@media (min-width: 768px) {
.navbar-toggle {
position: relative;
top: auto;
left: auto;
display: none;
}
}
.navbar-nav {
padding-top: 7.5px;
padding-bottom: 7.5px;
margin-right: -15px;
margin-left: -15px;
}
.navbar-nav > li > a {
padding-top: 10px;
padding-bottom: 10px;
line-height: 20px;
color: #777777;
}
.navbar-nav > li > a:hover,
.navbar-nav > li > a:focus {
color: #333333;
background-color: transparent;
}
.navbar-nav > .active > a,
.navbar-nav > .active > a:hover,
.navbar-nav > .active > a:focus {
color: #555555;
background-color: #e7e7e7;
}
.navbar-nav > .disabled > a,
.navbar-nav > .disabled > a:hover,
.navbar-nav > .disabled > a:focus {
color: #cccccc;
background-color: transparent;
}
@media (max-width: 767px) {
.navbar-nav .open .dropdown-menu {
position: static;
float: none;
width: auto;
margin-top: 0;
background-color: transparent;
border: 0;
box-shadow: none;
}
.navbar-nav .open .dropdown-menu > li > a,
.navbar-nav .open .dropdown-menu .dropdown-header {
padding: 5px 15px 5px 25px;
}
.navbar-nav .open .dropdown-menu > li > a {
line-height: 20px;
color: #777777;
}
.navbar-nav .open .dropdown-menu > li > a:hover,
.navbar-nav .open .dropdown-menu > li > a:focus {
color: #333333;
background-color: transparent;
background-image: none;
}
.navbar-nav .open .dropdown-menu > .active > a,
.navbar-nav .open .dropdown-menu > .active > a:hover,
.navbar-nav .open .dropdown-menu > .active > a:focus {
color: #555555;
background-color: #e7e7e7;
}
.navbar-nav .open .dropdown-menu > .disabled > a,
.navbar-nav .open .dropdown-menu > .disabled > a:hover,
.navbar-nav .open .dropdown-menu > .disabled > a:focus {
color: #cccccc;
background-color: transparent;
}
}
@media (min-width: 768px) {
.navbar-nav {
float: left;
padding-top: 0;
padding-bottom: 0;
margin: 0;
}
.navbar-nav > li {
float: left;
}
.navbar-nav > li > a {
padding-top: 15px;
padding-bottom: 15px;
}
}
@media (min-width: 768px) {
.navbar-left {
float: left !important;
}
.navbar-right {
float: right !important;
}
.navbar-right .dropdown-menu {
right: 0;
left: auto;
}
}
.navbar-form {
padding: 10px 15px;
margin-top: 8px;
margin-right: -15px;
margin-bottom: 8px;
margin-left: -15px;
border-top: 1px solid #e6e6e6;
border-bottom: 1px solid #e6e6e6;
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
}
@media (min-width: 768px) {
.navbar-form .form-group {
display: inline-block;
margin-bottom: 0;
vertical-align: middle;
}
.navbar-form .form-control {
display: inline-block;
}
.navbar-form .radio,
.navbar-form .checkbox {
display: inline-block;
padding-left: 0;
margin-top: 0;
margin-bottom: 0;
}
.navbar-form .radio input[type="radio"],
.navbar-form .checkbox input[type="checkbox"] {
float: none;
margin-left: 0;
}
}
@media (max-width: 767px) {
.navbar-form .form-group {
margin-bottom: 5px;
}
}
@media (min-width: 768px) {
.navbar-form {
width: auto;
padding-top: 0;
padding-bottom: 0;
margin-right: 0;
margin-left: 0;
border: 0;
-webkit-box-shadow: none;
box-shadow: none;
}
}
.navbar-nav > li > .dropdown-menu {
margin-top: 0;
border-top-right-radius: 0;
border-top-left-radius: 0;
}
.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.navbar-nav > .dropdown > a:hover .caret,
.navbar-nav > .dropdown > a:focus .caret {
border-top-color: #333333;
border-bottom-color: #333333;
}
.navbar-nav > .open > a,
.navbar-nav > .open > a:hover,
.navbar-nav > .open > a:focus {
color: #555555;
background-color: #e7e7e7;
}
.navbar-nav > .open > a .caret,
.navbar-nav > .open > a:hover .caret,
.navbar-nav > .open > a:focus .caret {
border-top-color: #555555;
border-bottom-color: #555555;
}
.navbar-nav > .dropdown > a .caret {
border-top-color: #777777;
border-bottom-color: #777777;
}
.navbar-nav.pull-right > li > .dropdown-menu,
.navbar-nav > li > .dropdown-menu.pull-right {
right: 0;
left: auto;
}
.navbar-btn {
margin-top: 8px;
margin-bottom: 8px;
}
.navbar-text {
float: left;
margin-top: 15px;
margin-bottom: 15px;
color: #777777;
}
@media (min-width: 768px) {
.navbar-text {
margin-right: 15px;
margin-left: 15px;
}
}
.navbar-link {
color: #777777;
}
.navbar-link:hover {
color: #333333;
}
.navbar-inverse {
background-color: #222222;
border-color: #080808;
}
.navbar-inverse .navbar-brand {
color: #999999;
}
.navbar-inverse .navbar-brand:hover,
.navbar-inverse .navbar-brand:focus {
color: #ffffff;
background-color: transparent;
}
.navbar-inverse .navbar-text {
color: #999999;
}
.navbar-inverse .navbar-nav > li > a {
color: #999999;
}
.navbar-inverse .navbar-nav > li > a:hover,
.navbar-inverse .navbar-nav > li > a:focus {
color: #ffffff;
background-color: transparent;
}
.navbar-inverse .navbar-nav > .active > a,
.navbar-inverse .navbar-nav > .active > a:hover,
.navbar-inverse .navbar-nav > .active > a:focus {
color: #ffffff;
background-color: #080808;
}
.navbar-inverse .navbar-nav > .disabled > a,
.navbar-inverse .navbar-nav > .disabled > a:hover,
.navbar-inverse .navbar-nav > .disabled > a:focus {
color: #444444;
background-color: transparent;
}
.navbar-inverse .navbar-toggle {
border-color: #333333;
}
.navbar-inverse .navbar-toggle:hover,
.navbar-inverse .navbar-toggle:focus {
background-color: #333333;
}
.navbar-inverse .navbar-toggle .icon-bar {
background-color: #ffffff;
}
.navbar-inverse .navbar-collapse,
.navbar-inverse .navbar-form {
border-color: #101010;
}
.navbar-inverse .navbar-nav > .open > a,
.navbar-inverse .navbar-nav > .open > a:hover,
.navbar-inverse .navbar-nav > .open > a:focus {
color: #ffffff;
background-color: #080808;
}
.navbar-inverse .navbar-nav > .dropdown > a:hover .caret {
border-top-color: #ffffff;
border-bottom-color: #ffffff;
}
.navbar-inverse .navbar-nav > .dropdown > a .caret {
border-top-color: #999999;
border-bottom-color: #999999;
}
.navbar-inverse .navbar-nav > .open > a .caret,
.navbar-inverse .navbar-nav > .open > a:hover .caret,
.navbar-inverse .navbar-nav > .open > a:focus .caret {
border-top-color: #ffffff;
border-bottom-color: #ffffff;
}
@media (max-width: 767px) {
.navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
border-color: #080808;
}
.navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
color: #999999;
}
.navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
.navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
color: #ffffff;
background-color: transparent;
}
.navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
.navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
.navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
color: #ffffff;
background-color: #080808;
}
.navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
.navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
.navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
color: #444444;
background-color: transparent;
}
}
.navbar-inverse .navbar-link {
color: #999999;
}
.navbar-inverse .navbar-link:hover {
color: #ffffff;
}
.btn-default .caret {
border-top-color: #333333;
}
.btn-primary .caret,
.btn-success .caret,
.btn-warning .caret,
.btn-danger .caret,
.btn-info .caret {
border-top-color: #fff;
}
.dropup .btn-default .caret {
border-bottom-color: #333333;
}
.dropup .btn-primary .caret,
.dropup .btn-success .caret,
.dropup .btn-warning .caret,
.dropup .btn-danger .caret,
.dropup .btn-info .caret {
border-bottom-color: #fff;
}
.btn-group,
.btn-group-vertical {
position: relative;
display: inline-block;
vertical-align: middle;
}
.btn-group > .btn,
.btn-group-vertical > .btn {
position: relative;
float: left;
}
.btn-group > .btn:hover,
.btn-group-vertical > .btn:hover,
.btn-group > .btn:focus,
.btn-group-vertical > .btn:focus,
.btn-group > .btn:active,
.btn-group-vertical > .btn:active,
.btn-group > .btn.active,
.btn-group-vertical > .btn.active {
z-index: 2;
}
.btn-group > .btn:focus,
.btn-group-vertical > .btn:focus {
outline: none;
}
.btn-group .btn + .btn,
.btn-group .btn + .btn-group,
.btn-group .btn-group + .btn,
.btn-group .btn-group + .btn-group {
margin-left: -1px;
}
.btn-toolbar:before,
.btn-toolbar:after {
display: table;
content: " ";
}
.btn-toolbar:after {
clear: both;
}
.btn-toolbar:before,
.btn-toolbar:after {
display: table;
content: " ";
}
.btn-toolbar:after {
clear: both;
}
.btn-toolbar .btn-group {
float: left;
}
.btn-toolbar > .btn + .btn,
.btn-toolbar > .btn-group + .btn,
.btn-toolbar > .btn + .btn-group,
.btn-toolbar > .btn-group + .btn-group {
margin-left: 5px;
}
.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
border-radius: 0;
}
.btn-group > .btn:first-child {
margin-left: 0;
}
.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.btn-group > .btn:last-child:not(:first-child),
.btn-group > .dropdown-toggle:not(:first-child) {
border-bottom-left-radius: 0;
border-top-left-radius: 0;
}
.btn-group > .btn-group {
float: left;
}
.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
border-radius: 0;
}
.btn-group > .btn-group:first-child > .btn:last-child,
.btn-group > .btn-group:first-child > .dropdown-toggle {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.btn-group > .btn-group:last-child > .btn:first-child {
border-bottom-left-radius: 0;
border-top-left-radius: 0;
}
.btn-group .dropdown-toggle:active,
.btn-group.open .dropdown-toggle {
outline: 0;
}
.btn-group-xs > .btn {
padding: 5px 10px;
padding: 1px 5px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
.btn-group-sm > .btn {
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
.btn-group-lg > .btn {
padding: 10px 16px;
font-size: 18px;
line-height: 1.33;
border-radius: 6px;
}
.btn-group > .btn + .dropdown-toggle {
padding-right: 8px;
padding-left: 8px;
}
.btn-group > .btn-lg + .dropdown-toggle {
padding-right: 12px;
padding-left: 12px;
}
.btn-group.open .dropdown-toggle {
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
}
.btn .caret {
margin-left: 0;
}
.btn-lg .caret {
border-width: 5px;
}
.dropup .btn-lg .caret {
border-bottom-width: 5px;
}
.btn-group-vertical > .btn,
.btn-group-vertical > .btn-group {
display: block;
float: none;
width: 100%;
max-width: 100%;
}
.btn-group-vertical > .btn-group:before,
.btn-group-vertical > .btn-group:after {
display: table;
content: " ";
}
.btn-group-vertical > .btn-group:after {
clear: both;
}
.btn-group-vertical > .btn-group:before,
.btn-group-vertical > .btn-group:after {
display: table;
content: " ";
}
.btn-group-vertical > .btn-group:after {
clear: both;
}
.btn-group-vertical > .btn-group > .btn {
float: none;
}
.btn-group-vertical > .btn + .btn,
.btn-group-vertical > .btn + .btn-group,
.btn-group-vertical > .btn-group + .btn,
.btn-group-vertical > .btn-group + .btn-group {
margin-top: -1px;
margin-left: 0;
}
.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
border-radius: 0;
}
.btn-group-vertical > .btn:first-child:not(:last-child) {
border-top-right-radius: 4px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.btn-group-vertical > .btn:last-child:not(:first-child) {
border-top-right-radius: 0;
border-bottom-left-radius: 4px;
border-top-left-radius: 0;
}
.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
border-radius: 0;
}
.btn-group-vertical > .btn-group:first-child > .btn:last-child,
.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.btn-group-vertical > .btn-group:last-child > .btn:first-child {
border-top-right-radius: 0;
border-top-left-radius: 0;
}
.btn-group-justified {
display: table;
width: 100%;
border-collapse: separate;
table-layout: fixed;
}
.btn-group-justified .btn {
display: table-cell;
float: none;
width: 1%;
}
[data-toggle="buttons"] > .btn > input[type="radio"],
[data-toggle="buttons"] > .btn > input[type="checkbox"] {
display: none;
}
.breadcrumb {
padding: 8px 15px;
margin-bottom: 20px;
list-style: none;
background-color: #f5f5f5;
border-radius: 4px;
}
.breadcrumb > li {
display: inline-block;
}
.breadcrumb > li + li:before {
padding: 0 5px;
color: #cccccc;
content: "/\00a0";
}
.breadcrumb > .active {
color: #999999;
}
.pagination {
display: inline-block;
padding-left: 0;
margin: 20px 0;
border-radius: 4px;
}
.pagination > li {
display: inline;
}
.pagination > li > a,
.pagination > li > span {
position: relative;
float: left;
padding: 6px 12px;
margin-left: -1px;
line-height: 1.428571429;
text-decoration: none;
background-color: #ffffff;
border: 1px solid #dddddd;
}
.pagination > li:first-child > a,
.pagination > li:first-child > span {
margin-left: 0;
border-bottom-left-radius: 4px;
border-top-left-radius: 4px;
}
.pagination > li:last-child > a,
.pagination > li:last-child > span {
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
}
.pagination > li > a:hover,
.pagination > li > span:hover,
.pagination > li > a:focus,
.pagination > li > span:focus {
background-color: #eeeeee;
}
.pagination > .active > a,
.pagination > .active > span,
.pagination > .active > a:hover,
.pagination > .active > span:hover,
.pagination > .active > a:focus,
.pagination > .active > span:focus {
z-index: 2;
color: #ffffff;
cursor: default;
background-color: #428bca;
border-color: #428bca;
}
.pagination > .disabled > span,
.pagination > .disabled > a,
.pagination > .disabled > a:hover,
.pagination > .disabled > a:focus {
color: #999999;
cursor: not-allowed;
background-color: #ffffff;
border-color: #dddddd;
}
.pagination-lg > li > a,
.pagination-lg > li > span {
padding: 10px 16px;
font-size: 18px;
}
.pagination-lg > li:first-child > a,
.pagination-lg > li:first-child > span {
border-bottom-left-radius: 6px;
border-top-left-radius: 6px;
}
.pagination-lg > li:last-child > a,
.pagination-lg > li:last-child > span {
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
}
.pagination-sm > li > a,
.pagination-sm > li > span {
padding: 5px 10px;
font-size: 12px;
}
.pagination-sm > li:first-child > a,
.pagination-sm > li:first-child > span {
border-bottom-left-radius: 3px;
border-top-left-radius: 3px;
}
.pagination-sm > li:last-child > a,
.pagination-sm > li:last-child > span {
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
}
.pager {
padding-left: 0;
margin: 20px 0;
text-align: center;
list-style: none;
}
.pager:before,
.pager:after {
display: table;
content: " ";
}
.pager:after {
clear: both;
}
.pager:before,
.pager:after {
display: table;
content: " ";
}
.pager:after {
clear: both;
}
.pager li {
display: inline;
}
.pager li > a,
.pager li > span {
display: inline-block;
padding: 5px 14px;
background-color: #ffffff;
border: 1px solid #dddddd;
border-radius: 15px;
}
.pager li > a:hover,
.pager li > a:focus {
text-decoration: none;
background-color: #428bca;
}
.pager .next > a,
.pager .next > span {
float: right;
}
.pager .previous > a,
.pager .previous > span {
float: left;
}
.pager .disabled > a,
.pager .disabled > a:hover,
.pager .disabled > a:focus,
.pager .disabled > span {
color: #999999;
cursor: not-allowed;
background-color: #ffffff;
}
.modal-open {
overflow: hidden;
}
.modal {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1040;
display: none;
overflow: auto;
overflow-y: scroll;
}
.modal.fade .modal-dialog {
-webkit-transform: translate(0, -25%);
-ms-transform: translate(0, -25%);
transform: translate(0, -25%);
-webkit-transition: -webkit-transform 0.3s ease-out;
-moz-transition: -moz-transform 0.3s ease-out;
-o-transition: -o-transform 0.3s ease-out;
transition: transform 0.3s ease-out;
}
.modal.in .modal-dialog {
-webkit-transform: translate(0, 0);
-ms-transform: translate(0, 0);
transform: translate(0, 0);
}
.modal-dialog {
z-index: 1050;
width: auto;
padding: 10px;
margin-right: auto;
margin-left: auto;
}
.modal-content {
position: relative;
background-color: #ffffff;
border: 1px solid #999999;
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 6px;
outline: none;
-webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
background-clip: padding-box;
}
.modal-backdrop {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1030;
background-color: #000000;
}
.modal-backdrop.fade {
opacity: 0;
filter: alpha(opacity=0);
}
.modal-backdrop.in {
opacity: 0.5;
filter: alpha(opacity=50);
}
.modal-header {
min-height: 16.428571429px;
padding: 15px;
border-bottom: 1px solid #e5e5e5;
}
.modal-header .close {
margin-top: -2px;
}
.modal-title {
margin: 0;
line-height: 1.428571429;
}
.modal-body {
position: relative;
padding: 20px;
}
.modal-footer {
padding: 19px 20px 20px;
margin-top: 15px;
text-align: right;
border-top: 1px solid #e5e5e5;
}
.modal-footer:before,
.modal-footer:after {
display: table;
content: " ";
}
.modal-footer:after {
clear: both;
}
.modal-footer:before,
.modal-footer:after {
display: table;
content: " ";
}
.modal-footer:after {
clear: both;
}
.modal-footer .btn + .btn {
margin-bottom: 0;
margin-left: 5px;
}
.modal-footer .btn-group .btn + .btn {
margin-left: -1px;
}
.modal-footer .btn-block + .btn-block {
margin-left: 0;
}
@media screen and (min-width: 768px) {
.modal-dialog {
right: auto;
left: 50%;
width: 600px;
padding-top: 30px;
padding-bottom: 30px;
}
.modal-content {
-webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
}
}
.tooltip {
position: absolute;
z-index: 1030;
display: block;
font-size: 12px;
line-height: 1.4;
opacity: 0;
filter: alpha(opacity=0);
visibility: visible;
}
.tooltip.in {
opacity: 0.9;
filter: alpha(opacity=90);
}
.tooltip.top {
padding: 5px 0;
margin-top: -3px;
}
.tooltip.right {
padding: 0 5px;
margin-left: 3px;
}
.tooltip.bottom {
padding: 5px 0;
margin-top: 3px;
}
.tooltip.left {
padding: 0 5px;
margin-left: -3px;
}
.tooltip-inner {
max-width: 200px;
padding: 3px 8px;
color: #ffffff;
text-align: center;
text-decoration: none;
background-color: #000000;
border-radius: 4px;
}
.tooltip-arrow {
position: absolute;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
}
.tooltip.top .tooltip-arrow {
bottom: 0;
left: 50%;
margin-left: -5px;
border-top-color: #000000;
border-width: 5px 5px 0;
}
.tooltip.top-left .tooltip-arrow {
bottom: 0;
left: 5px;
border-top-color: #000000;
border-width: 5px 5px 0;
}
.tooltip.top-right .tooltip-arrow {
right: 5px;
bottom: 0;
border-top-color: #000000;
border-width: 5px 5px 0;
}
.tooltip.right .tooltip-arrow {
top: 50%;
left: 0;
margin-top: -5px;
border-right-color: #000000;
border-width: 5px 5px 5px 0;
}
.tooltip.left .tooltip-arrow {
top: 50%;
right: 0;
margin-top: -5px;
border-left-color: #000000;
border-width: 5px 0 5px 5px;
}
.tooltip.bottom .tooltip-arrow {
top: 0;
left: 50%;
margin-left: -5px;
border-bottom-color: #000000;
border-width: 0 5px 5px;
}
.tooltip.bottom-left .tooltip-arrow {
top: 0;
left: 5px;
border-bottom-color: #000000;
border-width: 0 5px 5px;
}
.tooltip.bottom-right .tooltip-arrow {
top: 0;
right: 5px;
border-bottom-color: #000000;
border-width: 0 5px 5px;
}
.popover {
position: absolute;
top: 0;
left: 0;
z-index: 1010;
display: none;
max-width: 276px;
padding: 1px;
text-align: left;
white-space: normal;
background-color: #ffffff;
border: 1px solid #cccccc;
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 6px;
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
background-clip: padding-box;
}
.popover.top {
margin-top: -10px;
}
.popover.right {
margin-left: 10px;
}
.popover.bottom {
margin-top: 10px;
}
.popover.left {
margin-left: -10px;
}
.popover-title {
padding: 8px 14px;
margin: 0;
font-size: 14px;
font-weight: normal;
line-height: 18px;
background-color: #f7f7f7;
border-bottom: 1px solid #ebebeb;
border-radius: 5px 5px 0 0;
}
.popover-content {
padding: 9px 14px;
}
.popover .arrow,
.popover .arrow:after {
position: absolute;
display: block;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
}
.popover .arrow {
border-width: 11px;
}
.popover .arrow:after {
border-width: 10px;
content: "";
}
.popover.top .arrow {
bottom: -11px;
left: 50%;
margin-left: -11px;
border-top-color: #999999;
border-top-color: rgba(0, 0, 0, 0.25);
border-bottom-width: 0;
}
.popover.top .arrow:after {
bottom: 1px;
margin-left: -10px;
border-top-color: #ffffff;
border-bottom-width: 0;
content: " ";
}
.popover.right .arrow {
top: 50%;
left: -11px;
margin-top: -11px;
border-right-color: #999999;
border-right-color: rgba(0, 0, 0, 0.25);
border-left-width: 0;
}
.popover.right .arrow:after {
bottom: -10px;
left: 1px;
border-right-color: #ffffff;
border-left-width: 0;
content: " ";
}
.popover.bottom .arrow {
top: -11px;
left: 50%;
margin-left: -11px;
border-bottom-color: #999999;
border-bottom-color: rgba(0, 0, 0, 0.25);
border-top-width: 0;
}
.popover.bottom .arrow:after {
top: 1px;
margin-left: -10px;
border-bottom-color: #ffffff;
border-top-width: 0;
content: " ";
}
.popover.left .arrow {
top: 50%;
right: -11px;
margin-top: -11px;
border-left-color: #999999;
border-left-color: rgba(0, 0, 0, 0.25);
border-right-width: 0;
}
.popover.left .arrow:after {
right: 1px;
bottom: -10px;
border-left-color: #ffffff;
border-right-width: 0;
content: " ";
}
.alert {
padding: 15px;
margin-bottom: 20px;
color: #c09853;
background-color: #fcf8e3;
border: 1px solid #fbeed5;
border-radius: 4px;
}
.alert h4 {
margin-top: 0;
color: inherit;
}
.alert hr {
border-top-color: #f8e5be;
}
.alert .alert-link {
font-weight: bold;
color: #a47e3c;
}
.alert > p,
.alert > ul {
margin-bottom: 0;
}
.alert > p + p {
margin-top: 5px;
}
.alert-dismissable {
padding-right: 35px;
}
.alert-dismissable .close {
position: relative;
top: -2px;
right: -21px;
color: inherit;
}
.alert-success {
color: #468847;
background-color: #dff0d8;
border-color: #d6e9c6;
}
.alert-success hr {
border-top-color: #c9e2b3;
}
.alert-success .alert-link {
color: #356635;
}
.alert-danger {
color: #b94a48;
background-color: #f2dede;
border-color: #eed3d7;
}
.alert-danger hr {
border-top-color: #e6c1c7;
}
.alert-danger .alert-link {
color: #953b39;
}
.alert-info {
color: #3a87ad;
background-color: #d9edf7;
border-color: #bce8f1;
}
.alert-info hr {
border-top-color: #a6e1ec;
}
.alert-info .alert-link {
color: #2d6987;
}
.thumbnail,
.img-thumbnail {
padding: 4px;
line-height: 1.428571429;
background-color: #ffffff;
border: 1px solid #dddddd;
border-radius: 4px;
-webkit-transition: all 0.2s ease-in-out;
transition: all 0.2s ease-in-out;
}
.thumbnail {
display: block;
}
.thumbnail > img {
display: block;
height: auto;
max-width: 100%;
}
.img-thumbnail {
display: inline-block;
height: auto;
max-width: 100%;
}
a.thumbnail:hover,
a.thumbnail:focus {
border-color: #428bca;
}
.thumbnail > img {
margin-right: auto;
margin-left: auto;
}
.thumbnail .caption {
padding: 9px;
color: #333333;
}
.media,
.media-body {
overflow: hidden;
zoom: 1;
}
.media,
.media .media {
margin-top: 15px;
}
.media:first-child {
margin-top: 0;
}
.media-object {
display: block;
}
.media-heading {
margin: 0 0 5px;
}
.media > .pull-left {
margin-right: 10px;
}
.media > .pull-right {
margin-left: 10px;
}
.media-list {
padding-left: 0;
list-style: none;
}
.label {
display: inline;
padding: .25em .6em;
font-size: 75%;
font-weight: bold;
line-height: 1;
color: #ffffff;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
border-radius: .25em;
}
.label[href]:hover,
.label[href]:focus {
color: #ffffff;
text-decoration: none;
cursor: pointer;
}
.label:empty {
display: none;
}
.label-default {
background-color: #999999;
}
.label-default[href]:hover,
.label-default[href]:focus {
background-color: #808080;
}
.label-primary {
background-color: #428bca;
}
.label-primary[href]:hover,
.label-primary[href]:focus {
background-color: #3071a9;
}
.label-success {
background-color: #5cb85c;
}
.label-success[href]:hover,
.label-success[href]:focus {
background-color: #449d44;
}
.label-info {
background-color: #5bc0de;
}
.label-info[href]:hover,
.label-info[href]:focus {
background-color: #31b0d5;
}
.label-warning {
background-color: #f0ad4e;
}
.label-warning[href]:hover,
.label-warning[href]:focus {
background-color: #ec971f;
}
.label-danger {
background-color: #d9534f;
}
.label-danger[href]:hover,
.label-danger[href]:focus {
background-color: #c9302c;
}
.badge {
display: inline-block;
min-width: 10px;
padding: 3px 7px;
font-size: 12px;
font-weight: bold;
line-height: 1;
color: #ffffff;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
background-color: #999999;
border-radius: 10px;
}
.badge:empty {
display: none;
}
a.badge:hover,
a.badge:focus {
color: #ffffff;
text-decoration: none;
cursor: pointer;
}
.btn .badge {
position: relative;
top: -1px;
}
a.list-group-item.active > .badge,
.nav-pills > .active > a > .badge {
color: #428bca;
background-color: #ffffff;
}
.nav-pills > li > a > .badge {
margin-left: 3px;
}
@-webkit-keyframes progress-bar-stripes {
from {
background-position: 40px 0;
}
to {
background-position: 0 0;
}
}
@-moz-keyframes progress-bar-stripes {
from {
background-position: 40px 0;
}
to {
background-position: 0 0;
}
}
@-o-keyframes progress-bar-stripes {
from {
background-position: 0 0;
}
to {
background-position: 40px 0;
}
}
@keyframes progress-bar-stripes {
from {
background-position: 40px 0;
}
to {
background-position: 0 0;
}
}
.progress {
height: 20px;
margin-bottom: 20px;
overflow: hidden;
background-color: #f5f5f5;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
}
.progress-bar {
float: left;
width: 0;
height: 100%;
font-size: 12px;
color: #ffffff;
text-align: center;
background-color: #428bca;
-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-webkit-transition: width 0.6s ease;
transition: width 0.6s ease;
}
.progress-striped .progress-bar {
background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-size: 40px 40px;
}
.progress.active .progress-bar {
-webkit-animation: progress-bar-stripes 2s linear infinite;
-moz-animation: progress-bar-stripes 2s linear infinite;
-ms-animation: progress-bar-stripes 2s linear infinite;
-o-animation: progress-bar-stripes 2s linear infinite;
animation: progress-bar-stripes 2s linear infinite;
}
.progress-bar-success {
background-color: #5cb85c;
}
.progress-striped .progress-bar-success {
background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
}
.progress-bar-info {
background-color: #5bc0de;
}
.progress-striped .progress-bar-info {
background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
}
.progress-bar-warning {
background-color: #f0ad4e;
}
.progress-striped .progress-bar-warning {
background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
}
.progress-bar-danger {
background-color: #d9534f;
}
.progress-striped .progress-bar-danger {
background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
}
.carousel {
position: relative;
}
.carousel-inner {
position: relative;
width: 100%;
overflow: hidden;
}
.carousel-inner > .item {
position: relative;
display: none;
-webkit-transition: 0.6s ease-in-out left;
transition: 0.6s ease-in-out left;
}
.carousel-inner > .item > img,
.carousel-inner > .item > a > img {
display: block;
height: auto;
max-width: 100%;
line-height: 1;
}
.carousel-inner > .active,
.carousel-inner > .next,
.carousel-inner > .prev {
display: block;
}
.carousel-inner > .active {
left: 0;
}
.carousel-inner > .next,
.carousel-inner > .prev {
position: absolute;
top: 0;
width: 100%;
}
.carousel-inner > .next {
left: 100%;
}
.carousel-inner > .prev {
left: -100%;
}
.carousel-inner > .next.left,
.carousel-inner > .prev.right {
left: 0;
}
.carousel-inner > .active.left {
left: -100%;
}
.carousel-inner > .active.right {
left: 100%;
}
.carousel-control {
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 15%;
font-size: 20px;
color: #ffffff;
text-align: center;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
opacity: 0.5;
filter: alpha(opacity=50);
}
.carousel-control.left {
background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));
background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));
background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);
background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
}
.carousel-control.right {
right: 0;
left: auto;
background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));
background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));
background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);
background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
}
.carousel-control:hover,
.carousel-control:focus {
color: #ffffff;
text-decoration: none;
opacity: 0.9;
filter: alpha(opacity=90);
}
.carousel-control .icon-prev,
.carousel-control .icon-next {
position: absolute;
top: 50%;
left: 50%;
z-index: 5;
display: inline-block;
width: 20px;
height: 20px;
margin-top: -10px;
margin-left: -10px;
font-family: serif;
}
.carousel-control .icon-prev:before {
content: '\2039';
}
.carousel-control .icon-next:before {
content: '\203a';
}
.carousel-indicators {
position: absolute;
bottom: 10px;
left: 50%;
z-index: 15;
width: 60%;
padding-left: 0;
margin-left: -30%;
text-align: center;
list-style: none;
}
.carousel-indicators li {
display: inline-block;
width: 10px;
height: 10px;
margin: 1px;
text-indent: -999px;
cursor: pointer;
border: 1px solid #ffffff;
border-radius: 10px;
}
.carousel-indicators .active {
width: 12px;
height: 12px;
margin: 0;
background-color: #ffffff;
}
.carousel-caption {
position: absolute;
right: 15%;
bottom: 20px;
left: 15%;
z-index: 10;
padding-top: 20px;
padding-bottom: 20px;
color: #ffffff;
text-align: center;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
}
.carousel-caption .btn {
text-shadow: none;
}
@media screen and (min-width: 768px) {
.carousel-control .icon-prev,
.carousel-control .icon-next {
width: 30px;
height: 30px;
margin-top: -15px;
margin-left: -15px;
font-size: 30px;
}
.carousel-caption {
right: 20%;
left: 20%;
padding-bottom: 30px;
}
.carousel-indicators {
bottom: 20px;
}
}
.jumbotron {
padding: 30px;
margin-bottom: 30px;
font-size: 21px;
font-weight: 200;
line-height: 2.1428571435;
color: inherit;
background-color: #eeeeee;
}
.jumbotron h1 {
line-height: 1;
color: inherit;
}
.jumbotron p {
line-height: 1.4;
}
@media screen and (min-width: 768px) {
.jumbotron {
padding: 50px 60px;
border-radius: 6px;
}
.jumbotron h1 {
font-size: 63px;
}
}
.clearfix:before,
.clearfix:after {
display: table;
content: " ";
}
.clearfix:after {
clear: both;
}
.pull-right {
float: right !important;
}
.pull-left {
float: left !important;
}
.hide {
display: none !important;
}
.show {
display: block !important;
}
.invisible {
visibility: hidden;
}
.text-hide {
font: 0/0 a;
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}
.affix {
position: fixed;
}
@-ms-viewport {
width: device-width;
}
@media screen and (max-width: 400px) {
@-ms-viewport {
width: 320px;
}
}
.hidden {
display: none !important;
visibility: hidden !important;
}
.visible-xs {
display: block !important;
}
tr.visible-xs {
display: table-row !important;
}
th.visible-xs,
td.visible-xs {
display: table-cell !important;
}
@media (min-width: 768px) and (max-width: 991px) {
.visible-xs {
display: none !important;
}
tr.visible-xs {
display: none !important;
}
th.visible-xs,
td.visible-xs {
display: none !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.visible-xs {
display: none !important;
}
tr.visible-xs {
display: none !important;
}
th.visible-xs,
td.visible-xs {
display: none !important;
}
}
@media (min-width: 1200px) {
.visible-xs {
display: none !important;
}
tr.visible-xs {
display: none !important;
}
th.visible-xs,
td.visible-xs {
display: none !important;
}
}
.visible-sm {
display: none !important;
}
tr.visible-sm {
display: none !important;
}
th.visible-sm,
td.visible-sm {
display: none !important;
}
@media (min-width: 768px) and (max-width: 991px) {
.visible-sm {
display: block !important;
}
tr.visible-sm {
display: table-row !important;
}
th.visible-sm,
td.visible-sm {
display: table-cell !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.visible-sm {
display: none !important;
}
tr.visible-sm {
display: none !important;
}
th.visible-sm,
td.visible-sm {
display: none !important;
}
}
@media (min-width: 1200px) {
.visible-sm {
display: none !important;
}
tr.visible-sm {
display: none !important;
}
th.visible-sm,
td.visible-sm {
display: none !important;
}
}
.visible-md {
display: none !important;
}
tr.visible-md {
display: none !important;
}
th.visible-md,
td.visible-md {
display: none !important;
}
@media (min-width: 768px) and (max-width: 991px) {
.visible-md {
display: none !important;
}
tr.visible-md {
display: none !important;
}
th.visible-md,
td.visible-md {
display: none !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.visible-md {
display: block !important;
}
tr.visible-md {
display: table-row !important;
}
th.visible-md,
td.visible-md {
display: table-cell !important;
}
}
@media (min-width: 1200px) {
.visible-md {
display: none !important;
}
tr.visible-md {
display: none !important;
}
th.visible-md,
td.visible-md {
display: none !important;
}
}
.visible-lg {
display: none !important;
}
tr.visible-lg {
display: none !important;
}
th.visible-lg,
td.visible-lg {
display: none !important;
}
@media (min-width: 768px) and (max-width: 991px) {
.visible-lg {
display: none !important;
}
tr.visible-lg {
display: none !important;
}
th.visible-lg,
td.visible-lg {
display: none !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.visible-lg {
display: none !important;
}
tr.visible-lg {
display: none !important;
}
th.visible-lg,
td.visible-lg {
display: none !important;
}
}
@media (min-width: 1200px) {
.visible-lg {
display: block !important;
}
tr.visible-lg {
display: table-row !important;
}
th.visible-lg,
td.visible-lg {
display: table-cell !important;
}
}
.hidden-xs {
display: none !important;
}
tr.hidden-xs {
display: none !important;
}
th.hidden-xs,
td.hidden-xs {
display: none !important;
}
@media (min-width: 768px) and (max-width: 991px) {
.hidden-xs {
display: block !important;
}
tr.hidden-xs {
display: table-row !important;
}
th.hidden-xs,
td.hidden-xs {
display: table-cell !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.hidden-xs {
display: block !important;
}
tr.hidden-xs {
display: table-row !important;
}
th.hidden-xs,
td.hidden-xs {
display: table-cell !important;
}
}
@media (min-width: 1200px) {
.hidden-xs {
display: block !important;
}
tr.hidden-xs {
display: table-row !important;
}
th.hidden-xs,
td.hidden-xs {
display: table-cell !important;
}
}
.hidden-sm {
display: block !important;
}
tr.hidden-sm {
display: table-row !important;
}
th.hidden-sm,
td.hidden-sm {
display: table-cell !important;
}
@media (min-width: 768px) and (max-width: 991px) {
.hidden-sm {
display: none !important;
}
tr.hidden-sm {
display: none !important;
}
th.hidden-sm,
td.hidden-sm {
display: none !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.hidden-sm {
display: block !important;
}
tr.hidden-sm {
display: table-row !important;
}
th.hidden-sm,
td.hidden-sm {
display: table-cell !important;
}
}
@media (min-width: 1200px) {
.hidden-sm {
display: block !important;
}
tr.hidden-sm {
display: table-row !important;
}
th.hidden-sm,
td.hidden-sm {
display: table-cell !important;
}
}
.hidden-md {
display: block !important;
}
tr.hidden-md {
display: table-row !important;
}
th.hidden-md,
td.hidden-md {
display: table-cell !important;
}
@media (min-width: 768px) and (max-width: 991px) {
.hidden-md {
display: block !important;
}
tr.hidden-md {
display: table-row !important;
}
th.hidden-md,
td.hidden-md {
display: table-cell !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.hidden-md {
display: none !important;
}
tr.hidden-md {
display: none !important;
}
th.hidden-md,
td.hidden-md {
display: none !important;
}
}
@media (min-width: 1200px) {
.hidden-md {
display: block !important;
}
tr.hidden-md {
display: table-row !important;
}
th.hidden-md,
td.hidden-md {
display: table-cell !important;
}
}
.hidden-lg {
display: block !important;
}
tr.hidden-lg {
display: table-row !important;
}
th.hidden-lg,
td.hidden-lg {
display: table-cell !important;
}
@media (min-width: 768px) and (max-width: 991px) {
.hidden-lg {
display: block !important;
}
tr.hidden-lg {
display: table-row !important;
}
th.hidden-lg,
td.hidden-lg {
display: table-cell !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.hidden-lg {
display: block !important;
}
tr.hidden-lg {
display: table-row !important;
}
th.hidden-lg,
td.hidden-lg {
display: table-cell !important;
}
}
@media (min-width: 1200px) {
.hidden-lg {
display: none !important;
}
tr.hidden-lg {
display: none !important;
}
th.hidden-lg,
td.hidden-lg {
display: none !important;
}
}
.visible-print {
display: none !important;
}
tr.visible-print {
display: none !important;
}
th.visible-print,
td.visible-print {
display: none !important;
}
@media print {
.visible-print {
display: block !important;
}
tr.visible-print {
display: table-row !important;
}
th.visible-print,
td.visible-print {
display: table-cell !important;
}
.hidden-print {
display: none !important;
}
tr.hidden-print {
display: none !important;
}
th.hidden-print,
td.hidden-print {
display: none !important;
}
}
================================================
FILE: site/css/carousel.css
================================================
/* GLOBAL STYLES
-------------------------------------------------- */
gitextract_f7j0faal/
├── .csslint.rc
├── .gitignore
├── .jshintrc
├── .travis.yml
├── CONTRIBUTING.md
├── Gruntfile.js
├── LICENSE.html
├── Procfile
├── README.md
├── addon/
│ ├── .gitignore
│ ├── Procfile
│ ├── README.md
│ ├── data/
│ │ ├── attachment.js
│ │ ├── button.html
│ │ ├── button.js
│ │ └── startup-help.html
│ ├── lib/
│ │ ├── main.js
│ │ └── startup-panel.js
│ └── package.json
├── client
├── devserver.js
├── hub/
│ ├── server.js
│ └── websocket-compat.js
├── package.json
├── phantomjs/
│ └── bridge.js
├── site/
│ ├── base.tmpl
│ ├── bookmarklet.html
│ ├── css/
│ │ ├── bootstrap.css
│ │ ├── carousel.css
│ │ ├── docco.css
│ │ ├── grid.css
│ │ ├── jumbotron.css
│ │ ├── responsive-video.css
│ │ └── style.css
│ ├── docs/
│ │ ├── contributing.md
│ │ ├── faq.md
│ │ └── index.md
│ ├── docs-contributing.tmpl
│ ├── docs.tmpl
│ ├── errors/
│ │ ├── 404.html
│ │ └── 500.html
│ ├── examples/
│ │ ├── drawing/
│ │ │ ├── css/
│ │ │ │ └── main.css
│ │ │ ├── index.html
│ │ │ └── js/
│ │ │ └── sketch.js
│ │ ├── friendlycode/
│ │ │ ├── .gitignore
│ │ │ ├── .gitmodules
│ │ │ ├── LICENSE.html
│ │ │ ├── LICENSE_files/
│ │ │ │ ├── css.css
│ │ │ │ ├── css_002.css
│ │ │ │ └── css_003.css
│ │ │ ├── README.md
│ │ │ ├── build-require.js
│ │ │ ├── codemirror2/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── codemirror.css
│ │ │ │ │ └── codemirror.js
│ │ │ │ └── mode/
│ │ │ │ ├── css/
│ │ │ │ │ └── css.js
│ │ │ │ ├── htmlmixed/
│ │ │ │ │ └── htmlmixed.js
│ │ │ │ ├── javascript/
│ │ │ │ │ └── javascript.js
│ │ │ │ └── xml/
│ │ │ │ └── xml.js
│ │ │ ├── css/
│ │ │ │ ├── buttons.css
│ │ │ │ ├── editor.css
│ │ │ │ ├── errorhelp.css
│ │ │ │ ├── friendlycode.css
│ │ │ │ ├── jsbin-codemirror-theme.css
│ │ │ │ ├── modals.css
│ │ │ │ ├── modals_full_screen.css
│ │ │ │ ├── opensans/
│ │ │ │ │ └── stylesheet.css
│ │ │ │ ├── opensymbolcropped/
│ │ │ │ │ └── stylesheet.css
│ │ │ │ ├── tipsy.css
│ │ │ │ └── ubuntumono/
│ │ │ │ └── stylesheet.css
│ │ │ ├── examples/
│ │ │ │ ├── alternate-publisher.html
│ │ │ │ ├── bare-optimized.html
│ │ │ │ ├── bare.html
│ │ │ │ └── editor-only.html
│ │ │ ├── index.html
│ │ │ ├── js/
│ │ │ │ ├── backbone-events.js
│ │ │ │ ├── fc/
│ │ │ │ │ ├── current-page-manager.js
│ │ │ │ │ ├── hacktionary-data.js
│ │ │ │ │ ├── help.js
│ │ │ │ │ ├── parachute.js
│ │ │ │ │ ├── prefs.js
│ │ │ │ │ ├── publisher.js
│ │ │ │ │ └── ui/
│ │ │ │ │ ├── context-sensitive-help.js
│ │ │ │ │ ├── editor-panes.js
│ │ │ │ │ ├── editor-toolbar.js
│ │ │ │ │ ├── editor.js
│ │ │ │ │ ├── error-help.js
│ │ │ │ │ ├── gutter-pointer.js
│ │ │ │ │ ├── history.js
│ │ │ │ │ ├── indexable-codemirror.js
│ │ │ │ │ ├── live-preview.js
│ │ │ │ │ ├── mark-tracker.js
│ │ │ │ │ ├── modals.js
│ │ │ │ │ ├── parsing-codemirror.js
│ │ │ │ │ ├── preview-to-editor-mapping.js
│ │ │ │ │ ├── publish.js
│ │ │ │ │ ├── relocator.js
│ │ │ │ │ ├── social-media.js
│ │ │ │ │ └── text.js
│ │ │ │ ├── friendlycode.js
│ │ │ │ ├── jquery.no-conflict.js
│ │ │ │ ├── jquery.tipsy.js
│ │ │ │ ├── lscache.js
│ │ │ │ ├── require-config.js
│ │ │ │ ├── require-plugins/
│ │ │ │ │ ├── template.js
│ │ │ │ │ └── text.js
│ │ │ │ └── slowparse-errors.js
│ │ │ ├── package.json
│ │ │ ├── slowparse/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── LICENSE.html
│ │ │ │ ├── LICENSE_files/
│ │ │ │ │ ├── css.css
│ │ │ │ │ ├── css_002.css
│ │ │ │ │ └── css_003.css
│ │ │ │ ├── README.md
│ │ │ │ ├── demo/
│ │ │ │ │ ├── hierarchic-source-code.css
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── jsbin-codemirror-theme.css
│ │ │ │ │ ├── render-dom.js
│ │ │ │ │ ├── tag-colors.js
│ │ │ │ │ └── utils.js
│ │ │ │ ├── index.html
│ │ │ │ ├── slowparse.js
│ │ │ │ ├── spec/
│ │ │ │ │ ├── errors.base.html
│ │ │ │ │ ├── errors.forbidjs.html
│ │ │ │ │ ├── errors.jquery.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── spec.js
│ │ │ │ ├── test/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── qunit.css
│ │ │ │ │ ├── qunit.js
│ │ │ │ │ ├── test-errors.jquery.js
│ │ │ │ │ ├── test-slowparse.js
│ │ │ │ │ ├── test-spec.js
│ │ │ │ │ ├── test-tree-inspectors.js
│ │ │ │ │ └── testing-utils.js
│ │ │ │ ├── tree-inspectors.js
│ │ │ │ └── vendor/
│ │ │ │ ├── brocco.js
│ │ │ │ ├── codemirror2/
│ │ │ │ │ ├── lib/
│ │ │ │ │ │ ├── codemirror.css
│ │ │ │ │ │ └── codemirror.js
│ │ │ │ │ └── mode/
│ │ │ │ │ ├── css/
│ │ │ │ │ │ └── css.js
│ │ │ │ │ ├── htmlmixed/
│ │ │ │ │ │ └── htmlmixed.js
│ │ │ │ │ ├── javascript/
│ │ │ │ │ │ └── javascript.js
│ │ │ │ │ └── xml/
│ │ │ │ │ └── xml.js
│ │ │ │ ├── docco.css
│ │ │ │ ├── jump-to.js
│ │ │ │ └── showdown.js
│ │ │ ├── templates/
│ │ │ │ ├── confirm-dialog.html
│ │ │ │ ├── default-content.html
│ │ │ │ ├── error-dialog.html
│ │ │ │ ├── error-msg.html
│ │ │ │ ├── help-msg.html
│ │ │ │ ├── nav-options.html
│ │ │ │ └── publish-dialog.html
│ │ │ └── test/
│ │ │ ├── all-tests.js
│ │ │ ├── codemirror-577/
│ │ │ │ ├── original.html
│ │ │ │ ├── replacer.html
│ │ │ │ └── test-codemirror-577.js
│ │ │ ├── define-tests.js
│ │ │ ├── index-optimized.html
│ │ │ ├── index.html
│ │ │ ├── lptest.js
│ │ │ ├── preview-to-editor-mapping/
│ │ │ │ ├── path-to.html
│ │ │ │ └── test-preview-to-editor-mapping.js
│ │ │ ├── publisher/
│ │ │ │ ├── post-publish.html
│ │ │ │ ├── pre-publish.html
│ │ │ │ └── test-publisher.js
│ │ │ ├── qunit.css
│ │ │ ├── qunit.js
│ │ │ ├── test-app-optimized.html
│ │ │ ├── test-app.html
│ │ │ ├── test-app.js
│ │ │ ├── test-current-page-manager.js
│ │ │ ├── test-editor-toolbar.js
│ │ │ ├── test-gutter-pointer.js
│ │ │ ├── test-help.js
│ │ │ ├── test-indexable-codemirror.js
│ │ │ ├── test-live-preview.js
│ │ │ ├── test-mark-tracker.js
│ │ │ ├── test-parsing-codemirror.js
│ │ │ ├── test-prefs.js
│ │ │ ├── test-slowparse-errors.js
│ │ │ └── test-templates.js
│ │ ├── madlibs/
│ │ │ ├── css/
│ │ │ │ ├── app.css
│ │ │ │ └── bootstrap.css
│ │ │ ├── index.html
│ │ │ └── js/
│ │ │ ├── app.js
│ │ │ └── bootstrap.js
│ │ ├── persona/
│ │ │ ├── index.html
│ │ │ └── md5.js
│ │ ├── tinymce/
│ │ │ ├── css/
│ │ │ │ └── application.css
│ │ │ ├── index.html
│ │ │ └── js/
│ │ │ ├── application.js
│ │ │ └── application.js~
│ │ ├── todo/
│ │ │ ├── css/
│ │ │ │ └── bootstrap.css
│ │ │ ├── index.html
│ │ │ └── js/
│ │ │ ├── app.js
│ │ │ └── bootstrap.js
│ │ └── youtube/
│ │ ├── css/
│ │ │ └── application.css
│ │ ├── index.html
│ │ └── js/
│ │ └── application.js
│ ├── faq.html
│ ├── generic-markdown.tmpl
│ ├── index.html
│ ├── js/
│ │ ├── bootstrap.js
│ │ ├── custom.js
│ │ ├── frontpage.js
│ │ ├── how-animations.js
│ │ ├── imageresizer.js
│ │ ├── parallax.js
│ │ ├── retina.js
│ │ ├── scrollTo.js
│ │ ├── scrollspy.js
│ │ └── source-code.js
│ ├── less/
│ │ ├── alerts.less
│ │ ├── badges.less
│ │ ├── bootstrap.less
│ │ ├── breadcrumbs.less
│ │ ├── button-groups.less
│ │ ├── buttons.less
│ │ ├── carousel.less
│ │ ├── close.less
│ │ ├── code.less
│ │ ├── component-animations.less
│ │ ├── dropdowns.less
│ │ ├── forms.less
│ │ ├── grid.less
│ │ ├── input-groups.less
│ │ ├── jumbotron.less
│ │ ├── labels.less
│ │ ├── list-group.less
│ │ ├── media.less
│ │ ├── mixins.less
│ │ ├── modals.less
│ │ ├── navbar.less
│ │ ├── navs.less
│ │ ├── normalize.less
│ │ ├── pager.less
│ │ ├── pagination.less
│ │ ├── panels.less
│ │ ├── popovers.less
│ │ ├── print.less
│ │ ├── progress-bars.less
│ │ ├── responsive-utilities.less
│ │ ├── retina.less
│ │ ├── scaffolding.less
│ │ ├── tables.less
│ │ ├── thumbnails.less
│ │ ├── tooltip.less
│ │ ├── type.less
│ │ ├── utilities.less
│ │ ├── variables.less
│ │ └── wells.less
│ ├── source-code-index.tmpl
│ ├── source-code.tmpl
│ └── the-developers/
│ ├── index.html
│ ├── the-developers.css
│ └── the-developers.js
└── togetherjs/
├── README.md
├── analytics.js
├── channels.js
├── chat.js
├── console.js
├── cursor.js
├── elementFinder.js
├── eventMaker.js
├── forms.js
├── functions.less
├── help.txt
├── images/
│ └── notification.ogg
├── interface.html
├── jqueryPlugins.js
├── libs/
│ ├── almond.js
│ ├── require-nomin.js
│ ├── require.js
│ ├── tinycolor.js
│ ├── walkabout/
│ │ ├── README.md
│ │ ├── index.html
│ │ ├── lib/
│ │ │ ├── esprima.js
│ │ │ └── falafel.js
│ │ ├── node-proxy.js
│ │ ├── test_overlap.html
│ │ ├── test_overlap.js
│ │ ├── test_walkabout.html
│ │ ├── test_walkabout.js
│ │ ├── test_walkabout_nojquery.html
│ │ ├── test_walkabout_nojquery.js
│ │ ├── traverse-rewrite.js
│ │ └── walkabout.js
│ └── whrandom/
│ ├── README.md
│ ├── mersenne.js
│ ├── random.js
│ ├── test_random.html
│ └── test_random.js
├── linkify.js
├── locale/
│ ├── de-DE.json
│ ├── en-US.json
│ ├── es-BO.json
│ ├── pl-PL.json
│ └── ru.json
├── mobile.less
├── module-descriptions.json
├── ot.js
├── peers.js
├── playback.js
├── randomutil.js
├── recorder.html
├── recorder.js
├── recorder.less
├── reset.less
├── session.js
├── startup.js
├── storage.js
├── templates-localized.js
├── templates.js
├── templating.js
├── tests/
│ ├── ace.js
│ ├── codemirror4.js
│ ├── doctestjs/
│ │ ├── .gitignore
│ │ ├── .gitmodules
│ │ ├── .hgignore
│ │ ├── .resources/
│ │ │ ├── CNAME
│ │ │ ├── boilerplate/
│ │ │ │ ├── 404.html
│ │ │ │ ├── css/
│ │ │ │ │ ├── main.css
│ │ │ │ │ └── normalize.css
│ │ │ │ ├── index.html
│ │ │ │ └── js/
│ │ │ │ └── main.js
│ │ │ ├── doc.css
│ │ │ ├── example.xml
│ │ │ ├── footer.html
│ │ │ ├── header.html
│ │ │ ├── include-scripts.sh
│ │ │ ├── retemplate.py
│ │ │ ├── template.html
│ │ │ ├── toc.js
│ │ │ └── try.js
│ │ ├── .syncignore
│ │ ├── README.md
│ │ ├── bin/
│ │ │ └── doctest
│ │ ├── doctest.css
│ │ ├── doctest.js
│ │ ├── examples/
│ │ │ ├── examples-2.html
│ │ │ ├── examples-2.js
│ │ │ ├── examples.html
│ │ │ ├── long-running-tests.html
│ │ │ └── long-running-tests.js
│ │ ├── index.html
│ │ ├── package.json
│ │ ├── reference.html
│ │ ├── try.html
│ │ └── tutorial.html
│ ├── func_ace.js
│ ├── func_codemirror.js
│ ├── func_forms.js
│ ├── func_misc.js
│ ├── func_notifications.js
│ ├── func_peer_status.js
│ ├── func_walkthrough.js
│ ├── index.html
│ ├── interactive.js
│ ├── manual/
│ │ ├── index.html
│ │ ├── multi-textarea-focus.html
│ │ └── youtube-video.html
│ ├── mobiletest.html
│ ├── test_console.js
│ ├── test_elementFinder.js
│ ├── test_linkify.js
│ ├── test_misc.js
│ ├── test_ot.js
│ ├── test_ot_text.js
│ ├── test_resolves.js
│ ├── test_storage.js
│ ├── testutils.js
│ └── togetherjs-animations/
│ ├── css/
│ │ └── styles.css
│ ├── index.html
│ └── js/
│ └── animations.js
├── togetherjs.js
├── togetherjs.less
├── ui.js
├── util.js
├── videos.js
├── visibilityApi.js
├── walkabout.html
├── walkthrough.html
├── walkthrough.js
├── webrtc.js
├── who.js
├── windowing.js
└── youtubeVideos.js
SYMBOL INDEX (1322 symbols across 112 files)
FILE: Gruntfile.js
function copyLink (line 30) | function copyLink(src, dest) {
function copyMany (line 53) | function copyMany(src, dest, patterns) {
function escapeString (line 251) | function escapeString(s) {
function substituteContent (line 281) | function substituteContent(content, s) {
function translateFile (line 349) | function translateFile(source, translation) {
function parseMarkdownOutput (line 413) | function parseMarkdownOutput(doc) {
function addHeaderIds (line 423) | function addHeaderIds(doc) {
function highlight (line 443) | function highlight(code, lang) {
function doccoFormat (line 496) | function doccoFormat(source, sections) {
FILE: addon/lib/main.js
function updateAutoDomains (line 30) | function updateAutoDomains() {
function startTogetherJS (line 54) | function startTogetherJS(shareId) {
function watchTab (line 85) | function watchTab(tab) {
FILE: addon/lib/startup-panel.js
function StartupPanel (line 17) | function StartupPanel(options) {
FILE: hub/server.js
function corsAccept (line 142) | function corsAccept(request, response) {
function write500 (line 149) | function write500(error, response) {
function write404 (line 157) | function write404(response) {
function write400 (line 162) | function write400(error, response) {
function findRoom (line 167) | function findRoom(prefix, max, response) {
function generateId (line 196) | function generateId(length) {
function pickRandom (line 206) | function pickRandom(seq) {
function startServer (line 210) | function startServer(port, host) {
function originIsAllowed (line 228) | function originIsAllowed(origin) {
function getLoad (line 360) | function getLoad() {
function countClients (line 384) | function countClients(clients) {
function logStats (line 392) | function logStats(id, stats) {
FILE: phantomjs/bridge.js
function sendMessage (line 34) | function sendMessage() {
FILE: site/examples/drawing/js/sketch.js
function setSize (line 53) | function setSize(size) {
function setColor (line 58) | function setColor(color) {
function eraser (line 64) | function eraser() {
function clear (line 70) | function clear(send) {
function reDraw (line 81) | function reDraw(lines){
function draw (line 87) | function draw(start, end, color, size, compositeOperation, save) {
function move (line 109) | function move(e) {
function convertTouch (line 138) | function convertTouch(touch) {
function searchOngoingTouches (line 148) | function searchOngoingTouches(identifier) {
function touchstart (line 158) | function touchstart(e) {
function touchmove (line 168) | function touchmove(e) {
function touchend (line 193) | function touchend(e) {
function touchcancel (line 218) | function touchcancel(e) {
function changeMouse (line 263) | function changeMouse() {
FILE: site/examples/friendlycode/build-require.js
function optimize (line 15) | function optimize(done) {
function generateConfig (line 19) | function generateConfig() {
function selfTest (line 41) | function selfTest() {
FILE: site/examples/friendlycode/codemirror2/lib/codemirror.js
function CodeMirror (line 11) | function CodeMirror(place, givenOptions) {
function getKeyMap (line 2102) | function getKeyMap(val) {
function lookupKey (line 2106) | function lookupKey(name, extraMap, map, handle, stop) {
function isModifierKey (line 2127) | function isModifierKey(event) {
function save (line 2140) | function save() {textarea.value = instance.getValue();}
function wrappedSubmit (line 2146) | function wrappedSubmit() {
function copyState (line 2177) | function copyState(mode, state) {
function startState (line 2189) | function startState(mode, a1, a2) {
function StringStream (line 2195) | function StringStream(string, tabSize) {
function cased (line 2234) | function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
function MarkedText (line 2250) | function MarkedText(from, to, className, marker) {
function Bookmark (line 2280) | function Bookmark(pos) {
function Line (line 2316) | function Line(text, styles) {
function span_ (line 2478) | function span_(text, style) {
function styleToClass (line 2537) | function styleToClass(style) {
function advanceMarks (line 2554) | function advanceMarks() {
function copyStyles (line 2595) | function copyStyles(from, to, source, dest) {
function LeafChunk (line 2611) | function LeafChunk(lines) {
function BranchChunk (line 2645) | function BranchChunk(children) {
function getLineAt (line 2744) | function getLineAt(chunk, n) {
function lineNo (line 2754) | function lineNo(line) {
function lineAtHeight (line 2765) | function lineAtHeight(chunk, h) {
function heightAtLine (line 2783) | function heightAtLine(chunk, n) {
function History (line 2800) | function History() {
function stopMethod (line 2836) | function stopMethod() {e_stop(this);}
function addStop (line 2838) | function addStop(event) {
function e_preventDefault (line 2843) | function e_preventDefault(e) {
function e_stopPropagation (line 2847) | function e_stopPropagation(e) {
function e_stop (line 2851) | function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
function e_target (line 2856) | function e_target(e) {return e.target || e.srcElement;}
function e_button (line 2857) | function e_button(e) {
function e_prop (line 2866) | function e_prop(e, prop) {
function connect (line 2873) | function connect(node, type, handler, disconnect) {
function Delayed (line 2886) | function Delayed() {this.id = null;}
function countColumn (line 2931) | function countColumn(string, end, tabSize) {
function computedStyle (line 2943) | function computedStyle(elt) {
function eltOffset (line 2950) | function eltOffset(node, screen) {
function eltText (line 2986) | function eltText(node) {
function selectInput (line 2989) | function selectInput(node) {
function posEq (line 2997) | function posEq(a, b) {return a.line == b.line && a.ch == b.ch;}
function posLess (line 2998) | function posLess(a, b) {return a.line < b.line || (a.line == b.line && a...
function copyPos (line 2999) | function copyPos(x) {return {line: x.line, ch: x.ch};}
function htmlEscape (line 3002) | function htmlEscape(str) {
function editEnd (line 3024) | function editEnd(from, to) {
function indexOf (line 3032) | function indexOf(collection, elt) {
function isWordChar (line 3038) | function isWordChar(ch) {
FILE: site/examples/friendlycode/codemirror2/mode/css/css.js
function ret (line 3) | function ret(style, tp) {type = tp; return style;}
function tokenBase (line 5) | function tokenBase(stream, state) {
function tokenCComment (line 46) | function tokenCComment(stream, state) {
function tokenSGMLComment (line 58) | function tokenSGMLComment(stream, state) {
function tokenString (line 70) | function tokenString(quote) {
FILE: site/examples/friendlycode/codemirror2/mode/htmlmixed/htmlmixed.js
function html (line 6) | function html(stream, state) {
function maybeBackup (line 22) | function maybeBackup(stream, pat, style) {
function javascript (line 28) | function javascript(stream, state) {
function css (line 38) | function css(stream, state) {
FILE: site/examples/friendlycode/codemirror2/mode/javascript/javascript.js
function kw (line 8) | function kw(type) {return {type: type, style: "keyword"};}
function chain (line 24) | function chain(stream, state, f) {
function nextUntilUnescaped (line 29) | function nextUntilUnescaped(stream, end) {
function ret (line 42) | function ret(tp, style, cont) {
function jsTokenBase (line 47) | function jsTokenBase(stream, state) {
function jsTokenString (line 95) | function jsTokenString(quote) {
function jsTokenComment (line 103) | function jsTokenComment(stream, state) {
function JSLexical (line 119) | function JSLexical(indented, column, type, align, prev, info) {
function inScope (line 128) | function inScope(state, varname) {
function parseJS (line 133) | function parseJS(state, style, type, content, stream) {
function pass (line 157) | function pass() {
function cont (line 160) | function cont() {
function register (line 164) | function register(varname) {
function pushcontext (line 177) | function pushcontext() {
function popcontext (line 181) | function popcontext() {
function pushlex (line 185) | function pushlex(type, info) {
function poplex (line 193) | function poplex() {
function expect (line 203) | function expect(wanted) {
function statement (line 211) | function statement(type) {
function expression (line 229) | function expression(type) {
function maybeexpression (line 239) | function maybeexpression(type) {
function maybeoperator (line 244) | function maybeoperator(type, value) {
function maybelabel (line 252) | function maybelabel(type) {
function property (line 256) | function property(type) {
function objprop (line 259) | function objprop(type) {
function commasep (line 263) | function commasep(what, end) {
function block (line 274) | function block(type) {
function vardef1 (line 278) | function vardef1(type, value) {
function vardef2 (line 282) | function vardef2(type, value) {
function forspec1 (line 286) | function forspec1(type) {
function formaybein (line 292) | function formaybein(type, value) {
function forspec2 (line 296) | function forspec2(type, value) {
function forspec3 (line 301) | function forspec3(type) {
function functiondef (line 304) | function functiondef(type, value) {
function funarg (line 308) | function funarg(type, value) {
FILE: site/examples/friendlycode/codemirror2/mode/xml/xml.js
function inText (line 47) | function inText(stream, state) {
function inTag (line 101) | function inTag(stream, state) {
function inAttribute (line 122) | function inAttribute(quote) {
function inBlock (line 134) | function inBlock(style, terminator) {
function doctype (line 146) | function doctype(depth) {
function pass (line 168) | function pass() {
function cont (line 171) | function cont() {
function pushContext (line 176) | function pushContext(tagName, startOfLine) {
function popContext (line 186) | function popContext() {
function element (line 190) | function element(type) {
function endtag (line 211) | function endtag(startOfLine) {
function endclosetag (line 226) | function endclosetag(err) {
function maybePopContext (line 234) | function maybePopContext(nextTagName) {
function attributes (line 249) | function attributes(type) {
function attribute (line 255) | function attribute(type) {
function attvalue (line 260) | function attvalue(type) {
function attvaluemaybe (line 266) | function attvaluemaybe(type) {
FILE: site/examples/friendlycode/js/fc/current-page-manager.js
function defaultLoadPage (line 2) | function defaultLoadPage(window) {
function getPageFromHash (line 21) | function getPageFromHash() {
FILE: site/examples/friendlycode/js/fc/help.js
function HelpIndex (line 6) | function HelpIndex() {
function getHelp (line 31) | function getHelp(index, helpIndex) {
function normalizeTagName (line 62) | function normalizeTagName(tagName) {
function buildHelpIndex (line 71) | function buildHelpIndex(element, helpIndex, html) {
FILE: site/examples/friendlycode/js/fc/publisher.js
function Publisher (line 8) | function Publisher(baseURL) {
function fixDoctypeHeadBodyMunging (line 58) | function fixDoctypeHeadBodyMunging(html) {
FILE: site/examples/friendlycode/js/fc/ui/context-sensitive-help.js
function showHelp (line 39) | function showHelp(cursorIndex, help) {
function clearHelp (line 73) | function clearHelp() {
FILE: site/examples/friendlycode/js/fc/ui/editor-toolbar.js
function HintsUI (line 8) | function HintsUI(options) {
function onChangeTitle (line 52) | function onChangeTitle(title) {
FILE: site/examples/friendlycode/js/fc/ui/error-help.js
function pointAtPosition (line 8) | function pointAtPosition(codeMirror, pos) {
function reportError (line 44) | function reportError(error) {
function clearError (line 64) | function clearError() {
FILE: site/examples/friendlycode/js/fc/ui/gutter-pointer.js
function attrs (line 34) | function attrs(element, attributes) {
FILE: site/examples/friendlycode/js/fc/ui/history.js
function refreshButtons (line 10) | function refreshButtons() {
FILE: site/examples/friendlycode/js/fc/ui/live-preview.js
function LivePreview (line 6) | function LivePreview(options) {
FILE: site/examples/friendlycode/js/fc/ui/parsing-codemirror.js
function reparse (line 12) | function reparse() {
function onCursorActivity (line 27) | function onCursorActivity() {
FILE: site/examples/friendlycode/js/fc/ui/preview-to-editor-mapping.js
function pathTo (line 7) | function pathTo(root, descendant) {
function nodeToCode (line 23) | function nodeToCode(node, docFrag) {
function getParallelNode (line 38) | function getParallelNode(node, docFrag) {
function PreviewToEditorMapping (line 64) | function PreviewToEditorMapping(livePreview) {
FILE: site/examples/friendlycode/js/fc/ui/publish.js
function makeSharingHotLoader (line 10) | function makeSharingHotLoader(options) {
FILE: site/examples/friendlycode/js/fc/ui/relocator.js
function flipElementIfNeeded (line 11) | function flipElementIfNeeded() {
FILE: site/examples/friendlycode/js/fc/ui/text.js
function menuItem (line 10) | function menuItem(size) {
FILE: site/examples/friendlycode/js/friendlycode.js
function doneLoading (line 44) | function doneLoading() {
FILE: site/examples/friendlycode/js/jquery.tipsy.js
function maybeCall (line 8) | function maybeCall(thing, ctx) {
function Tipsy (line 12) | function Tipsy(element, options) {
function get (line 136) | function get(ele) {
function enter (line 145) | function enter() {
function leave (line 156) | function leave() {
FILE: site/examples/friendlycode/js/lscache.js
function supportsStorage (line 47) | function supportsStorage() {
function supportsJSON (line 66) | function supportsJSON() {
function expirationKey (line 79) | function expirationKey(key) {
function currentTime (line 87) | function currentTime() {
function getItem (line 95) | function getItem(key) {
function setItem (line 99) | function setItem(key, value) {
function removeItem (line 105) | function removeItem(key) {
FILE: site/examples/friendlycode/slowparse/demo/render-dom.js
function makeAttributeList (line 6) | function makeAttributeList(node) {
function renderTextNode (line 19) | function renderTextNode(node) {
function renderElement (line 26) | function renderElement(node) {
FILE: site/examples/friendlycode/slowparse/demo/tag-colors.js
function tagNameToNumber (line 34) | function tagNameToNumber(tagName) {
FILE: site/examples/friendlycode/slowparse/slowparse.js
function replaceEntityRefs (line 47) | function replaceEntityRefs(text) {
function ParseError (line 69) | function ParseError(type) {
function Stream (line 319) | function Stream(text) {
function CSSParser (line 449) | function CSSParser(stream, domBuilder) {
function HTMLParser (line 933) | function HTMLParser(stream, domBuilder) {
function DOMBuilder (line 1277) | function DOMBuilder(document) {
FILE: site/examples/friendlycode/slowparse/spec/spec.js
function sourceText (line 11) | function sourceText(interval) {
function refreshAnchor (line 55) | function refreshAnchor() {
function runTests (line 68) | function runTests(module, test, ok, deepEqual, cb) {
FILE: site/examples/friendlycode/slowparse/test/qunit.js
function run (line 249) | function run() {
function F (line 450) | function F(){}
function done (line 834) | function done() {
function validTest (line 900) | function validTest( name ) {
function extractStacktrace (line 927) | function extractStacktrace( e, offset ) {
function sourceFromStacktrace (line 950) | function sourceFromStacktrace(offset) {
function escapeInnerText (line 958) | function escapeInnerText(s) {
function synchronize (line 973) | function synchronize( callback, last ) {
function process (line 981) | function process( last ) {
function saveGlobal (line 1002) | function saveGlobal() {
function checkPollution (line 1015) | function checkPollution( name ) {
function diff (line 1031) | function diff( a, b ) {
function extend (line 1045) | function extend(a, b) {
function addEvent (line 1059) | function addEvent(elem, type, fn) {
function id (line 1069) | function id(name) {
function registerLoggingCallback (line 1074) | function registerLoggingCallback(key){
function runLoggingCallbacks (line 1081) | function runLoggingCallbacks(key, scope, args) {
function bindCallbacks (line 1103) | function bindCallbacks(o, callbacks, args) {
function useStrictEquality (line 1121) | function useStrictEquality(b, a) {
function quote (line 1288) | function quote( str ) {
function literal (line 1291) | function literal( o ) {
function join (line 1294) | function join( pre, arr, post ) {
function array (line 1306) | function array( arr, stack ) {
function getText (line 1485) | function getText( elems ) {
function inArray (line 1505) | function inArray( elem, array ) {
function diff (line 1534) | function diff(o, n) {
FILE: site/examples/friendlycode/slowparse/test/test-tree-inspectors.js
function findJS (line 13) | function findJS(html) {
FILE: site/examples/friendlycode/slowparse/test/testing-utils.js
function documentFragmentHTML (line 2) | function documentFragmentHTML(doc) {
function assertParseIntervals (line 12) | function assertParseIntervals(html, node, name, map) {
function parseWithoutErrors (line 41) | function parseWithoutErrors(html) {
function testManySnippets (line 53) | function testManySnippets(name, htmlStrings, cb) {
function testStyleSheet (line 62) | function testStyleSheet(name, cssList, cb) {
FILE: site/examples/friendlycode/slowparse/vendor/brocco.js
function generateDocumentation (line 56) | function generateDocumentation(source, config, callback) {
function parse (line 97) | function parse(source, code) {
function highlight (line 134) | function highlight(source, sections, config, callback) {
function generateHtml (line 159) | function generateHtml(source, sections, config) {
function codeMirrorHighlighter (line 236) | function codeMirrorHighlighter(language, fragments, cb) {
function nullHighlighter (line 305) | function nullHighlighter(language, fragments, cb) {
function defaultTemplate (line 317) | function defaultTemplate(context) {
function insertHtmlIntoBody (line 367) | function insertHtmlIntoBody(html) {
function htmlEscape (line 383) | function htmlEscape(text) {
function getSourceFile (line 393) | function getSourceFile(filename, cb) {
function getLanguage (line 412) | function getLanguage(source) {
function processLanguages (line 417) | function processLanguages(languages) {
FILE: site/examples/friendlycode/slowparse/vendor/codemirror2/lib/codemirror.js
function CodeMirror (line 11) | function CodeMirror(place, givenOptions) {
function save (line 1892) | function save() {textarea.value = instance.getValue();}
function wrappedSubmit (line 1898) | function wrappedSubmit() {
function copyState (line 1928) | function copyState(mode, state) {
function startState (line 1940) | function startState(mode, a1, a2) {
function StringStream (line 1946) | function StringStream(string) {
function cased (line 1984) | function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
function MarkedText (line 2000) | function MarkedText(from, to, className, set) {
function Bookmark (line 2030) | function Bookmark(pos) {
function Line (line 2066) | function Line(text, styles) {
function span (line 2225) | function span(text, style) {
function nextMark (line 2250) | function nextMark() {
function copyStyles (line 2297) | function copyStyles(from, to, source, dest) {
function LeafChunk (line 2313) | function LeafChunk(lines) {
function BranchChunk (line 2345) | function BranchChunk(children) {
function getLineAt (line 2443) | function getLineAt(chunk, n) {
function lineNo (line 2453) | function lineNo(line) {
function lineAtHeight (line 2464) | function lineAtHeight(chunk, h) {
function heightAtLine (line 2482) | function heightAtLine(chunk, n) {
function History (line 2499) | function History() {
function stopMethod (line 2530) | function stopMethod() {e_stop(this);}
function addStop (line 2532) | function addStop(event) {
function e_preventDefault (line 2537) | function e_preventDefault(e) {
function e_stopPropagation (line 2541) | function e_stopPropagation(e) {
function e_stop (line 2545) | function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
function e_target (line 2546) | function e_target(e) {return e.target || e.srcElement;}
function e_button (line 2547) | function e_button(e) {
function connect (line 2556) | function connect(node, type, handler, disconnect) {
function Delayed (line 2568) | function Delayed() {this.id = null;}
function countColumn (line 2601) | function countColumn(string, end) {
function computedStyle (line 2613) | function computedStyle(elt) {
function eltOffset (line 2620) | function eltOffset(node, screen) {
function eltText (line 2656) | function eltText(node) {
function posEq (line 2661) | function posEq(a, b) {return a.line == b.line && a.ch == b.ch;}
function posLess (line 2662) | function posLess(a, b) {return a.line < b.line || (a.line == b.line && a...
function copyPos (line 2663) | function copyPos(x) {return {line: x.line, ch: x.ch};}
function htmlEscape (line 2666) | function htmlEscape(str) {
function editEnd (line 2680) | function editEnd(from, to) {
function indexOf (line 2688) | function indexOf(collection, elt) {
FILE: site/examples/friendlycode/slowparse/vendor/codemirror2/mode/css/css.js
function ret (line 3) | function ret(style, tp) {type = tp; return style;}
function tokenBase (line 5) | function tokenBase(stream, state) {
function tokenCComment (line 46) | function tokenCComment(stream, state) {
function tokenSGMLComment (line 58) | function tokenSGMLComment(stream, state) {
function tokenString (line 70) | function tokenString(quote) {
FILE: site/examples/friendlycode/slowparse/vendor/codemirror2/mode/htmlmixed/htmlmixed.js
function html (line 6) | function html(stream, state) {
function maybeBackup (line 22) | function maybeBackup(stream, pat, style) {
function javascript (line 28) | function javascript(stream, state) {
function css (line 38) | function css(stream, state) {
FILE: site/examples/friendlycode/slowparse/vendor/codemirror2/mode/javascript/javascript.js
function kw (line 8) | function kw(type) {return {type: type, style: "keyword"};}
function chain (line 24) | function chain(stream, state, f) {
function nextUntilUnescaped (line 29) | function nextUntilUnescaped(stream, end) {
function ret (line 42) | function ret(tp, style, cont) {
function jsTokenBase (line 47) | function jsTokenBase(stream, state) {
function jsTokenString (line 95) | function jsTokenString(quote) {
function jsTokenComment (line 103) | function jsTokenComment(stream, state) {
function JSLexical (line 119) | function JSLexical(indented, column, type, align, prev, info) {
function inScope (line 128) | function inScope(state, varname) {
function parseJS (line 133) | function parseJS(state, style, type, content, stream) {
function pass (line 157) | function pass() {
function cont (line 160) | function cont() {
function register (line 164) | function register(varname) {
function pushcontext (line 177) | function pushcontext() {
function popcontext (line 181) | function popcontext() {
function pushlex (line 185) | function pushlex(type, info) {
function poplex (line 193) | function poplex() {
function expect (line 203) | function expect(wanted) {
function statement (line 211) | function statement(type) {
function expression (line 229) | function expression(type) {
function maybeexpression (line 239) | function maybeexpression(type) {
function maybeoperator (line 244) | function maybeoperator(type, value) {
function maybelabel (line 252) | function maybelabel(type) {
function property (line 256) | function property(type) {
function objprop (line 259) | function objprop(type) {
function commasep (line 263) | function commasep(what, end) {
function block (line 274) | function block(type) {
function vardef1 (line 278) | function vardef1(type, value) {
function vardef2 (line 282) | function vardef2(type, value) {
function forspec1 (line 286) | function forspec1(type) {
function formaybein (line 292) | function formaybein(type, value) {
function forspec2 (line 296) | function forspec2(type, value) {
function forspec3 (line 301) | function forspec3(type) {
function functiondef (line 304) | function functiondef(type, value) {
function funarg (line 308) | function funarg(type, value) {
FILE: site/examples/friendlycode/slowparse/vendor/codemirror2/mode/xml/xml.js
function inText (line 14) | function inText(stream, state) {
function inTag (line 60) | function inTag(stream, state) {
function inAttribute (line 81) | function inAttribute(quote) {
function inBlock (line 93) | function inBlock(style, terminator) {
function pass (line 107) | function pass() {
function cont (line 110) | function cont() {
function pushContext (line 115) | function pushContext(tagName, startOfLine) {
function popContext (line 125) | function popContext() {
function element (line 129) | function element(type) {
function endtag (line 148) | function endtag(startOfLine) {
function endclosetag (line 157) | function endclosetag(err) {
function attributes (line 166) | function attributes(type) {
function attvalue (line 172) | function attvalue(type) {
function attvaluemaybe (line 177) | function attvaluemaybe(type) {
FILE: site/examples/friendlycode/slowparse/vendor/showdown.js
function char2hex (line 1170) | function char2hex(ch) {
FILE: site/examples/friendlycode/test/define-tests.js
function defineTests (line 15) | function defineTests(deps, fn) {
FILE: site/examples/friendlycode/test/preview-to-editor-mapping/test-preview-to-editor-mapping.js
function spaces (line 12) | function spaces(n) {
function domStructure (line 18) | function domStructure(node, lines, indent) {
function n2cTest (line 30) | function n2cTest(options) {
FILE: site/examples/friendlycode/test/qunit.js
function run (line 249) | function run() {
function F (line 450) | function F(){}
function done (line 834) | function done() {
function validTest (line 900) | function validTest( name ) {
function extractStacktrace (line 927) | function extractStacktrace( e, offset ) {
function sourceFromStacktrace (line 950) | function sourceFromStacktrace(offset) {
function escapeInnerText (line 958) | function escapeInnerText(s) {
function synchronize (line 973) | function synchronize( callback, last ) {
function process (line 981) | function process( last ) {
function saveGlobal (line 1002) | function saveGlobal() {
function checkPollution (line 1015) | function checkPollution( name ) {
function diff (line 1031) | function diff( a, b ) {
function extend (line 1045) | function extend(a, b) {
function addEvent (line 1059) | function addEvent(elem, type, fn) {
function id (line 1069) | function id(name) {
function registerLoggingCallback (line 1074) | function registerLoggingCallback(key){
function runLoggingCallbacks (line 1081) | function runLoggingCallbacks(key, scope, args) {
function bindCallbacks (line 1103) | function bindCallbacks(o, callbacks, args) {
function useStrictEquality (line 1121) | function useStrictEquality(b, a) {
function quote (line 1288) | function quote( str ) {
function literal (line 1291) | function literal( o ) {
function join (line 1294) | function join( pre, arr, post ) {
function array (line 1306) | function array( arr, stack ) {
function getText (line 1485) | function getText( elems ) {
function inArray (line 1505) | function inArray( elem, array ) {
function diff (line 1534) | function diff(o, n) {
FILE: site/examples/friendlycode/test/test-app.js
function appTest (line 6) | function appTest(name, cb) {
FILE: site/examples/friendlycode/test/test-current-page-manager.js
function FakeWindow (line 9) | function FakeWindow() {
FILE: site/examples/friendlycode/test/test-help.js
function helpAt (line 6) | function helpAt(index, searchString, html) {
function assertHighlightIntervals (line 10) | function assertHighlightIntervals(index, searchString, strings, html) {
function buildIndex (line 22) | function buildIndex(html) {
FILE: site/examples/friendlycode/test/test-indexable-codemirror.js
function icmTest (line 9) | function icmTest(name, cb) {
FILE: site/examples/friendlycode/test/test-mark-tracker.js
function mtTest (line 10) | function mtTest(name, cb) {
FILE: site/examples/friendlycode/test/test-parsing-codemirror.js
function pcmTest (line 9) | function pcmTest(name, cb) {
FILE: site/examples/friendlycode/test/test-templates.js
function contains (line 6) | function contains(str, terms) {
FILE: site/examples/madlibs/js/app.js
function reveal (line 1) | function reveal() {
function hide (line 7) | function hide() {
FILE: site/examples/madlibs/js/bootstrap.js
function transitionEnd (line 33) | function transitionEnd() {
function removeElement (line 118) | function removeElement() {
function clearMenus (line 758) | function clearMenus() {
function getParent (line 769) | function getParent($this) {
function ScrollSpy (line 1571) | function ScrollSpy(element, options) {
function next (line 1772) | function next() {
FILE: site/examples/persona/md5.js
function p (line 14) | function p(a,k,b,h,l,j,m){a=a+(k&b|~k&h)+l+m;return(a<<j|a>>>32-j)+k}
function m (line 14) | function m(a,k,b,h,l,j,m){a=a+(k&h|b&~h)+l+m;return(a<<j|a>>>32-j)+k}
function l (line 14) | function l(a,k,b,h,l,j,m){a=a+(k^b^h)+l+m;return(a<<j|a>>>32-j)+k}
function n (line 14) | function n(a,k,b,h,l,j,m){a=a+(b^(k|~h))+l+m;return(a<<j|a>>>32-j)+k}
FILE: site/examples/todo/js/app.js
function addItem (line 24) | function addItem(description, id) {
function getItems (line 54) | function getItems() {
function save (line 72) | function save() {
FILE: site/examples/todo/js/bootstrap.js
function transitionEnd (line 33) | function transitionEnd() {
function removeElement (line 118) | function removeElement() {
function clearMenus (line 758) | function clearMenus() {
function getParent (line 769) | function getParent($this) {
function ScrollSpy (line 1571) | function ScrollSpy(element, options) {
function next (line 1772) | function next() {
FILE: site/js/bootstrap.js
function transitionEnd (line 33) | function transitionEnd() {
function removeElement (line 118) | function removeElement() {
function clearMenus (line 758) | function clearMenus() {
function getParent (line 769) | function getParent($this) {
function ScrollSpy (line 1571) | function ScrollSpy(element, options) {
function next (line 1772) | function next() {
FILE: site/js/how-animations.js
function jsUpdateSize (line 4) | function jsUpdateSize(){
function startFirstAnimation (line 59) | function startFirstAnimation() {
function startSecondAnimation (line 72) | function startSecondAnimation() {
function fadeinDock (line 97) | function fadeinDock() {
function fadeoutDock (line 104) | function fadeoutDock() {
function startit (line 110) | function startit(){
function startCursorAnimation (line 125) | function startCursorAnimation(){
FILE: site/js/retina.js
function t (line 3) | function t(e){this.path=e;var t=this.path.split("."),n=t.slice(0,t.lengt...
function n (line 3) | function n(e){this.el=e,this.path=new t(this.el.getAttribute("src"));var...
function n (line 3) | function n(){t.el.complete?(t.el.setAttribute("width",t.el.offsetWidth),...
FILE: site/js/scrollspy.js
function ScrollSpy (line 26) | function ScrollSpy(element, options) {
FILE: site/js/source-code.js
function showDl (line 13) | function showDl() {
function hideDl (line 19) | function hideDl() {
FILE: togetherjs/chat.js
function save (line 236) | function save(msg) {
function saveChatMessage (line 346) | function saveChatMessage(obj) {
function loadChatLog (line 366) | function loadChatLog() {
FILE: togetherjs/console.js
function rpad (line 227) | function rpad(s, len, pad) {
function lpad (line 236) | function lpad(s, len, pad) {
function lpadLines (line 245) | function lpadLines(s, len, pad) {
function logFunction (line 266) | function logFunction(name, level) {
FILE: togetherjs/cursor.js
function mousemove (line 237) | function mousemove(event) {
function makeCursor (line 286) | function makeCursor(color) {
function scroll (line 315) | function scroll() {
function _scrollRefresh (line 332) | function _scrollRefresh() {
function documentClick (line 410) | function documentClick(event) {
function displayClick (line 492) | function displayClick(pos, color) {
function documentKeydown (line 513) | function documentKeydown(event) {
FILE: togetherjs/elementFinder.js
function search (line 200) | function search(start, height) {
FILE: togetherjs/forms.js
function suppressSync (line 15) | function suppressSync(element) {
function maybeChange (line 25) | function maybeChange(event) {
function change (line 34) | function change(event) {
function sendData (line 41) | function sendData(attrs) {
function isCheckable (line 81) | function isCheckable(el) {
function buildTrackers (line 432) | function buildTrackers() {
function destroyTrackers (line 446) | function destroyTrackers() {
function elementTracked (line 453) | function elementTracked(el) {
function getTracker (line 463) | function getTracker(el, name) {
function isText (line 482) | function isText(el) {
function getValue (line 495) | function getValue(el) {
function getElementType (line 504) | function getElementType(el) {
function setValue (line 518) | function setValue(el, value) {
function maybeSendUpdate (line 540) | function maybeSendUpdate(element, history, tracker) {
function sendInit (line 638) | function sendInit() {
function setInit (line 683) | function setInit() {
function focus (line 760) | function focus(event) {
function blur (line 772) | function blur(event) {
function createFocusElement (line 802) | function createFocusElement(peer, around) {
FILE: togetherjs/libs/almond.js
function hasProp (line 21) | function hasProp(obj, prop) {
function normalize (line 33) | function normalize(name, baseName) {
function makeRequire (line 140) | function makeRequire(relName, forceSync) {
function makeNormalize (line 149) | function makeNormalize(relName) {
function makeLoad (line 155) | function makeLoad(depName) {
function callDep (line 161) | function callDep(name) {
function splitPrefix (line 178) | function splitPrefix(name) {
function makeConfig (line 231) | function makeConfig(name) {
FILE: togetherjs/libs/require-nomin.js
function isFunction (line 41) | function isFunction(it) {
function isArray (line 45) | function isArray(it) {
function each (line 53) | function each(ary, func) {
function eachReverse (line 68) | function eachReverse(ary, func) {
function hasProp (line 79) | function hasProp(obj, prop) {
function getOwn (line 83) | function getOwn(obj, prop) {
function eachProp (line 92) | function eachProp(obj, func) {
function mixin (line 107) | function mixin(target, source, force, deepStringMixin) {
function bind (line 127) | function bind(obj, fn) {
function scripts (line 133) | function scripts() {
function defaultOnError (line 137) | function defaultOnError(err) {
function getGlobal (line 143) | function getGlobal(value) {
function makeError (line 162) | function makeError(id, msg, err, requireModules) {
function newContext (line 194) | function newContext(contextName) {
function getInteractiveScript (line 1907) | function getInteractiveScript() {
FILE: togetherjs/libs/require.js
function H (line 7) | function H(b){return"[object Function]"===L.call(b)}
function I (line 7) | function I(b){return"[object Array]"===L.call(b)}
function y (line 7) | function y(b,c){if(b){var d;for(d=0;d<b.length&&(!b[d]||!c(b[d],d,b));d+...
function M (line 7) | function M(b,c){if(b){var d;for(d=b.length-1;-1<d&&(!b[d]||!c(b[d],d,b))...
function s (line 7) | function s(b,c){return ga.call(b,c)}
function l (line 7) | function l(b,c){return s(b,c)&&b[c]}
function F (line 7) | function F(b,c){for(var d in b)if(s(b,d)&&c(b[d],d))break}
function Q (line 7) | function Q(b,c,d,h){c&&F(c,function(c,j){if(d||!s(b,j))h&&"string"!==typ...
function u (line 8) | function u(b,c){return function(){return c.apply(b,arguments)}}
function aa (line 8) | function aa(b){throw b;}
function ba (line 8) | function ba(b){if(!b)return b;var c=Z;y(b.split("."),function(b){c=c[b]}...
function A (line 8) | function A(b,c,d,h){c=Error(c+"\nhttp://requirejs.org/docs/errors.html#"...
function ha (line 8) | function ha(b){function c(a,f,b){var e,m,c,g,d,h,j,i=f&&f.split("/");e=i...
FILE: togetherjs/libs/tinycolor.js
function tinycolor (line 16) | function tinycolor (color, opts) {
function inputToRGB (line 163) | function inputToRGB(color) {
function rgbToRgb (line 230) | function rgbToRgb(r, g, b){
function rgbToHsl (line 242) | function rgbToHsl(r, g, b) {
function hslToRgb (line 273) | function hslToRgb(h, s, l) {
function rgbToHsv (line 307) | function rgbToHsv(r, g, b) {
function hsvToRgb (line 337) | function hsvToRgb(h, s, v) {
function rgbToHex (line 360) | function rgbToHex(r, g, b) {
function flip (line 707) | function flip(o) {
function bound01 (line 718) | function bound01(n, max) {
function clamp01 (line 739) | function clamp01(val) {
function parseHex (line 744) | function parseHex(val) {
function isOnePointZero (line 750) | function isOnePointZero(n) {
function isPercentage (line 755) | function isPercentage(n) {
function pad2 (line 760) | function pad2(c) {
function convertToPercentage (line 765) | function convertToPercentage(n) {
function stringInputToObject (line 804) | function stringInputToObject(color) {
FILE: togetherjs/libs/walkabout/lib/esprima.js
function assert (line 189) | function assert(condition, message) {
function sliceSource (line 195) | function sliceSource(from, to) {
function isDecimalDigit (line 205) | function isDecimalDigit(ch) {
function isHexDigit (line 209) | function isHexDigit(ch) {
function isOctalDigit (line 213) | function isOctalDigit(ch) {
function isWhiteSpace (line 220) | function isWhiteSpace(ch) {
function isLineTerminator (line 229) | function isLineTerminator(ch) {
function isIdentifierStart (line 235) | function isIdentifierStart(ch) {
function isIdentifierPart (line 241) | function isIdentifierPart(ch) {
function isFutureReservedWord (line 250) | function isFutureReservedWord(id) {
function isStrictModeReservedWord (line 266) | function isStrictModeReservedWord(id) {
function isRestrictedWord (line 285) | function isRestrictedWord(id) {
function isKeyword (line 291) | function isKeyword(id) {
function nextChar (line 345) | function nextChar() {
function skipComment (line 351) | function skipComment() {
function scanHexEscape (line 423) | function scanHexEscape(prefix) {
function scanIdentifier (line 438) | function scanIdentifier() {
function scanPunctuator (line 552) | function scanPunctuator() {
function scanNumericLiteral (line 718) | function scanNumericLiteral() {
function scanStringLiteral (line 859) | function scanStringLiteral() {
function scanRegExp (line 963) | function scanRegExp() {
function isIdentifierName (line 1054) | function isIdentifierName(token) {
function advance (line 1061) | function advance() {
function lex (line 1098) | function lex() {
function lookahead (line 1114) | function lookahead() {
function peekLineTerminator (line 1134) | function peekLineTerminator() {
function throwError (line 1151) | function throwError(token, messageFormat) {
function throwErrorTolerant (line 1176) | function throwErrorTolerant() {
function throwUnexpected (line 1191) | function throwUnexpected(token) {
function expect (line 1225) | function expect(value) {
function expectKeyword (line 1235) | function expectKeyword(keyword) {
function match (line 1244) | function match(value) {
function matchKeyword (line 1251) | function matchKeyword(keyword) {
function matchAssign (line 1258) | function matchAssign() {
function consumeSemicolon (line 1279) | function consumeSemicolon() {
function isLeftHandSide (line 1308) | function isLeftHandSide(expr) {
function parseArrayInitialiser (line 1314) | function parseArrayInitialiser() {
function parsePropertyFunction (line 1342) | function parsePropertyFunction(param, first) {
function parseObjectPropertyKey (line 1364) | function parseObjectPropertyKey() {
function parseObjectProperty (line 1383) | function parseObjectProperty() {
function parseObjectInitialiser (line 1442) | function parseObjectInitialiser() {
function parsePrimaryExpression (line 1492) | function parsePrimaryExpression() {
function parseArguments (line 1560) | function parseArguments() {
function parseNonComputedProperty (line 1580) | function parseNonComputedProperty() {
function parseNonComputedMember (line 1593) | function parseNonComputedMember() {
function parseComputedMember (line 1599) | function parseComputedMember() {
function parseNewExpression (line 1611) | function parseNewExpression() {
function parseLeftHandSideExpressionAllowCall (line 1629) | function parseLeftHandSideExpressionAllowCall() {
function parseLeftHandSideExpression (line 1662) | function parseLeftHandSideExpression() {
function parsePostfixExpression (line 1690) | function parsePostfixExpression() {
function parseUnaryExpression (line 1716) | function parseUnaryExpression() {
function parseMultiplicativeExpression (line 1766) | function parseMultiplicativeExpression() {
function parseAdditiveExpression (line 1783) | function parseAdditiveExpression() {
function parseShiftExpression (line 1800) | function parseShiftExpression() {
function parseRelationalExpression (line 1816) | function parseRelationalExpression() {
function parseEqualityExpression (line 1839) | function parseEqualityExpression() {
function parseBitwiseANDExpression (line 1856) | function parseBitwiseANDExpression() {
function parseBitwiseXORExpression (line 1872) | function parseBitwiseXORExpression() {
function parseBitwiseORExpression (line 1888) | function parseBitwiseORExpression() {
function parseLogicalANDExpression (line 1906) | function parseLogicalANDExpression() {
function parseLogicalORExpression (line 1922) | function parseLogicalORExpression() {
function parseConditionalExpression (line 1940) | function parseConditionalExpression() {
function parseAssignmentExpression (line 1966) | function parseAssignmentExpression() {
function parseExpression (line 1996) | function parseExpression() {
function parseStatementList (line 2019) | function parseStatementList() {
function parseBlock (line 2037) | function parseBlock() {
function parseVariableIdentifier (line 2054) | function parseVariableIdentifier() {
function parseVariableDeclaration (line 2067) | function parseVariableDeclaration(kind) {
function parseVariableDeclarationList (line 2091) | function parseVariableDeclarationList(kind) {
function parseVariableStatement (line 2105) | function parseVariableStatement() {
function parseConstLetDeclaration (line 2125) | function parseConstLetDeclaration(kind) {
function parseEmptyStatement (line 2143) | function parseEmptyStatement() {
function parseExpressionStatement (line 2153) | function parseExpressionStatement() {
function parseIfStatement (line 2166) | function parseIfStatement() {
function parseDoWhileStatement (line 2196) | function parseDoWhileStatement() {
function parseWhileStatement (line 2227) | function parseWhileStatement() {
function parseForVariableDeclaration (line 2252) | function parseForVariableDeclaration() {
function parseForStatement (line 2262) | function parseForStatement() {
function parseContinueStatement (line 2350) | function parseContinueStatement() {
function parseBreakStatement (line 2403) | function parseBreakStatement() {
function parseReturnStatement (line 2456) | function parseReturnStatement() {
function parseWithStatement (line 2501) | function parseWithStatement() {
function parseSwitchCase (line 2527) | function parseSwitchCase() {
function parseSwitchStatement (line 2559) | function parseSwitchStatement() {
function parseThrowStatement (line 2613) | function parseThrowStatement() {
function parseCatchClause (line 2634) | function parseCatchClause() {
function parseTryStatement (line 2656) | function parseTryStatement() {
function parseDebuggerStatement (line 2687) | function parseDebuggerStatement() {
function parseStatement (line 2699) | function parseStatement() {
function parseFunctionSourceElements (line 2787) | function parseFunctionSourceElements() {
function parseFunctionDeclaration (line 2852) | function parseFunctionDeclaration() {
function parseFunctionExpression (line 2933) | function parseFunctionExpression() {
function parseSourceElement (line 3019) | function parseSourceElement() {
function parseSourceElements (line 3039) | function parseSourceElements() {
function parseProgram (line 3077) | function parseProgram() {
function addComment (line 3090) | function addComment(type, value, start, end, loc) {
function scanComment (line 3111) | function scanComment() {
function filterCommentLocation (line 3233) | function filterCommentLocation() {
function collectToken (line 3254) | function collectToken() {
function collectRegex (line 3286) | function collectRegex() {
function filterTokenLocation (line 3325) | function filterTokenLocation() {
function createLiteral (line 3346) | function createLiteral(token) {
function createRawLiteral (line 3353) | function createRawLiteral(token) {
function createLocationMarker (line 3361) | function createLocationMarker() {
function trackLeftHandSideExpression (line 3403) | function trackLeftHandSideExpression() {
function trackLeftHandSideExpressionAllowCall (line 3436) | function trackLeftHandSideExpressionAllowCall() {
function wrapTrackingFunction (line 3477) | function wrapTrackingFunction(range, loc) {
function patch (line 3531) | function patch() {
function unpatch (line 3638) | function unpatch() {
function stringToArray (line 3692) | function stringToArray(str) {
function parse (line 3702) | function parse(code, options) {
FILE: togetherjs/libs/walkabout/lib/falafel.js
function insertHelpers (line 69) | function insertHelpers (node, parent, chunks) {
FILE: togetherjs/libs/walkabout/node-proxy.js
function loadEtcHosts (line 13) | function loadEtcHosts(callback) {
function forwardRequest (line 102) | function forwardRequest(addresses, port, request, response) {
function translateHtml (line 185) | function translateHtml(s) {
function translateJavascript (line 194) | function translateJavascript(s) {
function write500 (line 198) | function write500(error, response) {
FILE: togetherjs/libs/walkabout/test_overlap.js
function show (line 9) | function show(el) {
function hide (line 13) | function hide(el) {
FILE: togetherjs/libs/walkabout/test_walkabout.js
function log (line 4) | function log(text) {
function logger (line 12) | function logger(name) {
FILE: togetherjs/libs/walkabout/test_walkabout_nojquery.js
function getElement (line 4) | function getElement(id) {
function text (line 12) | function text(t) {
function log (line 16) | function log(t) {
function logger (line 24) | function logger(name) {
FILE: togetherjs/libs/walkabout/traverse-rewrite.js
function main (line 16) | function main() {
function help (line 96) | function help() {
function rewriteJavascript (line 120) | function rewriteJavascript(options, dirs) {
function rewriteHtml (line 141) | function rewriteHtml(options, dirs) {
function findFiles (line 178) | function findFiles(dirs, ext, excludes, copied, files) {
function exclude (line 213) | function exclude(excludes, filename) {
FILE: togetherjs/libs/walkabout/walkabout.js
function init (line 1) | function init(Walkabout) {
FILE: togetherjs/libs/whrandom/mersenne.js
function RandomStream (line 55) | function RandomStream(seed) {
FILE: togetherjs/libs/whrandom/random.js
function RandomStream (line 3) | function RandomStream(seed) {
FILE: togetherjs/linkify.js
function linkify (line 5) | function linkify(el) {
FILE: togetherjs/peers.js
function serialize (line 437) | function serialize() {
function deserialize (line 447) | function deserialize(obj) {
function checkActivity (line 490) | function checkActivity() {
function storeSerialization (line 561) | function storeSerialization() {
FILE: togetherjs/playback.js
function parseLogs (line 44) | function parseLogs(logs) {
FILE: togetherjs/recorder.js
function display (line 12) | function display(el) {
function sendHello (line 70) | function sendHello(helloBack) {
function sendLogs (line 84) | function sendLogs(req) {
FILE: togetherjs/session.js
function openChannel (line 102) | function openChannel() {
function processFirstHello (line 185) | function processFirstHello(msg) {
function sendHello (line 198) | function sendHello(helloBack) {
function getRoomName (line 242) | function getRoomName(prefix, maxSize) {
function initIdentityId (line 253) | function initIdentityId() {
function initShareId (line 274) | function initShareId() {
function initStartTarget (line 370) | function initStartTarget() {
function hashchangeEvent (line 462) | function hashchangeEvent() {
function resizeEvent (line 468) | function resizeEvent() {
FILE: togetherjs/templates.js
function clean (line 10) | function clean(t) {
FILE: togetherjs/tests/ace.js
function h (line 1) | function h(a){var c=function(a,b){return e("",a,b)},f=b;a&&(b[a]||(b[a]=...
function g (line 1) | function g(a){return(a.global?"g":"")+(a.ignoreCase?"i":"")+(a.multiline...
function h (line 1) | function h(a,b,c){if(Array.prototype.indexOf)return a.indexOf(b,c);for(v...
function p (line 1) | function p(a){try{return Object.defineProperty(a,"sentinel",{}),"sentine...
function g (line 1) | function g(a,b,c){var f=0;!e.isOpera||"KeyboardEvent"in window||!e.isMac...
function f (line 1) | function f(g){c(g),e||(e=!0,d(g)),b.removeListener(a,"mousemove",c),b.re...
function d (line 1) | function d(a){b&&b(a),c&&c(a),document.removeEventListener("mousemove",b...
function l (line 1) | function l(a){try{a?(c.value=g,c.selectionStart=0,c.selectionEnd=1):c.se...
function m (line 1) | function m(a){if(!i){var d=a||c.value;d&&(d.length>1&&(d.charAt(0)==g?d=...
function v (line 1) | function v(){return document.activeElement===c}
function w (line 1) | function w(){setTimeout(function(){k&&(c.style.cssText=k,k=""),m(),b.ren...
function g (line 1) | function g(a){a.$clickSelection=null;var b=a.editor;b.setDefaultHandler(...
function h (line 1) | function h(a,b,c,d){return Math.sqrt(Math.pow(c-a,2)+Math.pow(d-b,2))}
function i (line 1) | function i(a,b){if(a.start.row==a.end.row)var c=2*b.column-a.start.colum...
function f (line 1) | function f(a){function j(){h=d.createElement("div"),h.className="ace_gut...
function d (line 1) | function d(a){a.on("click",function(b){var c=b.getDocumentPosition(),d=a...
function s (line 1) | function s(a){return a<4352?!1:a>=4352&&a<=4447||a>=4515&&a<=4519||a>=46...
function i (line 1) | function i(a){if(e.$modes[b])return c(e.$modes[b]);e.$modes[b]=new a.Mod...
function k (line 1) | function k(a,b){if(!d.get("packaged"))return b();g.loadScript(d.moduleUr...
function d (line 1) | function d(a){var c=a.action=="insertText"||a.action=="insertLines";retu...
function g (line 1) | function g(b){var d=a.slice(e,b),g=d.length;d.join("").replace(/12/g,fun...
function g (line 1) | function g(a){return a.replace(/-(.)/g,function(a,b){return b.toUpperCas...
function d (line 1) | function d(a){var c=/\w{4}/g;for(var d in a)b.packages[d]=a[d].replace(c...
function h (line 1) | function h(){this.getFoldAt=function(a,b,c){var d=this.getFoldLine(a);if...
function e (line 1) | function e(a,b){this.foldData=a,Array.isArray(b)?this.folds=b:b=this.fol...
function f (line 1) | function f(){this.findMatchingBracket=function(a){if(a.column==0)return ...
function e (line 1) | function e(a,b){this.platform=b,this.commands={},this.commmandKeyBinding...
function e (line 1) | function e(a,b){return{win:a,mac:b}}
function h (line 1) | function h(a){e.importCssString(a.cssText,a.cssClass,c.container.ownerDo...
function e (line 1) | function e(a,b,c){var e=0,f=0;while(f+a[e].value.length<b){f+=a[e].value...
function l (line 1) | function l(a,b,c){return k.$options.wrap=!0,k.$options.needle=b,k.$optio...
function o (line 1) | function o(a,b){return a.row==b.row&&a.column==b.column}
function p (line 1) | function p(a){a.$onAddRange=a.$onAddRange.bind(a),a.$onRemoveRange=a.$on...
function q (line 1) | function q(a){function e(){c&&(d.style.cursor="",c=!1)}var b=a.textInput...
function e (line 1) | function e(a,b){return a.row==b.row&&a.column==b.column}
function f (line 1) | function f(a){var b=a.domEvent,c=b.altKey,f=b.shiftKey,g=a.getAccelKey()...
function e (line 1) | function e(a){this.keymapping=this.$buildKeymappingRegex(a)}
FILE: togetherjs/tests/codemirror4.js
function w (line 13) | function w(a,b){if(!(this instanceof w))return new w(a,b);this.options=b...
function x (line 13) | function x(a,b){var c=this,g=c.input=Wg("textarea",null,null,"position: ...
function y (line 13) | function y(a){a.doc.mode=w.getMode(a.options,a.doc.modeOption),z(a)}
function z (line 13) | function z(a){a.doc.iter(function(a){a.stateAfter&&(a.stateAfter=null),a...
function A (line 13) | function A(a){a.options.lineWrapping?(ch(a.display.wrapper,"CodeMirror-w...
function B (line 13) | function B(a){var b=wc(a.display),c=a.options.lineWrapping,d=c&&Math.max...
function C (line 13) | function C(a){var b=a.doc,c=B(a);b.iter(function(a){var b=c(a);b!=a.heig...
function D (line 13) | function D(a){var b=ue[a.options.keyMap],c=b.style;a.display.wrapper.cla...
function E (line 13) | function E(a){a.display.wrapper.className=a.display.wrapper.className.re...
function F (line 13) | function F(a){G(a),Pc(a),setTimeout(function(){P(a)},20)}
function G (line 13) | function G(a){var b=a.display.gutters,c=a.options.gutters;Yg(b);for(var ...
function H (line 13) | function H(a){var b=a.display.gutters.offsetWidth;a.display.sizer.style....
function I (line 13) | function I(a){if(0==a.height)return 0;for(var c,b=a.text.length,d=a;c=Ye...
function J (line 13) | function J(a){var b=a.display,c=a.doc;b.maxLine=Of(c,c.first),b.maxLineL...
function K (line 13) | function K(a){var b=Lg(a.gutters,"CodeMirror-linenumbers");-1==b&&a.line...
function L (line 13) | function L(a){return a.display.scroller.clientHeight-a.display.wrapper.c...
function M (line 13) | function M(a){var b=a.display.scroller;return{clientHeight:b.clientHeigh...
function N (line 13) | function N(a,b){b||(b=M(a));var c=a.display,d=kh(c.measure),e=b.docHeigh...
function O (line 13) | function O(a,b,c){var d=c&&null!=c.top?Math.max(0,c.top):a.scroller.scro...
function P (line 13) | function P(a){var b=a.display,c=b.view;if(b.alignWidgets||b.gutters.firs...
function Q (line 13) | function Q(a){if(!a.options.lineNumbers)return!1;var b=a.doc,c=R(a.optio...
function R (line 13) | function R(a,b){return String(a.lineNumberFormatter(b+a.firstLineNumber))}
function S (line 13) | function S(a){return a.scroller.getBoundingClientRect().left-a.sizer.get...
function T (line 13) | function T(a,b,c){var d=a.display;this.viewport=b,this.visible=O(d,a.doc...
function U (line 13) | function U(a,b){var c=a.display,d=a.doc;if(b.editorIsHidden)return Rc(a)...
function V (line 13) | function V(a,b){for(var c=b.force,d=b.viewport,e=!0;;e=!1){if(e&&a.optio...
function W (line 13) | function W(a,b){var c=new T(a,b);if(U(a,c)){V(a,c);var d=M(a);Pb(a),X(a,...
function X (line 13) | function X(a,b){a.display.sizer.style.minHeight=a.display.heightForcer.s...
function Y (line 13) | function Y(a,b){a.display.sizer.offsetWidth+a.display.gutters.offsetWidt...
function Z (line 13) | function Z(a){for(var b=a.display,c=b.lineDiv.offsetTop,f=0;f<b.view.len...
function $ (line 13) | function $(a){if(a.widgets)for(var b=0;b<a.widgets.length;++b)a.widgets[...
function _ (line 13) | function _(a){for(var b=a.display,c={},d={},e=b.gutters.firstChild,f=0;e...
function ab (line 13) | function ab(a,b,c){function i(b){var c=b.nextSibling;return f&&p&&a.disp...
function bb (line 13) | function bb(a,b,c,d){for(var e=0;e<b.changes.length;e++){var f=b.changes...
function cb (line 13) | function cb(a){return a.node==a.text&&(a.node=Wg("div",null,null,"positi...
function db (line 13) | function db(a){var b=a.bgClass?a.bgClass+" "+(a.line.bgClass||""):a.line...
function eb (line 13) | function eb(a,b){var c=a.display.externalMeasured;return c&&c.line==b.li...
function fb (line 13) | function fb(a,b){var c=b.text.className,d=eb(a,b);b.text==b.node&&(b.nod...
function gb (line 13) | function gb(a){db(a),a.line.wrapClass?cb(a).className=a.line.wrapClass:a...
function hb (line 13) | function hb(a,b,c,d){b.gutter&&(b.node.removeChild(b.gutter),b.gutter=nu...
function ib (line 13) | function ib(a,b){a.alignable&&(a.alignable=null);for(var d,c=a.node.firs...
function jb (line 13) | function jb(a,b,c,d){var e=eb(a,b);return b.text=b.node=e.pre,e.bgClass&...
function kb (line 13) | function kb(a,b){if(lb(a.line,a,b,!0),a.rest)for(var c=0;c<a.rest.length...
function lb (line 13) | function lb(a,b,c,d){if(a.widgets)for(var e=cb(b),f=0,g=a.widgets;f<g.le...
function mb (line 13) | function mb(a,b,c,d){if(a.noHScroll){(c.alignable||(c.alignable=[])).pus...
function pb (line 13) | function pb(a){return nb(a.line,a.ch)}
function qb (line 13) | function qb(a,b){return ob(a,b)<0?b:a}
function rb (line 13) | function rb(a,b){return ob(a,b)<0?a:b}
function sb (line 13) | function sb(a,b){this.ranges=a,this.primIndex=b}
function tb (line 13) | function tb(a,b){this.anchor=a,this.head=b}
function ub (line 13) | function ub(a,b){var c=a[b];a.sort(function(a,b){return ob(a.from(),b.fr...
function vb (line 13) | function vb(a,b){return new sb([new tb(a,b||a)],0)}
function wb (line 13) | function wb(a,b){return Math.max(a.first,Math.min(b,a.first+a.size-1))}
function xb (line 13) | function xb(a,b){if(b.line<a.first)return nb(a.first,0);var c=a.first+a....
function yb (line 13) | function yb(a,b){var c=a.ch;return null==c||c>b?nb(a.line,b):0>c?nb(a.li...
function zb (line 13) | function zb(a,b){return b>=a.first&&b<a.first+a.size}
function Ab (line 13) | function Ab(a,b){for(var c=[],d=0;d<b.length;d++)c[d]=xb(a,b[d]);return c}
function Bb (line 13) | function Bb(a,b,c,d){if(a.cm&&a.cm.display.shift||a.extend){var e=b.anch...
function Cb (line 13) | function Cb(a,b,c,d){Ib(a,new sb([Bb(a,a.sel.primary(),b,c)],0),d)}
function Db (line 13) | function Db(a,b,c){for(var d=[],e=0;e<a.sel.ranges.length;e++)d[e]=Bb(a,...
function Eb (line 13) | function Eb(a,b,c,d){var e=a.sel.ranges.slice(0);e[b]=c,Ib(a,ub(e,a.sel....
function Fb (line 13) | function Fb(a,b,c,d){Ib(a,vb(b,c),d)}
function Gb (line 13) | function Gb(a,b){var c={ranges:b.ranges,update:function(b){this.ranges=[...
function Hb (line 13) | function Hb(a,b,c){var d=a.history.done,e=Jg(d);e&&e.ranges?(d[d.length-...
function Ib (line 13) | function Ib(a,b,c){Jb(a,b,c),ag(a,a.sel,a.cm?a.cm.curOp.id:0/0,c)}
function Jb (line 13) | function Jb(a,b,c){(xg(a,"beforeSelectionChange")||a.cm&&xg(a.cm,"before...
function Kb (line 13) | function Kb(a,b){b.equals(a.sel)||(a.sel=b,a.cm&&(a.cm.curOp.updateInput...
function Lb (line 13) | function Lb(a){Kb(a,Mb(a,a.sel,null,!1),Bg)}
function Mb (line 13) | function Mb(a,b,c,d){for(var e,f=0;f<b.ranges.length;f++){var g=b.ranges...
function Nb (line 13) | function Nb(a,b,c,d){var e=!1,f=b,g=c||1;a.cantEdit=!1;a:for(;;){var h=O...
function Ob (line 13) | function Ob(a){for(var b=a.display,c=a.doc,d={},e=d.cursors=document.cre...
function Pb (line 13) | function Pb(a,b){b||(b=Ob(a)),Zg(a.display.cursorDiv,b.cursors),Zg(a.dis...
function Qb (line 13) | function Qb(a,b,c){var d=qc(a,b.head,"div",null,null,!a.options.singleCu...
function Rb (line 13) | function Rb(a,b,c){function j(a,b,c,d){0>b&&(b=0),b=Math.round(b),d=Math...
function Sb (line 13) | function Sb(a){if(a.state.focused){var b=a.display;clearInterval(b.blink...
function Tb (line 13) | function Tb(a,b){a.doc.mode.startState&&a.doc.frontier<a.display.viewTo&...
function Ub (line 13) | function Ub(a){var b=a.doc;if(b.frontier<b.first&&(b.frontier=b.first),!...
function Vb (line 13) | function Vb(a,b,c){for(var d,e,f=a.doc,g=c?-1:b-(a.doc.mode.innerMode?1e...
function Wb (line 13) | function Wb(a,b,c){var d=a.doc,e=a.display;if(!d.mode.startState)return!...
function Xb (line 13) | function Xb(a){return a.lineSpace.offsetTop}
function Yb (line 13) | function Yb(a){return a.mover.offsetHeight-a.lineSpace.offsetHeight}
function Zb (line 13) | function Zb(a){if(a.cachedPaddingH)return a.cachedPaddingH;var b=Zg(a.me...
function $b (line 13) | function $b(a,b,c){var d=a.options.lineWrapping,e=d&&a.display.scroller....
function _b (line 13) | function _b(a,b,c){if(a.line==b)return{map:a.measure.map,cache:a.measure...
function ac (line 13) | function ac(a,b){b=_e(b);var c=Sf(b),d=a.display.externalMeasured=new Nc...
function bc (line 13) | function bc(a,b,c,d){return ec(a,dc(a,b),c,d)}
function cc (line 13) | function cc(a,b){if(b>=a.display.viewFrom&&b<a.display.viewTo)return a.d...
function dc (line 13) | function dc(a,b){var c=Sf(b),d=cc(a,c);d&&!d.text?d=null:d&&d.changes&&b...
function ec (line 13) | function ec(a,b,c,d,e){b.before&&(c=-1);var g,f=c+(d||"");return b.cache...
function gc (line 13) | function gc(a,b,c,f){for(var h,i,j,k,g=b.map,l=0;l<g.length;l+=3){var m=...
function hc (line 13) | function hc(a,b){if(!window.screen||null==screen.logicalXDPI||screen.log...
function ic (line 13) | function ic(a){if(a.measure&&(a.measure.cache={},a.measure.heights=null,...
function jc (line 13) | function jc(a){a.display.externalMeasure=null,Yg(a.display.lineMeasure);...
function kc (line 13) | function kc(a){jc(a),a.display.cachedCharWidth=a.display.cachedTextHeigh...
function lc (line 13) | function lc(){return window.pageXOffset||(document.documentElement||docu...
function mc (line 13) | function mc(){return window.pageYOffset||(document.documentElement||docu...
function nc (line 13) | function nc(a,b,c,d){if(b.widgets)for(var e=0;e<b.widgets.length;++e)if(...
function oc (line 13) | function oc(a,b,c){if("div"==c)return b;var d=b.left,e=b.top;if("page"==...
function pc (line 13) | function pc(a,b,c,d,e){return d||(d=Of(a.doc,b.line)),nc(a,d,bc(a,d,b.ch...
function qc (line 13) | function qc(a,b,c,d,e,f){function g(b,g){var h=ec(a,e,b,g?"right":"left"...
function rc (line 13) | function rc(a,b){var c=0,b=xb(a.doc,b);a.options.lineWrapping||(c=xc(a.d...
function sc (line 13) | function sc(a,b,c,d){var e=nb(a,b);return e.xRel=d,c&&(e.outside=!0),e}
function tc (line 13) | function tc(a,b,c){var d=a.doc;if(c+=a.display.viewOffset,0>c)return sc(...
function uc (line 13) | function uc(a,b,c,d,e){function j(d){var e=qc(a,nb(c,d),"line",b,i);retu...
function wc (line 13) | function wc(a){if(null!=a.cachedTextHeight)return a.cachedTextHeight;if(...
function xc (line 13) | function xc(a){if(null!=a.cachedCharWidth)return a.cachedCharWidth;var b...
function Ac (line 13) | function Ac(a){a.curOp={cm:a,viewChanged:!1,startHeight:a.doc.height,for...
function Bc (line 13) | function Bc(a){var b=a.delayedCallbacks,c=0;do{for(;c<b.length;c++)b[c](...
function Cc (line 13) | function Cc(a){var b=a.curOp,c=b.ownsGroup;if(c)try{Bc(c)}finally{yc=nul...
function Dc (line 13) | function Dc(a){for(var b=a.ops,c=0;c<b.length;c++)Ec(b[c]);for(var c=0;c...
function Ec (line 13) | function Ec(a){var b=a.cm,c=b.display;a.updateMaxLine&&J(b),a.mustUpdate...
function Fc (line 14) | function Fc(a){a.updatedDisplay=a.mustUpdate&&U(a.cm,a.update)}
function Gc (line 14) | function Gc(a){var b=a.cm,c=b.display;a.updatedDisplay&&Z(b),c.maxLineCh...
function Hc (line 14) | function Hc(a){var b=a.cm;null!=a.adjustWidthTo&&(b.display.sizer.style....
function Ic (line 14) | function Ic(a){var b=a.cm,c=b.display,d=b.doc;if(a.updatedDisplay&&V(b,a...
function Jc (line 14) | function Jc(a,b){if(a.curOp)return b();Ac(a);try{return b()}finally{Cc(a)}}
function Kc (line 14) | function Kc(a,b){return function(){if(a.curOp)return b.apply(a,arguments...
function Lc (line 14) | function Lc(a){return function(){if(this.curOp)return a.apply(this,argum...
function Mc (line 14) | function Mc(a){return function(){var b=this.cm;if(!b||b.curOp)return a.a...
function Nc (line 14) | function Nc(a,b,c){this.line=b,this.rest=af(b),this.size=this.rest?Sf(Jg...
function Oc (line 14) | function Oc(a,b,c){for(var e,d=[],f=b;c>f;f=e){var g=new Nc(a.doc,Of(a.d...
function Pc (line 14) | function Pc(a,b,c,d){null==b&&(b=a.doc.first),null==c&&(c=a.doc.first+a....
function Qc (line 14) | function Qc(a,b,c){a.curOp.viewChanged=!0;var d=a.display,e=a.display.ex...
function Rc (line 14) | function Rc(a){a.display.viewFrom=a.display.viewTo=a.doc.first,a.display...
function Sc (line 14) | function Sc(a,b){if(b>=a.display.viewTo)return null;if(b-=a.display.view...
function Tc (line 14) | function Tc(a,b,c,d){var f,e=Sc(a,b),g=a.display.view;if(!v||c==a.doc.fi...
function Uc (line 14) | function Uc(a,b,c){var d=a.display,e=d.view;0==e.length||b>=d.viewTo||c<...
function Vc (line 14) | function Vc(a){for(var b=a.display.view,c=0,d=0;d<b.length;d++){var e=b[...
function Wc (line 14) | function Wc(a){a.display.pollingFast||a.display.poll.set(a.options.pollI...
function Xc (line 14) | function Xc(a){function c(){var d=Zc(a);d||b?(a.display.pollingFast=!1,W...
function Zc (line 14) | function Zc(a){var b=a.display.input,c=a.display.prevInput,f=a.doc;if(!a...
function $c (line 14) | function $c(a,b){var c,f,g=a.doc;if(a.somethingSelected()){a.display.pre...
function _c (line 14) | function _c(a){"nocursor"==a.options.readOnly||o&&_g()==a.display.input|...
function ad (line 14) | function ad(a){a.state.focused||(_c(a),Gd(a))}
function bd (line 14) | function bd(a){return a.options.readOnly||a.doc.cantEdit}
function cd (line 14) | function cd(a){function c(){a.state.focused&&setTimeout(Pg(_c,a),0)}func...
function dd (line 14) | function dd(a){var b=a.display;b.cachedCharWidth=b.cachedTextHeight=b.ca...
function ed (line 14) | function ed(a,b){for(var c=ng(b);c!=a.wrapper;c=c.parentNode)if(!c||c.ig...
function fd (line 14) | function fd(a,b,c,d){var e=a.display;if(!c){var f=ng(b);if(f==e.scrollba...
function gd (line 14) | function gd(a){if(!vg(this,a)){var b=this,c=b.display;if(c.shift=a.shift...
function jd (line 14) | function jd(a,b,c){setTimeout(Pg(ad,a),0);var e,d=+new Date;id&&id.time>...
function kd (line 14) | function kd(a,b,c,g){var h=a.display,i=Kc(a,function(j){f&&(h.scroller.d...
function ld (line 14) | function ld(a,b,c,d,e){function n(b){if(0!=ob(m,b))if(m=b,"rect"==d){for...
function md (line 14) | function md(a,b,c,d,e){try{var f=b.clientX,g=b.clientY}catch(b){return!1...
function nd (line 14) | function nd(a,b){return md(a,b,"gutterClick",!0,tg)}
function pd (line 14) | function pd(a){var b=this;if(!vg(b,a)&&!ed(b.display,a)){jg(a),d&&(od=+n...
function qd (line 14) | function qd(a,b){if(d&&(!a.state.draggingText||+new Date-od<100))return ...
function rd (line 14) | function rd(b,c){Math.abs(b.doc.scrollTop-c)<2||(b.doc.scrollTop=c,a||W(...
function sd (line 14) | function sd(a,b,c){(c?b==a.doc.scrollLeft:Math.abs(a.doc.scrollLeft-b)<2...
function vd (line 14) | function vd(b,c){var d=c.wheelDeltaX,e=c.wheelDeltaY;null==d&&c.detail&&...
function wd (line 14) | function wd(a,b,c){if("string"==typeof b&&(b=te[b],!b))return!1;a.displa...
function xd (line 14) | function xd(a){var b=a.state.keyMaps.slice(0);return a.options.extraKeys...
function zd (line 14) | function zd(a,b){var c=ve(a.options.keyMap),d=c.auto;clearTimeout(yd),d&...
function Ad (line 14) | function Ad(a,b,c){var d=we("'"+c+"'",xd(a),function(b){return wd(a,b,!0...
function Cd (line 14) | function Cd(a){var b=this;if(ad(b),!vg(b,a)){d&&11>e&&27==a.keyCode&&(a....
function Dd (line 14) | function Dd(a){function c(a){18!=a.keyCode&&a.altKey||(bh(b,"CodeMirror-...
function Ed (line 14) | function Ed(a){16==a.keyCode&&(this.doc.sel.shift=!1),vg(this,a)}
function Fd (line 14) | function Fd(a){var b=this;if(!(vg(b,a)||a.ctrlKey&&!a.altKey||p&&a.metaK...
function Gd (line 14) | function Gd(a){"nocursor"!=a.options.readOnly&&(a.state.focused||(rg(a,"...
function Hd (line 14) | function Hd(a){a.state.focused&&(rg(a,"blur",a),a.state.focused=!1,bh(a....
function Id (line 14) | function Id(a,b){function m(){if(null!=c.input.selectionStart){var b=a.s...
function Jd (line 14) | function Jd(a,b){return xg(a,"gutterContextMenu")?md(a,b,"gutterContextM...
function Ld (line 14) | function Ld(a,b){if(ob(a,b.from)<0)return a;if(ob(a,b.to)<=0)return Kd(b...
function Md (line 14) | function Md(a,b){for(var c=[],d=0;d<a.sel.ranges.length;d++){var e=a.sel...
function Nd (line 14) | function Nd(a,b,c){return a.line==b.line?nb(c.line,a.ch-b.ch+c.ch):nb(c....
function Od (line 14) | function Od(a,b,c){for(var d=[],e=nb(a.first,0),f=e,g=0;g<b.length;g++){...
function Pd (line 14) | function Pd(a,b,c){var d={canceled:!1,from:b.from,to:b.to,text:b.text,or...
function Qd (line 14) | function Qd(a,b,c){if(a.cm){if(!a.cm.curOp)return Kc(a.cm,Qd)(a,b,c);if(...
function Rd (line 14) | function Rd(a,b){if(1!=b.text.length||""!=b.text[0]||0!=ob(b.from,b.to))...
function Sd (line 14) | function Sd(a,b,c){if(!a.cm||!a.cm.state.suppressEdits){for(var e,d=a.hi...
function Td (line 14) | function Td(a,b){if(0!=b&&(a.first+=b,a.sel=new sb(Mg(a.sel.ranges,funct...
function Ud (line 14) | function Ud(a,b,c,d){if(a.cm&&!a.cm.curOp)return Kc(a.cm,Ud)(a,b,c,d);if...
function Vd (line 14) | function Vd(a,b,c){var d=a.doc,e=a.display,f=b.from,g=b.to,h=!1,i=f.line...
function Wd (line 14) | function Wd(a,b,c,d,e){if(d||(d=c),ob(d,c)<0){var f=d;d=c,c=f}"string"==...
function Xd (line 14) | function Xd(a,b){var c=a.display,d=c.sizer.getBoundingClientRect(),e=nul...
function Yd (line 14) | function Yd(a,b,c,d){for(null==d&&(d=0);;){var e=!1,f=qc(a,b),g=c&&c!=b?...
function Zd (line 14) | function Zd(a,b,c,d,e){var f=$d(a,b,c,d,e);null!=f.scrollTop&&rd(a,f.scr...
function $d (line 14) | function $d(a,b,c,d,e){var f=a.display,g=wc(a.display);0>c&&(c=0);var h=...
function _d (line 14) | function _d(a,b,c){(null!=b||null!=c)&&be(a),null!=b&&(a.curOp.scrollLef...
function ae (line 14) | function ae(a){be(a);var b=a.getCursor(),c=b,d=b;a.options.lineWrapping|...
function be (line 14) | function be(a){var b=a.curOp.scrollToPos;if(b){a.curOp.scrollToPos=null;...
function ce (line 14) | function ce(a,b,c,d){var f,e=a.doc;null==c&&(c="add"),"smart"==c&&(e.mod...
function de (line 14) | function de(a,b,c,d){var e=b,f=b;return"number"==typeof b?f=Of(a,wb(a,b)...
function ee (line 14) | function ee(a,b){for(var c=a.doc.sel.ranges,d=[],e=0;e<c.length;e++){for...
function fe (line 14) | function fe(a,b,c,d,e){function k(){var b=f+c;return b<a.first||b>=a.fir...
function ge (line 14) | function ge(a,b,c,d){var g,e=a.doc,f=b.left;if("page"==d){var h=Math.min...
function he (line 14) | function he(a,b){var c=a.doc,d=Of(c,b.line).text,e=b.ch,f=b.ch;if(d){var...
function ke (line 14) | function ke(a,b,c,d){w.defaults[a]=b,c&&(je[a]=d?function(a,b,d){d!=le&&...
function ve (line 14) | function ve(a){return"string"==typeof a?ue[a]:a}
function Ce (line 14) | function Ce(a,b,c,d,e){if(d&&d.shared)return Ee(a,b,c,d,e);if(a.cm&&!a.c...
function Ee (line 15) | function Ee(a,b,c,d,e){d=Og(d),d.shared=!1;var f=[Ce(a,b,c,d,e)],g=f[0],...
function Fe (line 15) | function Fe(a){return a.findMarks(nb(a.first,0),a.clipPos(nb(a.lastLine(...
function Ge (line 15) | function Ge(a,b){for(var c=0;c<b.length;c++){var d=b[c],e=d.find(),f=a.c...
function He (line 15) | function He(a){for(var b=0;b<a.length;b++){var c=a[b],d=[c.primary.doc];...
function Ie (line 15) | function Ie(a,b,c){this.marker=a,this.from=b,this.to=c}
function Je (line 15) | function Je(a,b){if(a)for(var c=0;c<a.length;++c){var d=a[c];if(d.marker...
function Ke (line 15) | function Ke(a,b){for(var c,d=0;d<a.length;++d)a[d]!=b&&(c||(c=[])).push(...
function Le (line 15) | function Le(a,b){a.markedSpans=a.markedSpans?a.markedSpans.concat([b]):[...
function Me (line 15) | function Me(a,b,c){if(a)for(var e,d=0;d<a.length;++d){var f=a[d],g=f.mar...
function Ne (line 15) | function Ne(a,b,c){if(a)for(var e,d=0;d<a.length;++d){var f=a[d],g=f.mar...
function Oe (line 15) | function Oe(a,b){var c=zb(a,b.from.line)&&Of(a,b.from.line).markedSpans,...
function Pe (line 15) | function Pe(a){for(var b=0;b<a.length;++b){var c=a[b];null!=c.from&&c.fr...
function Qe (line 15) | function Qe(a,b){var c=eg(a,b),d=Oe(a,b);if(!c)return d;if(!d)return c;f...
function Re (line 15) | function Re(a,b,c){var d=null;if(a.iter(b.line,c.line+1,function(a){if(a...
function Se (line 15) | function Se(a){var b=a.markedSpans;if(b){for(var c=0;c<b.length;++c)b[c]...
function Te (line 15) | function Te(a,b){if(b){for(var c=0;c<b.length;++c)b[c].marker.attachLine...
function Ue (line 15) | function Ue(a){return a.inclusiveLeft?-1:0}
function Ve (line 15) | function Ve(a){return a.inclusiveRight?1:0}
function We (line 15) | function We(a,b){var c=a.lines.length-b.lines.length;if(0!=c)return c;va...
function Xe (line 15) | function Xe(a,b){var d,c=v&&a.markedSpans;if(c)for(var e,f=0;f<c.length;...
function Ye (line 15) | function Ye(a){return Xe(a,!0)}
function Ze (line 15) | function Ze(a){return Xe(a,!1)}
function $e (line 15) | function $e(a,b,c,d,e){var f=Of(a,b),g=v&&f.markedSpans;if(g)for(var h=0...
function _e (line 15) | function _e(a){for(var b;b=Ye(a);)a=b.find(-1,!0).line;return a}
function af (line 15) | function af(a){for(var b,c;b=Ze(a);)a=b.find(1,!0).line,(c||(c=[])).push...
function bf (line 15) | function bf(a,b){var c=Of(a,b),d=_e(c);return c==d?b:Sf(d)}
function cf (line 15) | function cf(a,b){if(b>a.lastLine())return b;var d,c=Of(a,b);if(!df(a,c))...
function df (line 15) | function df(a,b){var c=v&&b.markedSpans;if(c)for(var d,e=0;e<c.length;++...
function ef (line 15) | function ef(a,b,c){if(null==c.to){var d=c.marker.find(1,!0);return ef(a,...
function gf (line 15) | function gf(a,b,c){Uf(b)<(a.curOp&&a.curOp.scrollTop||a.doc.scrollTop)&&...
function hf (line 15) | function hf(a){if(null!=a.height)return a.height;if(!$g(document.body,a....
function jf (line 15) | function jf(a,b,c,d){var e=new ff(a,c,d);return e.noHScroll&&(a.display....
function lf (line 15) | function lf(a,b,c,d){a.text=b,a.stateAfter&&(a.stateAfter=null),a.styles...
function mf (line 15) | function mf(a){a.parent=null,Se(a)}
function nf (line 15) | function nf(a,b){if(a)for(;;){var c=a.match(/(?:^|\s+)line-(background-)...
function of (line 15) | function of(a,b){if(a.blankLine)return a.blankLine(b);if(a.innerMode){va...
function pf (line 15) | function pf(a,b,c){for(var d=0;10>d;d++){var e=a.token(b,c);if(b.pos>b.s...
function qf (line 15) | function qf(a,b,c,d,e,f,g){var h=c.flattenSpans;null==h&&(h=a.options.fl...
function rf (line 15) | function rf(a,b,c,d){var e=[a.state.modeGen],f={};qf(a,b.text,a.doc.mode...
function sf (line 15) | function sf(a,b){if(!b.styles||b.styles[0]!=a.state.modeGen){var c=rf(a,...
function tf (line 15) | function tf(a,b,c,d){var e=a.doc.mode,f=new ze(b,a.options.tabSize);for(...
function wf (line 15) | function wf(a,b){if(!a||/^\s*$/.test(a))return null;var c=b.addModeClass...
function xf (line 15) | function xf(a,b){var c=Wg("span",null,null,f?"padding-right: .1px":null)...
function yf (line 15) | function yf(a){var b=Wg("span","\u2022","cm-invalidchar");return b.title...
function zf (line 15) | function zf(a,b,c,f,g,h){if(b){var i=a.cm.options.specialChars,j=!1;if(i...
function Af (line 15) | function Af(a){function b(a){for(var b=" ",c=0;c<a.length-2;++c)b+=c%2?"...
function Bf (line 15) | function Bf(a,b){return function(c,d,e,f,g,h){e=e?e+" cm-force-border":"...
function Cf (line 15) | function Cf(a,b,c,d){var e=!d&&c.widgetNode;e&&(a.map.push(a.pos,a.pos+b...
function Df (line 15) | function Df(a,b,c){var d=a.markedSpans,e=a.text,f=0;if(d)for(var k,m,n,o...
function Ef (line 15) | function Ef(a,b){return 0==b.from.ch&&0==b.to.ch&&""==Jg(b.text)&&(!a.cm...
function Ff (line 15) | function Ff(a,b,c,d){function e(a){return c?c[a]:null}function f(a,c,e){...
function Gf (line 15) | function Gf(a){this.lines=a,this.parent=null;for(var b=0,c=0;b<a.length;...
function Hf (line 15) | function Hf(a){this.children=a;for(var b=0,c=0,d=0;d<a.length;++d){var e...
function Mf (line 15) | function Mf(a,b,c){function d(a,e,f){if(a.linked)for(var g=0;g<a.linked....
function Nf (line 15) | function Nf(a,b){if(b.cm)throw new Error("This document is already in us...
function Of (line 15) | function Of(a,b){if(b-=a.first,0>b||b>=a.size)throw new Error("There is ...
function Pf (line 15) | function Pf(a,b,c){var d=[],e=b.line;return a.iter(b.line,c.line+1,funct...
function Qf (line 15) | function Qf(a,b,c){var d=[];return a.iter(b,c,function(a){d.push(a.text)...
function Rf (line 15) | function Rf(a,b){var c=b-a.height;if(c)for(var d=a;d;d=d.parent)d.height...
function Sf (line 15) | function Sf(a){if(null==a.parent)return null;for(var b=a.parent,c=Lg(b.l...
function Tf (line 15) | function Tf(a,b){var c=a.first;a:do{for(var d=0;d<a.children.length;++d)...
function Uf (line 15) | function Uf(a){a=_e(a);for(var b=0,c=a.parent,d=0;d<c.lines.length;++d){...
function Vf (line 15) | function Vf(a){var b=a.order;return null==b&&(b=a.order=Ih(a.text)),b}
function Wf (line 15) | function Wf(a){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastM...
function Xf (line 15) | function Xf(a,b){var c={from:pb(b.from),to:Kd(b),text:Pf(a,b.from,b.to)}...
function Yf (line 15) | function Yf(a){for(;a.length;){var b=Jg(a);if(!b.ranges)break;a.pop()}}
function Zf (line 15) | function Zf(a,b){return b?(Yf(a.done),Jg(a.done)):a.done.length&&!Jg(a.d...
function $f (line 15) | function $f(a,b,c,d){var e=a.history;e.undone.length=0;var g,f=+new Date...
function _f (line 15) | function _f(a,b,c,d){var e=b.charAt(0);return"*"==e||"+"==e&&c.ranges.le...
function ag (line 15) | function ag(a,b,c,d){var e=a.history,f=d&&d.origin;c==e.lastOp||f&&e.las...
function bg (line 15) | function bg(a,b){var c=Jg(b);c&&c.ranges&&c.equals(a)||b.push(a)}
function cg (line 15) | function cg(a,b,c,d){var e=b["spans_"+a.id],f=0;a.iter(Math.max(a.first,...
function dg (line 15) | function dg(a){if(!a)return null;for(var c,b=0;b<a.length;++b)a[b].marke...
function eg (line 15) | function eg(a,b){var c=b["spans_"+a.id];if(!c)return null;for(var d=0,e=...
function fg (line 15) | function fg(a,b,c){for(var d=0,e=[];d<a.length;++d){var f=a[d];if(f.rang...
function gg (line 15) | function gg(a,b,c,d){c<a.line?a.line+=d:b<a.line&&(a.line=b,a.ch=0)}
function hg (line 15) | function hg(a,b,c,d){for(var e=0;e<a.length;++e){var f=a[e],g=!0;if(f.ra...
function ig (line 15) | function ig(a,b){var c=b.from.line,d=b.to.line,e=b.text.length-(d-c)-1;h...
function lg (line 15) | function lg(a){return null!=a.defaultPrevented?a.defaultPrevented:0==a.r...
function ng (line 15) | function ng(a){return a.target||a.srcElement}
function og (line 15) | function og(a){var b=a.which;return null==b&&(1&a.button?b=1:2&a.button?...
function tg (line 15) | function tg(a,b){function f(a){return function(){a.apply(null,d)}}var c=...
function ug (line 15) | function ug(){var a=sg;sg=null;for(var b=0;b<a.length;++b)a[b]()}
function vg (line 15) | function vg(a,b,c){return rg(a,c||b.type,a,b),lg(b)||b.codemirrorIgnore}
function wg (line 15) | function wg(a){var b=a._handlers&&a._handlers.cursorActivity;if(b)for(va...
function xg (line 15) | function xg(a,b){var c=a._handlers&&a._handlers[b];return c&&c.length>0}
function yg (line 15) | function yg(a){a.prototype.on=function(a,b){pg(this,a,b)},a.prototype.of...
function Eg (line 15) | function Eg(){this.id=null}
function Gg (line 15) | function Gg(a,b,c){for(var d=0,e=0;;){var f=a.indexOf(" ",d);-1==f&&(f=a...
function Ig (line 15) | function Ig(a){for(;Hg.length<=a;)Hg.push(Jg(Hg)+" ");return Hg[a]}
function Jg (line 15) | function Jg(a){return a[a.length-1]}
function Lg (line 15) | function Lg(a,b){for(var c=0;c<a.length;++c)if(a[c]==b)return c;return-1}
function Mg (line 15) | function Mg(a,b){for(var c=[],d=0;d<a.length;d++)c[d]=b(a[d],d);return c}
function Ng (line 15) | function Ng(a,b){var c;if(Object.create)c=Object.create(a);else{var d=fu...
function Og (line 15) | function Og(a,b,c){b||(b={});for(var d in a)!a.hasOwnProperty(d)||c===!1...
function Pg (line 15) | function Pg(a){var b=Array.prototype.slice.call(arguments,1);return func...
function Sg (line 15) | function Sg(a,b){return b?b.source.indexOf("\\w")>-1&&Rg(a)?!0:b.test(a)...
function Tg (line 15) | function Tg(a){for(var b in a)if(a.hasOwnProperty(b)&&a[b])return!1;retu...
function Vg (line 15) | function Vg(a){return a.charCodeAt(0)>=768&&Ug.test(a)}
function Wg (line 15) | function Wg(a,b,c,d){var e=document.createElement(a);if(c&&(e.className=...
function Yg (line 15) | function Yg(a){for(var b=a.childNodes.length;b>0;--b)a.removeChild(a.fir...
function Zg (line 15) | function Zg(a,b){return Yg(a).appendChild(b)}
function $g (line 15) | function $g(a,b){if(a.contains)return a.contains(b);for(;b=b.parentNode;...
function _g (line 15) | function _g(){return document.activeElement}
function ah (line 15) | function ah(a){return new RegExp("\\b"+a+"\\b\\s*")}
function bh (line 15) | function bh(a,b){var c=ah(b);c.test(a.className)&&(a.className=a.classNa...
function ch (line 15) | function ch(a,b){ah(b).test(a.className)||(a.className+=" "+b)}
function dh (line 15) | function dh(a,b){for(var c=a.split(" "),d=0;d<c.length;d++)c[d]&&!ah(c[d...
function eh (line 15) | function eh(a){if(document.body.getElementsByClassName)for(var b=documen...
function gh (line 15) | function gh(){fh||(hh(),fh=!0)}
function hh (line 15) | function hh(){var a;pg(window,"resize",function(){null==a&&(a=setTimeout...
function kh (line 15) | function kh(a){if(null!=jh)return jh;var b=Wg("div",null,null,"width: 50...
function mh (line 15) | function mh(a){if(null==lh){var b=Wg("span","\u200b");Zg(a,Wg("span",[b,...
function oh (line 15) | function oh(a){if(null!=nh)return nh;var b=Zg(a,document.createTextNode(...
function th (line 15) | function th(a){if(null!=sh)return sh;var b=Zg(a,Wg("span","x")),c=b.getB...
function vh (line 15) | function vh(a,b,c,d){if(!a)return d(b,c,"ltr");for(var e=!1,f=0;f<a.leng...
function wh (line 15) | function wh(a){return a.level%2?a.to:a.from}
function xh (line 15) | function xh(a){return a.level%2?a.from:a.to}
function yh (line 15) | function yh(a){var b=Vf(a);return b?wh(b[0]):0}
function zh (line 15) | function zh(a){var b=Vf(a);return b?xh(Jg(b)):a.text.length}
function Ah (line 15) | function Ah(a,b){var c=Of(a.doc,b),d=_e(c);d!=c&&(b=Sf(d));var e=Vf(d),f...
function Bh (line 15) | function Bh(a,b){for(var c,d=Of(a.doc,b);c=Ze(d);)d=c.find(1,!0).line,b=...
function Ch (line 15) | function Ch(a,b,c){var d=a[0].level;return b==d?!0:c==d?!1:c>b}
function Eh (line 15) | function Eh(a,b){Dh=null;for(var d,c=0;c<a.length;++c){var e=a[c];if(e.f...
function Fh (line 15) | function Fh(a,b,c,d){if(!d)return b+c;do b+=c;while(b>0&&Vg(a.text.charA...
function Gh (line 15) | function Gh(a,b,c,d){var e=Vf(a);if(!e)return Hh(a,b,c,d);for(var f=Eh(e...
function Hh (line 15) | function Hh(a,b,c,d){var e=b+c;if(d)for(;e>0&&Vg(a.text.charAt(e));)e+=c...
function d (line 16) | function d(a){return"number"==typeof a||/^\d+$/.test(String(a))?a+"px":a}
function d (line 16) | function d(b){b=ve(b);var e=b[a];if(e===!1)return"stop";if(null!=e&&c(e)...
function d (line 16) | function d(){a.value=i.getValue()}
function c (line 17) | function c(c){return 247>=c?a.charAt(c):c>=1424&&1524>=c?"R":c>=1536&&17...
function j (line 17) | function j(a,b,c){this.level=a,this.from=b,this.to=c}
function h (line 17) | function h(a,b){return a.match(d,!1)?(b.token=i,f.token(a,b.scriptState)...
function i (line 17) | function i(a,b){return a.match(e,!1)?(b.token=h,g.token(a,b.htmlState)):...
function j (line 17) | function j(a,b){var c=b.htmlState.tagName,g=d.token(a,b.htmlState);if("s...
function k (line 17) | function k(a,b,c){var f,d=a.current(),e=d.search(b);return e>-1?a.backUp...
function l (line 17) | function l(a,b){return a.match(/^<\/\s*script\s*>/i,!1)?(b.token=j,b.loc...
function m (line 17) | function m(a,b){return a.match(/^<\/\s*style\s*>/i,!1)?(b.token=j,b.loca...
function l (line 17) | function l(a){for(var c,b=!1,d=!1;null!=(c=a.next());){if(!b){if("/"==c&...
function o (line 17) | function o(a,b,c){return m=a,n=c,b}
function p (line 17) | function p(a,b){var c=a.next();if('"'==c||"'"==c)return b.tokenize=q(c),...
function q (line 17) | function q(a){return function(b,c){var e,d=!1;if(f&&"@"==b.peek()&&b.mat...
function r (line 17) | function r(a,b){for(var d,c=!1;d=a.next();){if("/"==d&&c){b.tokenize=p;b...
function s (line 17) | function s(a,b){for(var d,c=!1;null!=(d=a.next());){if(!c&&("`"==d||"$"=...
function u (line 17) | function u(a,b){b.fatArrowAt&&(b.fatArrowAt=null);var c=a.string.indexOf...
function w (line 17) | function w(a,b,c,d,e,f){this.indented=a,this.column=b,this.type=c,this.p...
function x (line 17) | function x(a,b){for(var c=a.localVars;c;c=c.next)if(c.name==b)return!0;f...
function y (line 17) | function y(a,b,c,d,e){var f=a.cc;for(z.state=a,z.stream=e,z.marked=null,...
function A (line 17) | function A(){for(var a=arguments.length-1;a>=0;a--)z.cc.push(arguments[a])}
function B (line 17) | function B(){return A.apply(null,arguments),!0}
function C (line 17) | function C(a){function b(b){for(var c=b;c;c=c.next)if(c.name==a)return!0...
function E (line 17) | function E(){z.state.context={prev:z.state.context,vars:z.state.localVar...
function F (line 17) | function F(){z.state.localVars=z.state.context.vars,z.state.context=z.st...
function G (line 17) | function G(a,b){var c=function(){var c=z.state,d=c.indented;if("stat"==c...
function H (line 17) | function H(){var a=z.state;a.lexical.prev&&(")"==a.lexical.type&&(a.inde...
function I (line 17) | function I(a){function b(c){return c==a?B():";"==a?A():B(b)}return b}
function J (line 17) | function J(a,b){return"var"==a?B(G("vardef",b.length),db,I(";"),H):"keyw...
function K (line 17) | function K(a){return M(a,!1)}
function L (line 17) | function L(a){return M(a,!0)}
function M (line 17) | function M(a,b){if(z.state.fatArrowAt==z.stream.start){var c=b?U:T;if("(...
function N (line 17) | function N(a){return a.match(/[;\}\)\],]/)?A():A(K)}
function O (line 17) | function O(a){return a.match(/[;\}\)\],]/)?A():A(L)}
function P (line 17) | function P(a,b){return","==a?B(K):Q(a,b,!1)}
function Q (line 17) | function Q(a,b,c){var d=0==c?P:Q,e=0==c?K:L;return"=>"==b?B(E,c?U:T,F):"...
function R (line 17) | function R(a,b){return"quasi"!=a?A():"${"!=b.slice(b.length-2)?B(R):B(K,S)}
function S (line 17) | function S(a){return"}"==a?(z.marked="string-2",z.state.tokenize=s,B(R))...
function T (line 17) | function T(a){return u(z.stream,z.state),"{"==a?A(J):A(K)}
function U (line 17) | function U(a){return u(z.stream,z.state),"{"==a?A(J):A(L)}
function V (line 17) | function V(a){return":"==a?B(H,J):A(P,I(";"),H)}
function W (line 17) | function W(a){return"variable"==a?(z.marked="property",B()):void 0}
function X (line 17) | function X(a,b){return"variable"==a||"keyword"==z.style?(z.marked="prope...
function Y (line 17) | function Y(a){return"variable"!=a?A(Z):(z.marked="property",B(ob))}
function Z (line 17) | function Z(a){return":"==a?B(L):"("==a?A(ob):void 0}
function $ (line 17) | function $(a,b){function c(d){if(","==d){var e=z.state.lexical;return"ca...
function _ (line 17) | function _(a,b,c){for(var d=3;d<arguments.length;d++)z.cc.push(arguments...
function ab (line 17) | function ab(a){return"}"==a?B():A(J,ab)}
function bb (line 17) | function bb(a){return h&&":"==a?B(cb):void 0}
function cb (line 17) | function cb(a){return"variable"==a?(z.marked="variable-3",B()):void 0}
function db (line 17) | function db(){return A(eb,bb,gb,hb)}
function eb (line 17) | function eb(a,b){return"variable"==a?(C(b),B()):"["==a?_(eb,"]"):"{"==a?...
function fb (line 17) | function fb(a,b){return"variable"!=a||z.stream.match(/^\s*:/,!1)?("varia...
function gb (line 17) | function gb(a,b){return"="==b?B(L):void 0}
function hb (line 17) | function hb(a){return","==a?B(db):void 0}
function ib (line 17) | function ib(a,b){return"keyword b"==a&&"else"==b?B(G("form","else"),J,H)...
function jb (line 17) | function jb(a){return"("==a?B(G(")"),kb,I(")"),H):void 0}
function kb (line 17) | function kb(a){return"var"==a?B(db,I(";"),mb):";"==a?B(mb):"variable"==a...
function lb (line 17) | function lb(a,b){return"in"==b||"of"==b?(z.marked="keyword",B(K)):B(P,mb)}
function mb (line 17) | function mb(a,b){return";"==a?B(nb):"in"==b||"of"==b?(z.marked="keyword"...
function nb (line 17) | function nb(a){")"!=a&&B(K)}
function ob (line 17) | function ob(a,b){return"*"==b?(z.marked="keyword",B(ob)):"variable"==a?(...
function pb (line 17) | function pb(a){return"spread"==a?B(pb):A(eb,bb)}
function qb (line 17) | function qb(a,b){return"variable"==a?(C(b),B(rb)):void 0}
function rb (line 17) | function rb(a,b){return"extends"==b?B(K,rb):"{"==a?B(G("}"),sb,H):void 0}
function sb (line 17) | function sb(a,b){return"variable"==a||"keyword"==z.style?(z.marked="prop...
function tb (line 17) | function tb(a){return"variable"!=a?A():(z.marked="property",B())}
function ub (line 17) | function ub(a,b){return"string"==a?B(J):"variable"==a?(C(b),B(yb)):void 0}
function vb (line 17) | function vb(a,b){return"*"==b?(z.marked="keyword",B(yb,I(";"))):"default...
function wb (line 17) | function wb(a){return"string"==a?B():A(xb,yb)}
function xb (line 17) | function xb(a,b){return"{"==a?_(xb,"}"):("variable"==a&&C(b),B())}
function yb (line 17) | function yb(a,b){return"from"==b?(z.marked="keyword",B(K)):void 0}
function zb (line 17) | function zb(a){return"]"==a?B():A(L,Ab)}
function Ab (line 17) | function Ab(a){return"for"==a?A(Bb,I("]")):","==a?B($(L,"]")):A($(L,"]"))}
function Bb (line 17) | function Bb(a){return"for"==a?B(jb,Bb):"if"==a?B(K,Bb):void 0}
function a (line 17) | function a(a){return{type:a,style:"keyword"}}
FILE: togetherjs/tests/doctestjs/.resources/retemplate.py
function get_variables (line 19) | def get_variables(content, value_matches):
function get_value_matches (line 36) | def get_value_matches(template):
function sub_template (line 46) | def sub_template(template, content):
function rewrite_page (line 84) | def rewrite_page(page_name, template_name):
FILE: togetherjs/tests/doctestjs/.resources/toc.js
function contentsOnLoad (line 1) | function contentsOnLoad() {
FILE: togetherjs/tests/doctestjs/doctest.js
function poll (line 983) | function poll() {
function deIndent (line 1479) | function deIndent(text) {
function jshint (line 1837) | function jshint(src, options) {
function _removeJshintSections (line 1901) | function _removeJshintSections(text) {
function NosyXMLHttpRequest (line 1938) | function NosyXMLHttpRequest(name, req) {
function printWrap (line 2027) | function printWrap(realObject, methodName, objectName, before) {
function assert (line 2124) | function assert(condition,message){if(!condition){throw new Error("ASSER...
function isDecimalDigit (line 2124) | function isDecimalDigit(ch){return ch>=48&&ch<=57}
function isHexDigit (line 2124) | function isHexDigit(ch){return"0123456789abcdefABCDEF".indexOf(ch)>=0
function isOctalDigit (line 2125) | function isOctalDigit(ch){return"01234567".indexOf(ch)>=0}
function isWhiteSpace (line 2125) | function isWhiteSpace(ch){return ch===32||ch===9||ch===11||ch===12||ch==...
function isLineTerminator (line 2126) | function isLineTerminator(ch){return ch===10||ch===13||ch===8232||ch===8...
function isIdentifierStart (line 2126) | function isIdentifierStart(ch){return ch===36||ch===95||ch>=65&&ch<=90||...
function isIdentifierPart (line 2127) | function isIdentifierPart(ch){return ch===36||ch===95||ch>=65&&ch<=90||c...
function isFutureReservedWord (line 2127) | function isFutureReservedWord(id){switch(id){case"class":case"enum":case...
function isStrictModeReservedWord (line 2128) | function isStrictModeReservedWord(id){switch(id){case"implements":case"i...
function isRestrictedWord (line 2129) | function isRestrictedWord(id){return id==="eval"||id==="arguments"}
function isKeyword (line 2129) | function isKeyword(id){if(strict&&isStrictModeReservedWord(id)){return t...
function skipComment (line 2132) | function skipComment(){var ch,blockComment,lineComment;blockComment=fals...
function scanHexEscape (line 2137) | function scanHexEscape(prefix){var i,len,ch,code=0;len=prefix==="u"?4:2;...
function getEscapedIdentifier (line 2138) | function getEscapedIdentifier(){var ch,id;ch=source.charCodeAt(index++);...
function getIdentifier (line 2141) | function getIdentifier(){var start,ch;start=index++;while(index<length){...
function scanIdentifier (line 2142) | function scanIdentifier(){var start,id,type;start=index;id=source.charCo...
function scanPunctuator (line 2144) | function scanPunctuator(){var start=index,code=source.charCodeAt(index),...
function scanHexLiteral (line 2151) | function scanHexLiteral(start){var number="";
function scanOctalLiteral (line 2153) | function scanOctalLiteral(start){var number="0"+source[index++];while(in...
function scanNumericLiteral (line 2155) | function scanNumericLiteral(){var number,start,ch;ch=source[index];asser...
function scanStringLiteral (line 2160) | function scanStringLiteral(){var str="",quote,start,ch,code,unescaped,re...
function scanRegExp (line 2165) | function scanRegExp(){var str,ch,start,pattern,flags,value,classMarker=f...
function isIdentifierName (line 2171) | function isIdentifierName(token){return token.type===Token.Identifier||t...
function advanceSlash (line 2172) | function advanceSlash(){var prevToken,checkToken;prevToken=extra.tokens[...
function advance (line 2176) | function advance(){var ch;skipComment();if(index>=length){return{type:To...
function lex (line 2178) | function lex(){var token;token=lookahead;index=token.range[1];lineNumber...
function peek (line 2179) | function peek(){var pos,line,start;pos=index;line=lineNumber;start=lineS...
function peekLineTerminator (line 2199) | function peekLineTerminator(){var pos,line,start,found;pos=index;line=li...
function throwError (line 2199) | function throwError(token,messageFormat){var error,args=Array.prototype....
function throwErrorTolerant (line 2201) | function throwErrorTolerant(){try{throwError.apply(null,arguments)
function throwUnexpected (line 2202) | function throwUnexpected(token){if(token.type===Token.EOF){throwError(to...
function expect (line 2205) | function expect(value){var token=lex();if(token.type!==Token.Punctuator|...
function expectKeyword (line 2205) | function expectKeyword(keyword){var token=lex();if(token.type!==Token.Ke...
function match (line 2206) | function match(value){return lookahead.type===Token.Punctuator&&lookahea...
function matchKeyword (line 2206) | function matchKeyword(keyword){return lookahead.type===Token.Keyword&&lo...
function matchAssign (line 2206) | function matchAssign(){var op;
function consumeSemicolon (line 2208) | function consumeSemicolon(){var line;if(source.charCodeAt(index)===59){l...
function isLeftHandSide (line 2209) | function isLeftHandSide(expr){return expr.type===Syntax.Identifier||expr...
function parseArrayInitialiser (line 2209) | function parseArrayInitialiser(){var elements=[];expect("[");while(!matc...
function parsePropertyFunction (line 2210) | function parsePropertyFunction(param,first){var previousStrict,body;
function parseObjectPropertyKey (line 2212) | function parseObjectPropertyKey(){var token;delegate.markStart();token=l...
function parseObjectProperty (line 2213) | function parseObjectProperty(){var token,key,id,value,param;token=lookah...
function parseObjectInitialiser (line 2217) | function parseObjectInitialiser(){var properties=[],property,name,key,ki...
function parseGroupExpression (line 2221) | function parseGroupExpression(){var expr;delegate.markStart();expect("("...
function parsePrimaryExpression (line 2222) | function parsePrimaryExpression(){var type,token,expr;if(match("(")){ret...
function parseArguments (line 2226) | function parseArguments(){var args=[];expect("(");if(!match(")")){while(...
function parseNonComputedProperty (line 2227) | function parseNonComputedProperty(){var token;delegate.markStart();token...
function parseNonComputedMember (line 2228) | function parseNonComputedMember(){expect(".");return parseNonComputedPro...
function parseComputedMember (line 2228) | function parseComputedMember(){var expr;expect("[");expr=parseExpression...
function parseNewExpression (line 2228) | function parseNewExpression(){var callee,args;
function parseLeftHandSideExpressionAllowCall (line 2229) | function parseLeftHandSideExpressionAllowCall(){var marker,expr,args,pro...
function parseLeftHandSideExpression (line 2232) | function parseLeftHandSideExpression(){var marker,expr,property;marker=c...
function parsePostfixExpression (line 2234) | function parsePostfixExpression(){var marker,expr,token;marker=createLoc...
function parseUnaryExpression (line 2236) | function parseUnaryExpression(){var marker,token,expr;marker=createLocat...
function binaryPrecedence (line 2240) | function binaryPrecedence(token,allowIn){var prec=0;if(token.type!==Toke...
function parseBinaryExpression (line 2242) | function parseBinaryExpression(){var expr,token,prec,previousAllowIn,sta...
function parseConditionalExpression (line 2246) | function parseConditionalExpression(){var expr,previousAllowIn,consequen...
function parseAssignmentExpression (line 2248) | function parseAssignmentExpression(){var token,marker,left,right,node;to...
function parseExpression (line 2250) | function parseExpression(){var marker,expr;marker=createLocationMarker()...
function parseStatementList (line 2251) | function parseStatementList(){var list=[],statement;
function parseBlock (line 2252) | function parseBlock(){var block;delegate.markStart();expect("{");
function parseVariableIdentifier (line 2253) | function parseVariableIdentifier(){var token;delegate.markStart();token=...
function parseVariableDeclaration (line 2254) | function parseVariableDeclaration(kind){var init=null,id;delegate.markSt...
function parseVariableDeclarationList (line 2255) | function parseVariableDeclarationList(kind){var list=[];
function parseVariableStatement (line 2256) | function parseVariableStatement(){var declarations;expectKeyword("var");...
function parseConstLetDeclaration (line 2257) | function parseConstLetDeclaration(kind){var declarations;delegate.markSt...
function parseEmptyStatement (line 2258) | function parseEmptyStatement(){expect(";");return delegate.createEmptySt...
function parseExpressionStatement (line 2258) | function parseExpressionStatement(){var expr=parseExpression();
function parseIfStatement (line 2259) | function parseIfStatement(){var test,consequent,alternate;expectKeyword(...
function parseDoWhileStatement (line 2260) | function parseDoWhileStatement(){var body,test,oldInIteration;
function parseWhileStatement (line 2262) | function parseWhileStatement(){var test,body,oldInIteration;expectKeywor...
function parseForVariableDeclaration (line 2263) | function parseForVariableDeclaration(){var token,declarations;
function parseForStatement (line 2264) | function parseForStatement(){var init,test,update,left,right,body,oldInI...
function parseContinueStatement (line 2269) | function parseContinueStatement(){var label=null,key;expectKeyword("cont...
function parseBreakStatement (line 2272) | function parseBreakStatement(){var label=null,key;expectKeyword("break")...
function parseReturnStatement (line 2275) | function parseReturnStatement(){var argument=null;expectKeyword("return"...
function parseWithStatement (line 2277) | function parseWithStatement(){var object,body;if(strict){throwErrorToler...
function parseSwitchCase (line 2278) | function parseSwitchCase(){var test,consequent=[],statement;delegate.mar...
function parseSwitchStatement (line 2280) | function parseSwitchStatement(){var discriminant,cases,clause,oldInSwitc...
function parseThrowStatement (line 2283) | function parseThrowStatement(){var argument;expectKeyword("throw");if(pe...
function parseCatchClause (line 2284) | function parseCatchClause(){var param,body;delegate.markStart();expectKe...
function parseTryStatement (line 2285) | function parseTryStatement(){var block,handlers=[],finalizer=null;expect...
function parseDebuggerStatement (line 2287) | function parseDebuggerStatement(){expectKeyword("debugger");consumeSemic...
function parseStatement (line 2287) | function parseStatement(){var type=lookahead.type,expr,labeledBody,key;i...
function parseFunctionSourceElements (line 2295) | function parseFunctionSourceElements(){var sourceElement,sourceElements=...
function parseParams (line 2300) | function parseParams(firstRestricted){var param,params=[],token,stricted...
function parseFunctionDeclaration (line 2304) | function parseFunctionDeclaration(){var id,params=[],body,token,stricted...
function parseFunctionExpression (line 2308) | function parseFunctionExpression(){var token,id=null,stricted,firstRestr...
function parseSourceElement (line 2313) | function parseSourceElement(){if(lookahead.type===Token.Keyword){switch(...
function parseSourceElements (line 2314) | function parseSourceElements(){var sourceElement,sourceElements=[],token...
function parseProgram (line 2317) | function parseProgram(){var body;delegate.markStart();strict=false;peek(...
function addComment (line 2318) | function addComment(type,value,start,end,loc){assert(typeof start==="num...
function scanComment (line 2319) | function scanComment(){var comment,ch,loc,start,blockComment,lineComment...
function filterCommentLocation (line 2327) | function filterCommentLocation(){var i,entry,comment,comments=[];
function collectToken (line 2329) | function collectToken(){var start,loc,token,range,value;skipComment();st...
function collectRegex (line 2331) | function collectRegex(){var pos,loc,regex,token;skipComment();pos=index;...
function filterTokenLocation (line 2333) | function filterTokenLocation(){var i,entry,token,tokens=[];for(i=0;i<ext...
function createLocationMarker (line 2334) | function createLocationMarker(){if(!extra.loc&&!extra.range){return null...
function filterGroup (line 2336) | function filterGroup(node){var name;delete node.groupRange;
function wrapTrackingFunction (line 2337) | function wrapTrackingFunction(range,loc){return function(parseFunction){...
function patch (line 2343) | function patch(){var wrapTracking;if(extra.comments){extra.skipComment=s...
function unpatch (line 2345) | function unpatch(){if(typeof extra.skipComment==="function"){skipComment...
function extend (line 2346) | function extend(object,properties){var entry,result={};for(entry in obje...
function tokenize (line 2347) | function tokenize(code,options){var toString,token,tokens;toString=Strin...
function parse (line 2353) | function parse(code,options){var program,toString;toString=String;if(typ...
function loadAsFileSync (line 2378) | function loadAsFileSync(x){x=path.normalize(x);if(require.modules[x]){re...
function loadAsDirectorySync (line 2379) | function loadAsDirectorySync(x){x=x.replace(/\/+$/,"");var pkgfile=path....
function loadNodeModulesSync (line 2381) | function loadNodeModulesSync(x,start){var dirs=nodeModulesPathsSync(star...
function nodeModulesPathsSync (line 2382) | function nodeModulesPathsSync(start){var parts;if(start==="/")parts=[""]...
FILE: togetherjs/tests/doctestjs/examples/examples-2.js
function factorial (line 1) | function factorial(n) {
FILE: togetherjs/tests/doctestjs/examples/long-running-tests.js
function foo (line 3) | function foo() {
function foo2 (line 22) | function foo2() {
FILE: togetherjs/tests/func_forms.js
function selection (line 54) | function selection() {
function select (line 66) | function select(start, end) {
FILE: togetherjs/tests/func_notifications.js
function visible (line 3) | function visible() {
FILE: togetherjs/tests/interactive.js
function addPeer (line 25) | function addPeer(id) {
function pick (line 59) | function pick(seq) {
FILE: togetherjs/tests/test_ot.js
function check (line 94) | function check() {
function runExample (line 120) | function runExample(first, second) {
FILE: togetherjs/tests/test_ot_text.js
function run (line 9) | function run() {
function r (line 43) | function r(start, length, text) {
function trans (line 47) | function trans(text, d1, d2) {
function runTp2 (line 273) | function runTp2() {
FILE: togetherjs/tests/testutils.js
function loadModules (line 36) | function loadModules() {
function printChained (line 200) | function printChained() {
FILE: togetherjs/tests/togetherjs-animations/js/animations.js
function participantScaleUp (line 3) | function participantScaleUp() {
function participantScaleDown (line 7) | function participantScaleDown() {
function notificationSlideIn (line 11) | function notificationSlideIn() {
function notificationSlideInParticipantLeave (line 24) | function notificationSlideInParticipantLeave() {
function notificationChat (line 37) | function notificationChat() {
function closeNotification (line 50) | function closeNotification() {
function closeNotification2 (line 59) | function closeNotification2() {
function closeNotification3 (line 68) | function closeNotification3() {
function cursorPopIn (line 76) | function cursorPopIn() {
function cursorPopOut (line 80) | function cursorPopOut() {
function scaleUp (line 85) | function scaleUp(el, size) {
function chatnotification (line 106) | function chatnotification() {
function participantEnter (line 112) | function participantEnter() {
function participantLeave (line 120) | function participantLeave() {
function participantCursorRotateDown (line 128) | function participantCursorRotateDown() {
function participantCursorRotateUp (line 135) | function participantCursorRotateUp() {
function windowPopOut (line 142) | function windowPopOut() {
function participantTyping (line 150) | function participantTyping() {
function transformPers (line 160) | function transformPers() {
FILE: togetherjs/togetherjs.js
function addStyle (line 188) | function addStyle() {
function addScript (line 200) | function addScript(url) {
function callback (line 349) | function callback(session, jquery) {
function conditionalActivate (line 870) | function conditionalActivate() {
function onload (line 893) | function onload() {
FILE: togetherjs/ui.js
function panelPosition (line 51) | function panelPosition() {
function deferForContainer (line 70) | function deferForContainer(func) {
function submitChat (line 232) | function submitChat() {
function selectoff (line 278) | function selectoff() {
function mousemove (line 281) | function mousemove(event2) {
function openDock (line 318) | function openDock() {
function closeDock (line 363) | function closeDock() {
function sizeDownImage (line 659) | function sizeDownImage(imageUrl) {
function fixupAvatars (line 681) | function fixupAvatars(container) {
function showMenu (line 719) | function showMenu(event) {
function bindMenu (line 727) | function bindMenu() {
function bindPicker (line 739) | function bindPicker() {
function toggleMenu (line 756) | function toggleMenu() {
function hideMenu (line 764) | function hideMenu() {
function maybeHideMenu (line 772) | function maybeHideMenu(event) {
function adjustDockSize (line 784) | function adjustDockSize(buttons) {
function updateShareLink (line 801) | function updateShareLink() {
function CollapsedDock (line 1230) | function CollapsedDock() {
function updateChatParticipantList (line 1371) | function updateChatParticipantList() {
function inviteHubUrl (line 1382) | function inviteHubUrl() {
function refreshInvite (line 1390) | function refreshInvite() {
function invite (line 1459) | function invite(clientId) {
FILE: togetherjs/util.js
function check (line 278) | function check() {
FILE: togetherjs/videos.js
function setupListeners (line 22) | function setupListeners() {
function setupMirroredEvents (line 28) | function setupMirroredEvents(videos) {
function makeEventSender (line 40) | function makeEventSender(eventName) {
function setupTimeSync (line 54) | function setupTimeSync(videos) {
function makeTimeUpdater (line 65) | function makeTimeUpdater() {
function areTooFarApart (line 76) | function areTooFarApart(currentTime, lastTime) {
function unsetListeners (line 84) | function unsetListeners() {
function $findElement (line 115) | function $findElement(location) {
function setTime (line 119) | function setTime(video, time) {
FILE: togetherjs/visibilityApi.js
function change (line 37) | function change() {
FILE: togetherjs/walkthrough.js
function show (line 89) | function show(index) {
function previous (line 104) | function previous() {
function next (line 113) | function next() {
function getIndex (line 122) | function getIndex() {
FILE: togetherjs/webrtc.js
function makePeerConnection (line 43) | function makePeerConnection() {
function ensureCryptoLine (line 63) | function ensureCryptoLine(sdp) {
function getUserMedia (line 83) | function getUserMedia(options, success, failure) {
function savePicture (line 125) | function savePicture(dataUrl) {
function startStreaming (line 146) | function startStreaming() {
function takePicture (line 164) | function takePicture() {
function convertImage (line 197) | function convertImage(imageUrl, callback) {
function audioButton (line 223) | function audioButton(selector) {
function enableAudio (line 264) | function enableAudio() {
function error (line 285) | function error() {
function startStreaming (line 312) | function startStreaming(callback) {
function attachMedia (line 336) | function attachMedia(element, media) {
function getConnection (line 348) | function getConnection() {
function addIceCandidate (line 388) | function addIceCandidate() {
function connect (line 395) | function connect() {
function toggleMute (line 468) | function toggleMute() {
function run (line 483) | function run() {
function abort (line 567) | function abort() {
FILE: togetherjs/who.js
function close (line 49) | function close() {
FILE: togetherjs/windowing.js
function bind (line 48) | function bind(win, bound) {
function bindEvents (line 171) | function bindEvents(el) {
function getModalBackground (line 180) | function getModalBackground() {
FILE: togetherjs/youtubeVideos.js
function prepareYouTube (line 51) | function prepareYouTube() {
function publishPlayerStateChange (line 133) | function publishPlayerStateChange(event) {
function publishDifferentVideoLoaded (line 184) | function publishDifferentVideoLoaded(iframeLocation, videoId) {
function synchronizeVideosOfLateGuest (line 255) | function synchronizeVideosOfLateGuest() {
function isDifferentVideoLoaded (line 272) | function isDifferentVideoLoaded(iframe) {
function getVideoIdFromUrl (line 287) | function getVideoIdFromUrl(videoUrl) {
function areTooFarApart (line 297) | function areTooFarApart(myTime, theirTime) {
Condensed preview — 387 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,693K chars).
[
{
"path": ".csslint.rc",
"chars": 1185,
"preview": "{\n \"empty-rules\": false,\n \"empty-rules-reason\": \"LESS creates some empty rules\",\n\n \"bulletproof-font-face\": false,\n "
},
{
"path": ".gitignore",
"chars": 204,
"preview": "node_modules\n.DS_Store\n.env*\naddon/Profile\ndump.rdb\napp/http/public/recorder.css\nbuild\ntest-build\ntogetherjs.mozillalabs"
},
{
"path": ".jshintrc",
"chars": 631,
"preview": "{\n // JSHint configurations for node-jshint.\n // install with \"npm install -g jshint\"\n // run with \"jshint <fil"
},
{
"path": ".travis.yml",
"chars": 104,
"preview": "language: node_js\nnode_js:\n - \"0.10\"\nbefore_install:\n - npm install -g npm\n - npm install -g grunt-cli\n"
},
{
"path": "CONTRIBUTING.md",
"chars": 1571,
"preview": "Thanks for your interest in contributing to TogetherJS!\n\nIf you found a bug, if at all possible give us a URL where we c"
},
{
"path": "Gruntfile.js",
"chars": 27913,
"preview": "/*jshint forin:false */\n\nvar fs = require(\"fs\");\nvar path = require('path');\nvar nunjucks = require(\"nunjucks\");\nvar mar"
},
{
"path": "LICENSE.html",
"chars": 18406,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"generator\" content=\"pandoc\" />\n <title>Mozilla P"
},
{
"path": "Procfile",
"chars": 24,
"preview": "web: node hub/server.js\n"
},
{
"path": "README.md",
"chars": 5649,
"preview": "TogetherJS - Surprisingly easy collaboration\n============================================\n\nWhat is TogetherJS?\n---------"
},
{
"path": "addon/.gitignore",
"chars": 8,
"preview": "Profile*"
},
{
"path": "addon/Procfile",
"chars": 155,
"preview": "profilea: cfx run --binary /Applications/FirefoxNightly.app -p ProfileA \nprofileb: sleep 1; cfx run --binary /Applicatio"
},
{
"path": "addon/README.md",
"chars": 155,
"preview": "The Firefox Addon simply adds togetherjs.js to a window - when you turn\nit on the tab gets togetherjs for that one tab, "
},
{
"path": "addon/data/attachment.js",
"chars": 743,
"preview": "/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not "
},
{
"path": "addon/data/button.html",
"chars": 68,
"preview": "<div>\n <a id=\"togetherjs-button\" href=\"#\">togetherjs</span>\n</div>\n"
},
{
"path": "addon/data/button.js",
"chars": 446,
"preview": "/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not "
},
{
"path": "addon/data/startup-help.html",
"chars": 700,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <title>Welcome to TogetherJS</title>\n </head>\n <body>\n\n<p>Thanks for checking out "
},
{
"path": "addon/lib/main.js",
"chars": 3203,
"preview": "/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not "
},
{
"path": "addon/lib/startup-panel.js",
"chars": 2206,
"preview": "/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not "
},
{
"path": "addon/package.json",
"chars": 984,
"preview": "{\n \"preferences\": [\n {\n \"title\": \"togetherjs.js location\", \n \"type\": \"string\", \n "
},
{
"path": "client",
"chars": 0,
"preview": ""
},
{
"path": "devserver.js",
"chars": 1049,
"preview": "var\nhttp = require(\"http\"),\nurl = require(\"url\"),\npath = require(\"path\"),\nfs = require(\"fs\"),\nport = process.argv[2] "
},
{
"path": "hub/server.js",
"chars": 13332,
"preview": "/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not "
},
{
"path": "hub/websocket-compat.js",
"chars": 5092,
"preview": "/*\n * A hacked websocket module which retains compatibility with the old\n * Hixie-76 version of the standard, needed for"
},
{
"path": "package.json",
"chars": 1339,
"preview": "{\n \"name\": \"togetherjs\",\n \"version\": \"0.4.0a\",\n \"main\": \"hub/server.js\",\n \"description\": \"Collaborative help system\""
},
{
"path": "phantomjs/bridge.js",
"chars": 2359,
"preview": "(function (doctest) {\n 'use strict';\n\n // Function.bind is not defined in phantomjs (!) so polyfill it\n if (!Function"
},
{
"path": "site/base.tmpl",
"chars": 6915,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n <head>\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE"
},
{
"path": "site/bookmarklet.html",
"chars": 900,
"preview": "{% extends \"base.tmpl\" %}\n{% block title %}TogetherJS Bookmarklet{% endblock %}\n{% block styles %}\n\n<script>\n\nfunction b"
},
{
"path": "site/css/bootstrap.css",
"chars": 101028,
"preview": "/*!\n * Bootstrap v3.0.0\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache"
},
{
"path": "site/css/carousel.css",
"chars": 2854,
"preview": "/* GLOBAL STYLES\n-------------------------------------------------- */\n/* Padding below the footer and lighter body text"
},
{
"path": "site/css/docco.css",
"chars": 9288,
"preview": "/*--------------------- Typography ----------------------------*/\n/*\n@font-face {\n font-family: 'aller-light';\n sr"
},
{
"path": "site/css/grid.css",
"chars": 399,
"preview": "/*THESE ARE GUIDELINES*/\n\n.container {\n/* padding-left: 15px;\n padding-right: 15px;*/\n}\n\n.row {\n margin-bottom: 20px;"
},
{
"path": "site/css/jumbotron.css",
"chars": 468,
"preview": "body {\n padding-bottom: 20px;\n}\n\n/* Wrapping element */\n/* Set some basic padding to keep content from hitting the edge"
},
{
"path": "site/css/responsive-video.css",
"chars": 717,
"preview": "\n/*Courtesy of\nhttps://gist.github.com/jgarber/2302238*/\n\n.flex-video {\n position: relative;\n padding-top: 25px;\n pad"
},
{
"path": "site/css/style.css",
"chars": 22629,
"preview": "/*\nColor palette based on Mozilla Style guide\nhttp://www.mozilla.org/en-US/styleguide/identity/firefox/color/\n\nBlue\n#009"
},
{
"path": "site/docs/contributing.md",
"chars": 7470,
"preview": "# Contributing to TogetherJS\n\n<!--\ntemplate: docs-contributing.tmpl\n\nNote: you should update the index in that template "
},
{
"path": "site/docs/faq.md",
"chars": 267,
"preview": "# FAQ\n\n## When I add a field dynamically it doesn't appear on the other person's page!\n\n## Will I see what the other per"
},
{
"path": "site/docs/index.md",
"chars": 35509,
"preview": "# Documentation\n\n<!--\ntemplate: docs.tmpl\n-->\n\nWould you like to use TogetherJS on your site? Great! If you have feedb"
},
{
"path": "site/docs-contributing.tmpl",
"chars": 1187,
"preview": "{% extends \"base.tmpl\" %}\n{# set enableMarkdown true #}\n{% block body_tag %}data-spy=\"scroll\" data-target=\"#markdownpage"
},
{
"path": "site/docs.tmpl",
"chars": 2493,
"preview": "{% extends \"base.tmpl\" %}\n{# set enableMarkdown true #}\n{% block body_tag %}data-spy=\"scroll\" data-target=\"#markdownpage"
},
{
"path": "site/errors/404.html",
"chars": 682,
"preview": "{% extends \"base.tmpl\" %}\n{% block title %} Mozilla Labs : 404 error {% endblock %}\n{# set enableExample false #}\n{# set"
},
{
"path": "site/errors/500.html",
"chars": 662,
"preview": "{% extends \"base.tmpl\" %}\n{% block title %} Mozilla Labs : 500 error {% endblock %}\n{# set enableExample false #}\n{# set"
},
{
"path": "site/examples/drawing/css/main.css",
"chars": 301,
"preview": ".upper-button {\n\tborder-bottom-left-radius: 0px;\n\tborder-bottom-right-radius: 0px;\n}\n.bottom-button {\n\tborder-top-left-r"
},
{
"path": "site/examples/drawing/index.html",
"chars": 2704,
"preview": "{% extends \"base.tmpl\" %}\n{% block title %} Mozilla Labs : TogetherJS app integration example {% endblock %}\n{# set enab"
},
{
"path": "site/examples/drawing/js/sketch.js",
"chars": 9986,
"preview": "// get the canvas element and its context\nvar canvas = document.getElementById('sketch');\nvar context = canvas.getContex"
},
{
"path": "site/examples/friendlycode/.gitignore",
"chars": 66,
"preview": "js/friendlycode-built.js\ncss/friendlycode-built.css\nnode_modules/\n"
},
{
"path": "site/examples/friendlycode/.gitmodules",
"chars": 88,
"preview": "[submodule \"slowparse\"]\n\tpath = slowparse\n\turl = git://github.com/mozilla/slowparse.git\n"
},
{
"path": "site/examples/friendlycode/LICENSE.html",
"chars": 18549,
"preview": "<!DOCTYPE html>\n<html><head>\n<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n <meta charset=\"utf-8\""
},
{
"path": "site/examples/friendlycode/LICENSE_files/css.css",
"chars": 289,
"preview": "@font-face {\n font-family: 'Droid Sans Mono';\n font-style: normal;\n font-weight: normal;\n src: local('Droid Sans Mon"
},
{
"path": "site/examples/friendlycode/LICENSE_files/css_002.css",
"chars": 285,
"preview": "@font-face {\n font-family: 'Crimson Text';\n font-style: normal;\n font-weight: normal;\n src: local('Crimson Text'), l"
},
{
"path": "site/examples/friendlycode/LICENSE_files/css_003.css",
"chars": 234,
"preview": "@font-face {\n font-family: 'Lora';\n font-style: normal;\n font-weight: normal;\n src: local('Lora'), url('http://theme"
},
{
"path": "site/examples/friendlycode/README.md",
"chars": 1151,
"preview": "This is a friendly HTML editor that uses [slowparse][] and [hacktionary][]\nto provide ultra-friendly real-time help to n"
},
{
"path": "site/examples/friendlycode/build-require.js",
"chars": 1933,
"preview": "/**\n * to run this script,\n * 1. install npm, `curl http://npmjs.org/install.sh | sh`\n * https://github.com/isaacs/"
},
{
"path": "site/examples/friendlycode/codemirror2/lib/codemirror.css",
"chars": 3486,
"preview": ".CodeMirror {\n line-height: 1em;\n font-family: monospace;\n}\n\n.CodeMirror-scroll {\n overflow: auto;\n height: 300px;\n "
},
{
"path": "site/examples/friendlycode/codemirror2/lib/codemirror.js",
"chars": 126250,
"preview": "// CodeMirror version 2.25\n//\n// All functions that need access to the editor's state live inside\n// the CodeMirror func"
},
{
"path": "site/examples/friendlycode/codemirror2/mode/css/css.js",
"chars": 3646,
"preview": "CodeMirror.defineMode(\"css\", function(config) {\n var indentUnit = config.indentUnit, type;\n function ret(style, tp) {t"
},
{
"path": "site/examples/friendlycode/codemirror2/mode/htmlmixed/htmlmixed.js",
"chars": 2957,
"preview": "CodeMirror.defineMode(\"htmlmixed\", function(config, parserConfig) {\n var htmlMode = CodeMirror.getMode(config, {name: \""
},
{
"path": "site/examples/friendlycode/codemirror2/mode/javascript/javascript.js",
"chars": 12819,
"preview": "CodeMirror.defineMode(\"javascript\", function(config, parserConfig) {\n var indentUnit = config.indentUnit;\n var jsonMod"
},
{
"path": "site/examples/friendlycode/codemirror2/mode/xml/xml.js",
"chars": 10170,
"preview": "CodeMirror.defineMode(\"xml\", function(config, parserConfig) {\n var indentUnit = config.indentUnit;\n var Kludges = pars"
},
{
"path": "site/examples/friendlycode/css/buttons.css",
"chars": 1886,
"preview": ".wm-button {\n display: inline-block;\n padding: 0 12px;\n white-space: nowrap;\n -webkit-box-sizing: border-box;\n -moz"
},
{
"path": "site/examples/friendlycode/css/editor.css",
"chars": 9609,
"preview": ".friendlycode-base {\n font-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n overflow: hidden;\n b"
},
{
"path": "site/examples/friendlycode/css/errorhelp.css",
"chars": 4318,
"preview": "/* ------ ERRORS AND HELP MESSAGE STYLING ------ */\r\n\r\nhtml .flipped {\r\n margin-top: -180px;\r\n}\r\n\r\nhtml .help:not(.flip"
},
{
"path": "site/examples/friendlycode/css/friendlycode.css",
"chars": 624,
"preview": "/* \n * This stylesheet is only intended for development purposes,\n * due to the inefficiency of @import [1]. For product"
},
{
"path": "site/examples/friendlycode/css/jsbin-codemirror-theme.css",
"chars": 2744,
"preview": "/* jsbin - based on web inspector */\n.cm-s-jsbin span.cm-keyword {color: #AA0D91;}\n.cm-s-jsbin span.cm-atom {color: #219"
},
{
"path": "site/examples/friendlycode/css/modals.css",
"chars": 5257,
"preview": "/**\n * Styling for webpagemaker editor modal dialogs\n */\n\n.modal-overlay {\n z-index: 10000;\n display: block;\n positio"
},
{
"path": "site/examples/friendlycode/css/modals_full_screen.css",
"chars": 1939,
"preview": "/**\n * Styling for webpagemaker editor modal dialogs\n */\n\n.modal-overlay {\n z-index: 2000;\n display: block;\n position"
},
{
"path": "site/examples/friendlycode/css/opensans/stylesheet.css",
"chars": 1152,
"preview": "/* The font family/weight/style of these rules is taken from Tabzilla's CSS:\n https://raw.github.com/mozilla/tabzilla/"
},
{
"path": "site/examples/friendlycode/css/opensymbolcropped/stylesheet.css",
"chars": 533,
"preview": "/* \n Crop of the Symbol set of the \"OpenSymbol\" font,\n from the LibreOffice project, which is licensed\n under LGPLv3+"
},
{
"path": "site/examples/friendlycode/css/tipsy.css",
"chars": 2164,
"preview": ".tipsy { font-size: 10px; position: absolute; padding: 5px; z-index: 100000; }\n .tipsy-inner { background-color: #000; "
},
{
"path": "site/examples/friendlycode/css/ubuntumono/stylesheet.css",
"chars": 637,
"preview": "/*\n http://font.ubuntu.com\n*/\n\n@font-face {\n font-family: 'Ubuntu Mono';\n src: url('ubuntumono-r.eot');\n src"
},
{
"path": "site/examples/friendlycode/examples/alternate-publisher.html",
"chars": 2684,
"preview": "<!DOCTYPE html>\n<html class=\"deployment-type-development\">\n <head>\n <meta charset=\"utf-8\">\n <base target=\"_blank\""
},
{
"path": "site/examples/friendlycode/examples/bare-optimized.html",
"chars": 787,
"preview": "<!DOCTYPE html>\n<html class=\"deployment-type-development\">\n <head>\n <meta charset=\"utf-8\">\n <base target=\"_blank\""
},
{
"path": "site/examples/friendlycode/examples/bare.html",
"chars": 706,
"preview": "<!DOCTYPE html>\n<html class=\"deployment-type-development\">\n <head>\n <meta charset=\"utf-8\">\n <base target=\"_blank\""
},
{
"path": "site/examples/friendlycode/examples/editor-only.html",
"chars": 678,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <meta charset=\"utf-8\">\n <base target=\"_blank\">\n\n <title>Editor Only</title>\n "
},
{
"path": "site/examples/friendlycode/index.html",
"chars": 1908,
"preview": "<!DOCTYPE html>\n<html class=\"deployment-type-development\">\n <head>\n <meta charset=\"utf-8\">\n <base target=\"_blank\""
},
{
"path": "site/examples/friendlycode/js/backbone-events.js",
"chars": 1062,
"preview": "// This simple module is just a helper that allows us to go from this code:\n//\n// _.extend(object, Backbone.Events)\n//"
},
{
"path": "site/examples/friendlycode/js/fc/current-page-manager.js",
"chars": 2465,
"preview": "define(function() {\n function defaultLoadPage(window) {\n // We don't currently support dynamically changing the URL\n"
},
{
"path": "site/examples/friendlycode/js/fc/hacktionary-data.js",
"chars": 86114,
"preview": "\"use strict\";\n\n// Data here is ultimately scraped from MDN:\n// https://github.com/toolness/hacktionary\ndefine(function()"
},
{
"path": "site/examples/friendlycode/js/fc/help.js",
"chars": 4405,
"preview": "\"use strict\";\n\ndefine([\"./hacktionary-data\"], function(HacktionaryData) {\n // A help index provides context-sensitive h"
},
{
"path": "site/examples/friendlycode/js/fc/parachute.js",
"chars": 1921,
"preview": "\"use strict\";\n\n// This helper saves the editor's data to local storage just before\n// the page unloads, and provides a m"
},
{
"path": "site/examples/friendlycode/js/fc/prefs.js",
"chars": 918,
"preview": "define([\"backbone\", \"lscache\"], function(Backbone, lscache) {\n \n var Preferences = Backbone.Model.extend({\n // Amou"
},
{
"path": "site/examples/friendlycode/js/fc/publisher.js",
"chars": 2245,
"preview": "\"use strict\";\n\n// This class is responsible for communicating with a publishing server\n// to save and load published cod"
},
{
"path": "site/examples/friendlycode/js/fc/ui/context-sensitive-help.js",
"chars": 3633,
"preview": "\"use strict\";\n\n// Provides context-sensitive help for a ParsingCodeMirror based on\n// the current cursor position.\ndefin"
},
{
"path": "site/examples/friendlycode/js/fc/ui/editor-panes.js",
"chars": 2257,
"preview": "define(function(require) {\n var $ = require(\"jquery\"),\n Slowparse = require(\"slowparse/slowparse\"),\n TreeInsp"
},
{
"path": "site/examples/friendlycode/js/fc/ui/editor-toolbar.js",
"chars": 3214,
"preview": "define(function(require) {\n var $ = require(\"jquery-tipsy\"),\n Preferences = require(\"fc/prefs\"),\n HistoryUI ="
},
{
"path": "site/examples/friendlycode/js/fc/ui/editor.js",
"chars": 860,
"preview": "define([\n \"jquery\",\n \"./editor-panes\",\n \"./editor-toolbar\"\n], function($, EditorPanes, EditorToolbar) {\n return func"
},
{
"path": "site/examples/friendlycode/js/fc/ui/error-help.js",
"chars": 2581,
"preview": "\"use strict\";\n\n// Provides helpful Slowparse-based error suggestions for a\n// ParsingCodeMirror.\ndefine([\"jquery-slowpar"
},
{
"path": "site/examples/friendlycode/js/fc/ui/gutter-pointer.js",
"chars": 2266,
"preview": "\"use strict\";\n\n// gutterPointer(codeMirror, highlightClass)\n//\n// This function creates and returns an SVG shape that lo"
},
{
"path": "site/examples/friendlycode/js/fc/ui/history.js",
"chars": 777,
"preview": "\"use strict\";\n\n// This manages the UI for undo/redo.\ndefine(function() {\n return function HistoryUI(options) {\n var "
},
{
"path": "site/examples/friendlycode/js/fc/ui/indexable-codemirror.js",
"chars": 526,
"preview": "\"use strict\";\n\n// A subclass of CodeMirror which adds a few methods that make it easier\n// to work with character indexe"
},
{
"path": "site/examples/friendlycode/js/fc/ui/live-preview.js",
"chars": 2294,
"preview": "\"use strict\";\n\n// Displays the HTML source of a CodeMirror editor as a rendered preview\n// in an iframe.\ndefine([\"jquery"
},
{
"path": "site/examples/friendlycode/js/fc/ui/mark-tracker.js",
"chars": 1659,
"preview": "\"use strict\";\n\n// This helper class keeps track of different kinds of highlighting in\n// a CodeMirror instance.\ndefine(["
},
{
"path": "site/examples/friendlycode/js/fc/ui/modals.js",
"chars": 1209,
"preview": "\"use strict\";\r\n\r\ndefine(function (require) {\r\n var $ = require(\"jquery\"),\r\n ErrorDialogTemplate = require(\"templat"
},
{
"path": "site/examples/friendlycode/js/fc/ui/parsing-codemirror.js",
"chars": 1790,
"preview": "\"use strict\";\n\n// A subclass of IndexableCodeMirror which continuously re-parses\n// the code in its editor. Also adds a "
},
{
"path": "site/examples/friendlycode/js/fc/ui/preview-to-editor-mapping.js",
"chars": 3372,
"preview": "\"use strict\";\n\ndefine([\"jquery\", \"./mark-tracker\"], function($, MarkTracker) {\n // Given a descendant of the given root"
},
{
"path": "site/examples/friendlycode/js/fc/ui/publish.js",
"chars": 4980,
"preview": "\"use strict\";\n\ndefine(function (require) {\n var $ = require(\"jquery\"),\n BackboneEvents = require(\"backbone-events\""
},
{
"path": "site/examples/friendlycode/js/fc/ui/relocator.js",
"chars": 3079,
"preview": "\"use strict\";\n\n// code will relocate an error or help message to near where the error actually is in CodeMirror.\ndefine("
},
{
"path": "site/examples/friendlycode/js/fc/ui/social-media.js",
"chars": 2745,
"preview": "\"use strict\";\n\n/**\n * A tiny library for load-loading social media share buttons.\n * If we don't do this, social media w"
},
{
"path": "site/examples/friendlycode/js/fc/ui/text.js",
"chars": 1635,
"preview": "\"use strict\";\r\n\r\ndefine([\"jquery\", \"fc/prefs\"], function($, Preferences) {\r\n return function(options) {\r\n var codeMi"
},
{
"path": "site/examples/friendlycode/js/friendlycode.js",
"chars": 3719,
"preview": "define(function(require) {\n var $ = require(\"jquery\"),\n Preferences = require(\"fc/prefs\"),\n Editor = require("
},
{
"path": "site/examples/friendlycode/js/jquery.no-conflict.js",
"chars": 396,
"preview": "define([\"jquery.min\"], function(jQuery) {\n // Prevent modules from accidentally accessing the $ global rather\n // than"
},
{
"path": "site/examples/friendlycode/js/jquery.tipsy.js",
"chars": 9324,
"preview": "// tipsy, facebook style tooltips for jquery\n// version 1.0.0a\n// (c) 2008-2010 jason frame [jason@onehackoranother.com]"
},
{
"path": "site/examples/friendlycode/js/lscache.js",
"chars": 7899,
"preview": "/**\n * lscache library\n * Copyright (c) 2011, Pamela Fox\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": "site/examples/friendlycode/js/require-config.js",
"chars": 2648,
"preview": "var require = {\n baseUrl: \"js\",\n shim: {\n underscore: {\n exports: function() {\n return _.noConflict();\n"
},
{
"path": "site/examples/friendlycode/js/require-plugins/template.js",
"chars": 944,
"preview": "// This is a simple RequireJS plugin that loads an underscore.js template.\ndefine([\"module\", \"text\", \"underscore\"], func"
},
{
"path": "site/examples/friendlycode/js/require-plugins/text.js",
"chars": 3081,
"preview": "/*\n RequireJS text 1.0.8 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved.\n Available via the MIT or new"
},
{
"path": "site/examples/friendlycode/js/slowparse-errors.js",
"chars": 330,
"preview": "\"use strict\";\n\ndefine([\n 'jquery-slowparse',\n 'text!slowparse/spec/errors.base.html',\n 'text!slowparse/spec/errors.fo"
},
{
"path": "site/examples/friendlycode/package.json",
"chars": 257,
"preview": "{\n \"name\": \"build-require\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"description\": \"requirejs optimization script\",\n"
},
{
"path": "site/examples/friendlycode/slowparse/.gitignore",
"chars": 5,
"preview": "docs\n"
},
{
"path": "site/examples/friendlycode/slowparse/LICENSE.html",
"chars": 18549,
"preview": "<!DOCTYPE html>\n<html><head>\n<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n <meta charset=\"utf-8\""
},
{
"path": "site/examples/friendlycode/slowparse/LICENSE_files/css.css",
"chars": 289,
"preview": "@font-face {\n font-family: 'Droid Sans Mono';\n font-style: normal;\n font-weight: normal;\n src: local('Droid Sans Mon"
},
{
"path": "site/examples/friendlycode/slowparse/LICENSE_files/css_002.css",
"chars": 285,
"preview": "@font-face {\n font-family: 'Crimson Text';\n font-style: normal;\n font-weight: normal;\n src: local('Crimson Text'), l"
},
{
"path": "site/examples/friendlycode/slowparse/LICENSE_files/css_003.css",
"chars": 234,
"preview": "@font-face {\n font-family: 'Lora';\n font-style: normal;\n font-weight: normal;\n src: local('Lora'), url('http://theme"
},
{
"path": "site/examples/friendlycode/slowparse/README.md",
"chars": 2583,
"preview": "Slowparse is an experimental JavaScript-based HTML parser for Mozilla Webmaking initiatives.\n\nUntil now, most of Mozilla"
},
{
"path": "site/examples/friendlycode/slowparse/demo/hierarchic-source-code.css",
"chars": 1720,
"preview": "div.element {\n position: relative;\n white-space: pre-wrap;\n font-family: Monaco;\n font-size: 9pt;\n color: rgba(0,0,"
},
{
"path": "site/examples/friendlycode/slowparse/demo/index.html",
"chars": 4813,
"preview": "<!DOCTYPE html>\n<meta charset=\"utf-8\">\n<title>Slowparse Demo</title>\n<link rel=\"stylesheet\" href=\"hierarchic-source-code"
},
{
"path": "site/examples/friendlycode/slowparse/demo/jsbin-codemirror-theme.css",
"chars": 933,
"preview": "/* jsbin - based on web inspector */\n.cm-s-jsbin span.cm-keyword {color: #AA0D91;}\n.cm-s-jsbin span.cm-atom {color: #219"
},
{
"path": "site/examples/friendlycode/slowparse/demo/render-dom.js",
"chars": 2185,
"preview": "(function(jQuery) {\n \"use strict\";\n \n var $ = jQuery;\n\n function makeAttributeList(node) {\n var attribs = $('<ul "
},
{
"path": "site/examples/friendlycode/slowparse/demo/tag-colors.js",
"chars": 2096,
"preview": "(function(jQuery) {\n \"use strict\";\n\n var $ = jQuery;\n \n var TAG_COLORS = [\n \"#C60C46\",\n \"#00AEEF\",\n \"#F3739"
},
{
"path": "site/examples/friendlycode/slowparse/demo/utils.js",
"chars": 9187,
"preview": "(function(jQuery) {\n \"use strict\";\n\n var $ = jQuery;\n var HEX_REGEXP = /#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i;\n "
},
{
"path": "site/examples/friendlycode/slowparse/index.html",
"chars": 684,
"preview": "<!DOCTYPE html>\n<meta charset=\"utf-8\">\n<link rel=\"stylesheet\" href=\"vendor/docco.css\">\n<title></title>\n<div id=\"containe"
},
{
"path": "site/examples/friendlycode/slowparse/slowparse.js",
"chars": 54470,
"preview": "\"use strict\";\n\n// Slowparse is a token stream parser for HTML and CSS text,\n// recording regions of interest during the "
},
{
"path": "site/examples/friendlycode/slowparse/spec/errors.base.html",
"chars": 5930,
"preview": "<!-- HTML ERRORS -->\n<div class=\"error-msg UNEXPECTED_CLOSE_TAG\">\n <p>The closing <code></{{closeTag.name}}></cod"
},
{
"path": "site/examples/friendlycode/slowparse/spec/errors.forbidjs.html",
"chars": 1211,
"preview": "<!-- FORBIDJS ERRORS -->\n<div class=\"error-msg SCRIPT_ELEMENT_NOT_ALLOWED\">\n <p>Sorry, but security restrictions on thi"
},
{
"path": "site/examples/friendlycode/slowparse/spec/errors.jquery.js",
"chars": 6716,
"preview": "\"use strict\";\n\n// This jQuery plugin adds functions that make it easy to display\n// friendly tips to a user based on Slo"
},
{
"path": "site/examples/friendlycode/slowparse/spec/index.html",
"chars": 11788,
"preview": "<!DOCTYPE html>\n<meta charset=\"utf-8\">\n<title>Slowparse Error Reporting Specification</title>\n<style>\nhtml, body {\n fon"
},
{
"path": "site/examples/friendlycode/slowparse/spec/spec.js",
"chars": 5179,
"preview": "\"use strict\";\n\njQuery.fn.extend({\n // Take the given element containing plain-text source code and\n // rewrite it to h"
},
{
"path": "site/examples/friendlycode/slowparse/test/index.html",
"chars": 1019,
"preview": "<!DOCTYPE html>\n<html>\n </head>\n <meta charset=\"utf-8\">\n <title>Slowparse Test Suite</title>\n <link rel=\"style"
},
{
"path": "site/examples/friendlycode/slowparse/test/qunit.css",
"chars": 4656,
"preview": "/**\n * QUnit v1.6.0pre - A JavaScript Unit Testing Framework\n *\n * http://docs.jquery.com/QUnit\n *\n * Copyright (c) 2012"
},
{
"path": "site/examples/friendlycode/slowparse/test/qunit.js",
"chars": 43553,
"preview": "/**\n * QUnit v1.6.0pre - A JavaScript Unit Testing Framework\n *\n * http://docs.jquery.com/QUnit\n *\n * Copyright (c) 2012"
},
{
"path": "site/examples/friendlycode/slowparse/test/test-errors.jquery.js",
"chars": 1487,
"preview": "module(\"errors.jquery.js\");\n\ntest(\"$.fn.fillError() raises nice err when template not found\", function() {\n try {\n v"
},
{
"path": "site/examples/friendlycode/slowparse/test/test-slowparse.js",
"chars": 19085,
"preview": "module(\"Slowparse\");\n\ntest(\"Stream.match()\", function() {\n var stream = new Slowparse.Stream(\"blArgle\");\n ok(stream.ma"
},
{
"path": "site/examples/friendlycode/slowparse/test/test-spec.js",
"chars": 419,
"preview": "module(\"Specification loading\");\n\nasyncTest(\"frame loads\", function() {\n var iframe = document.createElement(\"iframe\");"
},
{
"path": "site/examples/friendlycode/slowparse/test/test-tree-inspectors.js",
"chars": 1641,
"preview": "module(\"TreeInspectors.forbidJS()\");\n\ntest(\"works on script-less HTML\", function() {\n var html = '<p class=\"hi\">hello</"
},
{
"path": "site/examples/friendlycode/slowparse/test/testing-utils.js",
"chars": 2378,
"preview": "// Get the innerHTML of a document fragment.\nfunction documentFragmentHTML(doc) {\n var div = document.createElement(\"di"
},
{
"path": "site/examples/friendlycode/slowparse/tree-inspectors.js",
"chars": 3248,
"preview": "\"use strict\";\n\n// `TreeInspectors` contains functions that inspect a document\n// fragment and report interesting things "
},
{
"path": "site/examples/friendlycode/slowparse/vendor/brocco.js",
"chars": 14251,
"preview": "\"use strict\";\n\n// This is a simple port of [Docco][] to the browser, which potentially\n// relieves developers of needing"
},
{
"path": "site/examples/friendlycode/slowparse/vendor/codemirror2/lib/codemirror.css",
"chars": 1616,
"preview": ".CodeMirror {\n line-height: 1em;\n font-family: monospace;\n}\n\n.CodeMirror-scroll {\n overflow: auto;\n height: 300px;\n "
},
{
"path": "site/examples/friendlycode/slowparse/vendor/codemirror2/lib/codemirror.js",
"chars": 112373,
"preview": "// CodeMirror v2.18\n\n// All functions that need access to the editor's state live inside\n// the CodeMirror function. Bel"
},
{
"path": "site/examples/friendlycode/slowparse/vendor/codemirror2/mode/css/css.js",
"chars": 3642,
"preview": "CodeMirror.defineMode(\"css\", function(config) {\n var indentUnit = config.indentUnit, type;\n function ret(style, tp) {t"
},
{
"path": "site/examples/friendlycode/slowparse/vendor/codemirror2/mode/htmlmixed/htmlmixed.js",
"chars": 2837,
"preview": "CodeMirror.defineMode(\"htmlmixed\", function(config, parserConfig) {\n var htmlMode = CodeMirror.getMode(config, {name: \""
},
{
"path": "site/examples/friendlycode/slowparse/vendor/codemirror2/mode/javascript/javascript.js",
"chars": 12529,
"preview": "CodeMirror.defineMode(\"javascript\", function(config, parserConfig) {\n var indentUnit = config.indentUnit;\n var jsonMod"
},
{
"path": "site/examples/friendlycode/slowparse/vendor/codemirror2/mode/xml/xml.js",
"chars": 6882,
"preview": "CodeMirror.defineMode(\"xml\", function(config, parserConfig) {\n var indentUnit = config.indentUnit;\n var Kludges = pars"
},
{
"path": "site/examples/friendlycode/slowparse/vendor/docco.css",
"chars": 7207,
"preview": "/*--------------------- Layout and Typography ----------------------------*/\nbody {\n font-family: 'Palatino Linotype', "
},
{
"path": "site/examples/friendlycode/slowparse/vendor/jump-to.js",
"chars": 2195,
"preview": "\"use strict\";\n\n// This is a simple add-on to [Brocco][] which provides a Docco-style\n// *Jump To…* menu at the to"
},
{
"path": "site/examples/friendlycode/slowparse/vendor/showdown.js",
"chars": 33774,
"preview": "//\n// showdown.js -- A javascript port of Markdown.\n//\n// Copyright (c) 2007 John Fraser.\n//\n// Original Markdown Copyri"
},
{
"path": "site/examples/friendlycode/templates/confirm-dialog.html",
"chars": 1165,
"preview": "<div class=\"confirm-dialog modal-overlay\" style=\"display: none;\">\n <div class=\"thimble-modal-menu thimble-question-bar\""
},
{
"path": "site/examples/friendlycode/templates/default-content.html",
"chars": 155,
"preview": "<!doctype html>\n<html>\n <head>\n <title>Your Awesome Webpage</title>\n </head>\n <body>\n <p>Make something amazing"
},
{
"path": "site/examples/friendlycode/templates/error-dialog.html",
"chars": 271,
"preview": "<div class=\"modal-overlay\" style=\"display: none;\">\n <div class=\"thimble-error\">\n <div class=\"thimble-title thimble-g"
},
{
"path": "site/examples/friendlycode/templates/error-msg.html",
"chars": 129,
"preview": "<div class=\"up-arrow\"></div>\n<div class=\"icon\"></div>\n<div class=\"content\">\n <%= error %>\n</div>\n<div class=\"down-arrow"
},
{
"path": "site/examples/friendlycode/templates/help-msg.html",
"chars": 321,
"preview": "<div class=\"up-arrow\"></div>\n<div class=\"icon\"></div>\n<div class=\"content\">\n <%= html %>\n <% if (type == \"cssSelector\""
},
{
"path": "site/examples/friendlycode/templates/nav-options.html",
"chars": 1657,
"preview": "<div class=\"nav-options\">\n <div class=\"editor-pane-nav-options\">\n <!-- editor, undo, redo, text size, hinting -->\n "
},
{
"path": "site/examples/friendlycode/templates/publish-dialog.html",
"chars": 1527,
"preview": "<div class=\"publish-dialog modal-overlay\" style=\"display: none;\">\n <div class=\"thimble-modal-menu thimble-grey-bar\">\n "
},
{
"path": "site/examples/friendlycode/test/all-tests.js",
"chars": 511,
"preview": "defineTests.combine([\n \"test/test-app\",\n \"test/test-help\",\n \"test/test-templates\",\n \"test/test-indexable-codemirror\""
},
{
"path": "site/examples/friendlycode/test/codemirror-577/original.html",
"chars": 67,
"preview": "<!doctype html>\n<!--\nHere is a comment.\n-->\n\n<html>\n</body>\n</html>"
},
{
"path": "site/examples/friendlycode/test/codemirror-577/replacer.html",
"chars": 52,
"preview": "<html>\n <head>\n </head>\n <body>\n </body>\n</html>"
},
{
"path": "site/examples/friendlycode/test/codemirror-577/test-codemirror-577.js",
"chars": 753,
"preview": "\"use strict\";\n\ndefineTests([\n \"jquery\",\n \"codemirror\",\n \"text!test/codemirror-577/original.html\",\n \"text!test/codemi"
},
{
"path": "site/examples/friendlycode/test/define-tests.js",
"chars": 1510,
"preview": "// Because we're using requirejs to asynchronously load tests,\n// we need to have manual control over the running of tes"
},
{
"path": "site/examples/friendlycode/test/index-optimized.html",
"chars": 961,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <meta charset=\"utf-8\">\n <title>Friendlycode Test Suite - Optimized Build</title>\n"
},
{
"path": "site/examples/friendlycode/test/index.html",
"chars": 807,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <meta charset=\"utf-8\">\n <title>Friendlycode Test Suite</title>\n <link rel=\"sty"
},
{
"path": "site/examples/friendlycode/test/lptest.js",
"chars": 1074,
"preview": "define([\n \"jquery\",\n \"backbone-events\",\n \"fc/ui/live-preview\",\n \"slowparse/slowparse\"\n], function($, BackboneEvents,"
},
{
"path": "site/examples/friendlycode/test/preview-to-editor-mapping/path-to.html",
"chars": 1059,
"preview": "<div class=\"test-case\" data-expect=\" > div:nth-of-type(1)\">\n <div data-target=\"true\"></div>\n</div>\n<div class=\"test-cas"
},
{
"path": "site/examples/friendlycode/test/preview-to-editor-mapping/test-preview-to-editor-mapping.js",
"chars": 3219,
"preview": "defineTests([\n \"jquery\",\n \"fc/ui/preview-to-editor-mapping\",\n \"test/lptest\",\n \"text!test/preview-to-editor-mapping/p"
},
{
"path": "site/examples/friendlycode/test/publisher/post-publish.html",
"chars": 174,
"preview": "<!DOCTYPE html><html><head>\n <title>hello</title>\n <style>\n p {\n color: blue;\n }\n </style>\n </head>"
},
{
"path": "site/examples/friendlycode/test/publisher/pre-publish.html",
"chars": 178,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <title>hello</title>\n <style>\n p {\n color: blue;\n }\n </style>\n </h"
},
{
"path": "site/examples/friendlycode/test/publisher/test-publisher.js",
"chars": 601,
"preview": "defineTests([\n \"fc/publisher\",\n \"text!test/publisher/pre-publish.html\",\n \"text!test/publisher/post-publish.html\"\n], f"
},
{
"path": "site/examples/friendlycode/test/qunit.css",
"chars": 4656,
"preview": "/**\n * QUnit v1.6.0pre - A JavaScript Unit Testing Framework\n *\n * http://docs.jquery.com/QUnit\n *\n * Copyright (c) 2012"
},
{
"path": "site/examples/friendlycode/test/qunit.js",
"chars": 43553,
"preview": "/**\n * QUnit v1.6.0pre - A JavaScript Unit Testing Framework\n *\n * http://docs.jquery.com/QUnit\n *\n * Copyright (c) 2012"
},
{
"path": "site/examples/friendlycode/test/test-app-optimized.html",
"chars": 634,
"preview": "<!DOCTYPE html>\n<meta charset=\"utf-8\">\n<title>App Test Frame - Optimized Build</title>\n<!-- For faster loading times, do"
},
{
"path": "site/examples/friendlycode/test/test-app.html",
"chars": 612,
"preview": "<!DOCTYPE html>\n<meta charset=\"utf-8\">\n<title>App Test Frame</title>\n<!-- For faster loading times, don't load our CSS. "
},
{
"path": "site/examples/friendlycode/test/test-app.js",
"chars": 2775,
"preview": "\"use strict\";\n\ndefineTests([\"jquery\", \"lscache\"], function($, lscache) {\n module(\"app\");\n\n function appTest(name, cb) "
},
{
"path": "site/examples/friendlycode/test/test-current-page-manager.js",
"chars": 2604,
"preview": "\"use strict\";\n\ndefineTests([\n \"jquery\",\n \"fc/current-page-manager\"\n], function($, CurrentPageManager) {\n module(\"Curr"
},
{
"path": "site/examples/friendlycode/test/test-editor-toolbar.js",
"chars": 1376,
"preview": "\"use strict\";\n\ndefineTests([\n \"jquery\",\n \"fc/ui/editor-panes\",\n \"fc/ui/editor-toolbar\"\n], function($, EditorPanes, Ed"
},
{
"path": "site/examples/friendlycode/test/test-gutter-pointer.js",
"chars": 768,
"preview": "defineTests([\n \"jquery\",\n \"codemirror\",\n \"fc/ui/gutter-pointer\"\n], function($, CodeMirror, gutterPointer) {\n module("
},
{
"path": "site/examples/friendlycode/test/test-help.js",
"chars": 3140,
"preview": "\"use strict\";\n\ndefineTests([\"fc/help\", \"slowparse/slowparse\"], function(Help, Slowparse) {\n module(\"Help\");\n\n function"
},
{
"path": "site/examples/friendlycode/test/test-indexable-codemirror.js",
"chars": 936,
"preview": "\"use strict\";\n\ndefineTests([\n \"jquery\",\n \"fc/ui/indexable-codemirror\"\n], function($, IndexableCodeMirror) {\n module(\""
},
{
"path": "site/examples/friendlycode/test/test-live-preview.js",
"chars": 3143,
"preview": "\"use strict\";\n\ndefineTests([\n \"jquery\",\n \"backbone-events\",\n \"test/lptest\",\n \"fc/ui/live-preview\"\n], function($, Bac"
},
{
"path": "site/examples/friendlycode/test/test-mark-tracker.js",
"chars": 1098,
"preview": "\"use strict\";\n\ndefineTests([\n \"jquery\",\n \"fc/ui/mark-tracker\",\n \"codemirror\"\n], function($, MarkTracker, CodeMirror) "
},
{
"path": "site/examples/friendlycode/test/test-parsing-codemirror.js",
"chars": 3231,
"preview": "\"use strict\";\n\ndefineTests([\n \"jquery\",\n \"fc/ui/parsing-codemirror\"\n], function($, ParsingCodeMirror) {\n module(\"Pars"
},
{
"path": "site/examples/friendlycode/test/test-prefs.js",
"chars": 1379,
"preview": "defineTests([\"fc/prefs\", \"lscache\"], function(Preferences, lscache) {\n Preferences.CACHE_KEY = \"TestPreferences\";\n\n mo"
},
{
"path": "site/examples/friendlycode/test/test-slowparse-errors.js",
"chars": 379,
"preview": "\"use strict\";\n\ndefineTests([\"jquery\", \"slowparse-errors\"], function($) {\n module(\"slowparse-errors\");\n\n test(\"base err"
},
{
"path": "site/examples/friendlycode/test/test-templates.js",
"chars": 780,
"preview": "\"use strict\";\n\ndefineTests([\"template!error-msg\", \"template!help-msg\"], function(err, help) {\n module(\"templates\");\n\n "
},
{
"path": "site/examples/madlibs/css/app.css",
"chars": 136,
"preview": ".madlib-hidden {\n color: transparent;\n text-shadow: 0 0 15px rgba(0,0,0,0.5);\n}\n\n.madlib-hidden input {\n /*colo"
},
{
"path": "site/examples/madlibs/css/bootstrap.css",
"chars": 82783,
"preview": "/*!\n * Bootstrap v3.0.0\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache"
},
{
"path": "site/examples/madlibs/index.html",
"chars": 3678,
"preview": "<!DOCTYPE html>\n\n<html>\n<head>\n <title>Mad Libs</title>\n <meta name=\"description\" content=\"\">\n <meta name=\"author\" co"
},
{
"path": "site/examples/madlibs/js/app.js",
"chars": 323,
"preview": "function reveal() {\n $(\".madlib\").removeClass(\"madlib-hidden\");\n $(\"#reveal\").hide();\n $(\"#hide\").show();\n}\n\nfunction"
},
{
"path": "site/examples/madlibs/js/bootstrap.js",
"chars": 57269,
"preview": "/**\n* bootstrap.js v3.0.0 by @fat and @mdo\n* Copyright 2013 Twitter Inc.\n* http://www.apache.org/licenses/LICENSE-2.0\n*/"
},
{
"path": "site/examples/persona/index.html",
"chars": 2372,
"preview": "{% extends \"base.tmpl\" %}\n{% block title %} Mozilla Labs : TogetherJS app integration example {% endblock %}\n{# set enab"
},
{
"path": "site/examples/persona/md5.js",
"chars": 6269,
"preview": "/*\nCryptoJS v3.1.2\ncode.google.com/p/crypto-js\n(c) 2009-2013 by Jeff Mott. All rights reserved.\ncode.google.com/p/crypto"
},
{
"path": "site/examples/tinymce/css/application.css",
"chars": 125,
"preview": ".tinymce {\n\tmargin-top: 40px;\n}\n\n.tjsbutton img {\n\twidth: 125px;\n}\n\n.subtitle {\n\tmargin-top: -10px;\n\tpadding-bottom: 15p"
},
{
"path": "site/examples/tinymce/index.html",
"chars": 1835,
"preview": "{% extends \"base.tmpl\" %}\n{% block title %} Mozilla Labs : YouTube example {% endblock %}\n{% block configs %}\n <script>"
},
{
"path": "site/examples/tinymce/js/application.js",
"chars": 150,
"preview": "$(function () {\n tinymce.init({ \n selector: '.tinymce'\n });\n\n $('.tjsbutton').click(function () {\n $('#together"
},
{
"path": "site/examples/tinymce/js/application.js~",
"chars": 0,
"preview": ""
},
{
"path": "site/examples/todo/css/bootstrap.css",
"chars": 82783,
"preview": "/*!\n * Bootstrap v3.0.0\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache"
},
{
"path": "site/examples/todo/index.html",
"chars": 2582,
"preview": "<!DOCTYPE html>\n\n<html>\n<head>\n <title>Grocery To Do List</title>\n <meta charset=\"UTF-8\">\n <meta name=\"description\" c"
},
{
"path": "site/examples/todo/js/app.js",
"chars": 2098,
"preview": "$('#add').click( function() {\n var Description = $('#description').val();\n if (! $(\"#description\").val()) {\n $('#al"
},
{
"path": "site/examples/todo/js/bootstrap.js",
"chars": 57269,
"preview": "/**\n* bootstrap.js v3.0.0 by @fat and @mdo\n* Copyright 2013 Twitter Inc.\n* http://www.apache.org/licenses/LICENSE-2.0\n*/"
},
{
"path": "site/examples/youtube/css/application.css",
"chars": 1121,
"preview": ".youtube-container {\n\tmargin: 0 auto;\n\t//width: 560px;\n}\n\n.youtube-embed-link {\n\tmargin: 0;\n}\n\n.youtube-embed-link {\n\tma"
},
{
"path": "site/examples/youtube/index.html",
"chars": 2180,
"preview": "{% extends \"base.tmpl\" %}\n{% block title %} Mozilla Labs : YouTube example {% endblock %}\n{% block configs %}\n <script>"
},
{
"path": "site/examples/youtube/js/application.js",
"chars": 888,
"preview": "$(function () {\n $('.embed-submit-button').click(function() {\n // FIXME: uncaught exception: [CannotFind #video-id-i"
},
{
"path": "site/faq.html",
"chars": 1148,
"preview": "{% extends \"base.tmpl\" %}\n{% block body %}\n\n <div class=\"container\">\n <section class=\"body-content\" id=\"main-sec"
}
]
// ... and 187 more files (download for full content)
About this extraction
This page contains the full source code of the jsfiddle/togetherjs GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 387 files (3.3 MB), approximately 892.4k tokens, and a symbol index with 1322 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.