(function(){var require = function (file, cwd) { var resolved = require.resolve(file, cwd || '/'); var mod = require.modules[resolved]; if (!mod) throw new Error( 'Failed to resolve module ' + file + ', tried ' + resolved ); var cached = require.cache[resolved]; var res = cached? cached.exports : mod(); return res; }; require.paths = []; require.modules = {}; require.cache = {}; require.extensions = [".js",".coffee",".json"]; require._core = { 'assert': true, 'events': true, 'fs': true, 'path': true, 'vm': true }; require.resolve = (function () { return function (x, cwd) { if (!cwd) cwd = '/'; if (require._core[x]) return x; var path = require.modules.path(); cwd = path.resolve('/', cwd); var y = cwd || '/'; if (x.match(/^(?:\.\.?\/|\/)/)) { var m = loadAsFileSync(path.resolve(y, x)) || loadAsDirectorySync(path.resolve(y, x)); if (m) return m; } var n = loadNodeModulesSync(x, y); if (n) return n; throw new Error("Cannot find module '" + x + "'"); function loadAsFileSync (x) { x = path.normalize(x); if (require.modules[x]) { return x; } for (var i = 0; i < require.extensions.length; i++) { var ext = require.extensions[i]; if (require.modules[x + ext]) return x + ext; } } function loadAsDirectorySync (x) { x = x.replace(/\/+$/, ''); var pkgfile = path.normalize(x + '/package.json'); if (require.modules[pkgfile]) { var pkg = require.modules[pkgfile](); var b = pkg.browserify; if (typeof b === 'object' && b.main) { var m = loadAsFileSync(path.resolve(x, b.main)); if (m) return m; } else if (typeof b === 'string') { var m = loadAsFileSync(path.resolve(x, b)); if (m) return m; } else if (pkg.main) { var m = loadAsFileSync(path.resolve(x, pkg.main)); if (m) return m; } } return loadAsFileSync(x + '/index'); } function loadNodeModulesSync (x, start) { var dirs = nodeModulesPathsSync(start); for (var i = 0; i < dirs.length; i++) { var dir = dirs[i]; var m = loadAsFileSync(dir + '/' + x); if (m) return m; var n = loadAsDirectorySync(dir + '/' + x); if (n) return n; } var m = loadAsFileSync(x); if (m) return m; } function nodeModulesPathsSync (start) { var parts; if (start === '/') parts = [ '' ]; else parts = path.normalize(start).split('/'); var dirs = []; for (var i = parts.length - 1; i >= 0; i--) { if (parts[i] === 'node_modules') continue; var dir = parts.slice(0, i + 1).join('/') + '/node_modules'; dirs.push(dir); } return dirs; } }; })(); require.alias = function (from, to) { var path = require.modules.path(); var res = null; try { res = require.resolve(from + '/package.json', '/'); } catch (err) { res = require.resolve(from, '/'); } var basedir = path.dirname(res); var keys = (Object.keys || function (obj) { var res = []; for (var key in obj) res.push(key); return res; })(require.modules); for (var i = 0; i < keys.length; i++) { var key = keys[i]; if (key.slice(0, basedir.length + 1) === basedir + '/') { var f = key.slice(basedir.length); require.modules[to + f] = require.modules[basedir + f]; } else if (key === basedir) { require.modules[to] = require.modules[basedir]; } } }; (function () { var process = {}; var global = typeof window !== 'undefined' ? window : {}; var definedProcess = false; require.define = function (filename, fn) { if (!definedProcess && require.modules.__browserify_process) { process = require.modules.__browserify_process(); definedProcess = true; } var dirname = require._core[filename] ? '' : require.modules.path().dirname(filename) ; var require_ = function (file) { var requiredModule = require(file, dirname); var cached = require.cache[require.resolve(file, dirname)]; if (cached && cached.parent === null) { cached.parent = module_; } return requiredModule; }; require_.resolve = function (name) { return require.resolve(name, dirname); }; require_.modules = require.modules; require_.define = require.define; require_.cache = require.cache; var module_ = { id : filename, filename: filename, exports : {}, loaded : false, parent: null }; require.modules[filename] = function () { require.cache[filename] = module_; fn.call( module_.exports, require_, module_, module_.exports, dirname, filename, process, global ); module_.loaded = true; return module_.exports; }; }; })(); require.define("path",function(require,module,exports,__dirname,__filename,process,global){function filter (xs, fn) { var res = []; for (var i = 0; i < xs.length; i++) { if (fn(xs[i], i, xs)) res.push(xs[i]); } return res; } // resolves . and .. elements in a path array with directory names there // must be no slashes, empty elements, or device names (c:\) in the array // (so also no leading and trailing slashes - it does not distinguish // relative and absolute paths) function normalizeArray(parts, allowAboveRoot) { // if the path tries to go above the root, `up` ends up > 0 var up = 0; for (var i = parts.length; i >= 0; i--) { var last = parts[i]; if (last == '.') { parts.splice(i, 1); } else if (last === '..') { parts.splice(i, 1); up++; } else if (up) { parts.splice(i, 1); up--; } } // if the path is allowed to go above the root, restore leading ..s if (allowAboveRoot) { for (; up--; up) { parts.unshift('..'); } } return parts; } // Regex to split a filename into [*, dir, basename, ext] // posix version var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/; // path.resolve([from ...], to) // posix version exports.resolve = function() { var resolvedPath = '', resolvedAbsolute = false; for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) { var path = (i >= 0) ? arguments[i] : process.cwd(); // Skip empty and invalid entries if (typeof path !== 'string' || !path) { continue; } resolvedPath = path + '/' + resolvedPath; resolvedAbsolute = path.charAt(0) === '/'; } // At this point the path should be resolved to a full absolute path, but // handle relative paths to be safe (might happen when process.cwd() fails) // Normalize the path resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { return !!p; }), !resolvedAbsolute).join('/'); return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; }; // path.normalize(path) // posix version exports.normalize = function(path) { var isAbsolute = path.charAt(0) === '/', trailingSlash = path.slice(-1) === '/'; // Normalize the path path = normalizeArray(filter(path.split('/'), function(p) { return !!p; }), !isAbsolute).join('/'); if (!path && !isAbsolute) { path = '.'; } if (path && trailingSlash) { path += '/'; } return (isAbsolute ? '/' : '') + path; }; // posix version exports.join = function() { var paths = Array.prototype.slice.call(arguments, 0); return exports.normalize(filter(paths, function(p, index) { return p && typeof p === 'string'; }).join('/')); }; exports.dirname = function(path) { var dir = splitPathRe.exec(path)[1] || ''; var isWindows = false; if (!dir) { // No dirname return '.'; } else if (dir.length === 1 || (isWindows && dir.length <= 3 && dir.charAt(1) === ':')) { // It is just a slash or a drive letter with a slash return dir; } else { // It is a full dirname, strip trailing slash return dir.substring(0, dir.length - 1); } }; exports.basename = function(path, ext) { var f = splitPathRe.exec(path)[2] || ''; // TODO: make this comparison case-insensitive on windows? if (ext && f.substr(-1 * ext.length) === ext) { f = f.substr(0, f.length - ext.length); } return f; }; exports.extname = function(path) { return splitPathRe.exec(path)[3] || ''; }; }); require.define("__browserify_process",function(require,module,exports,__dirname,__filename,process,global){var process = module.exports = {}; process.nextTick = (function () { var canSetImmediate = typeof window !== 'undefined' && window.setImmediate; var canPost = typeof window !== 'undefined' && window.postMessage && window.addEventListener ; if (canSetImmediate) { return window.setImmediate; } if (canPost) { var queue = []; window.addEventListener('message', function (ev) { if (ev.source === window && ev.data === 'browserify-tick') { ev.stopPropagation(); if (queue.length > 0) { var fn = queue.shift(); fn(); } } }, true); return function nextTick(fn) { queue.push(fn); window.postMessage('browserify-tick', '*'); }; } return function nextTick(fn) { setTimeout(fn, 0); }; })(); process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.binding = function (name) { if (name === 'evals') return (require)('vm') else throw new Error('No such module. (Possibly not yet loaded)') }; (function () { var cwd = '/'; var path; process.cwd = function () { return cwd }; process.chdir = function (dir) { if (!path) path = require('path'); cwd = path.resolve(dir, cwd); }; })(); }); require.define("/lib/legacy.coffee",function(require,module,exports,__dirname,__filename,process,global){(function() { var active, pageHandler, plugin, refresh, resolveLinks, state, util, __slice = [].slice; window.wiki = {}; util = require('./util.coffee'); pageHandler = wiki.pageHandler = require('./pageHandler.coffee'); plugin = require('./plugin.coffee'); state = require('./state.coffee'); active = require('./active.coffee'); refresh = require('./refresh.coffee'); require('./dom.coffee'); resolveLinks = wiki.resolveLinks = util.resolveLinks; wiki.createSynopsis = util.createSynopsis; Array.prototype.last = function() { return this[this.length - 1]; }; $(function() { var $firstPage, LEFTARROW, RIGHTARROW, addToJournal, createTextElement, doInternalLink, finishClick, getItem, getTemplate, resolveFrom, sleep, textEditor, useLocalStorage; window.dialog = $('
').html('This dialog will show every time!').dialog({ autoOpen: false, title: 'Basic Dialog', height: 600, width: 800 }); wiki.dialog = function(title, html) { window.dialog.html(html); window.dialog.dialog("option", "title", resolveLinks(title)); return window.dialog.dialog('open'); }; wiki.log = function() { var things; things = 1 <= arguments.length ? __slice.call(arguments, 0) : []; if ((typeof console !== "undefined" && console !== null ? console.log : void 0) != null) { return console.log.apply(console, things); } }; wiki.resolutionContext = []; resolveFrom = wiki.resolveFrom = function(addition, callback) { wiki.resolutionContext.push(addition); try { return callback(); } finally { wiki.resolutionContext.pop(); } }; addToJournal = wiki.addToJournal = function(journalElement, action) { var actionElement, actionTitle, controls, pageElement, prev; pageElement = journalElement.parents('.page:first'); if (action.type === 'edit') { prev = journalElement.find(".edit[data-id=" + (action.id || 0) + "]"); } actionTitle = action.type; if (action.date != null) { actionTitle += " " + (util.formatElapsedTime(action.date)); } actionElement = $(" ").addClass("action").addClass(action.type).text(util.symbols[action.type]).attr('title', actionTitle).attr('data-id', action.id || "0").data('action', action); controls = journalElement.children('.control-buttons'); if (controls.length > 0) { actionElement.insertBefore(controls); } else { actionElement.appendTo(journalElement); } if (action.type === 'fork' && (action.site != null)) { return actionElement.css("background-image", "url(//" + action.site + "/favicon.png)").attr("href", "//" + action.site + "/" + (pageElement.attr('id')) + ".html").data("site", action.site).data("slug", pageElement.attr('id')); } }; useLocalStorage = wiki.useLocalStorage = function() { return $(".login").length > 0; }; sleep = function(time, done) { return setTimeout(done, time); }; wiki.removeItem = function($item, item) { pageHandler.put($item.parents('.page:first'), { type: 'remove', id: item.id }); return $item.remove(); }; wiki.createItem = function($page, $before, item) { var $item, before; if ($page == null) { $page = $before.parents('.page'); } item.id = util.randomBytes(8); $item = $("
"); $item.data('item', item).data('pageElement', $page); if ($before != null) { $before.after($item); } else { $page.find('.story').append($item); } plugin["do"]($item, item); before = wiki.getItem($before); sleep(500, function() { return pageHandler.put($page, { item: item, id: item.id, type: 'add', after: before != null ? before.id : void 0 }); }); return $item; }; createTextElement = function(pageElement, beforeElement, initialText) { var item, itemBefore, itemElement; item = { type: 'paragraph', id: util.randomBytes(8), text: initialText }; itemElement = $("
"); itemElement.data('item', item).data('pageElement', pageElement); beforeElement.after(itemElement); plugin["do"](itemElement, item); itemBefore = wiki.getItem(beforeElement); wiki.textEditor(itemElement, item); return sleep(500, function() { return pageHandler.put(pageElement, { item: item, id: item.id, type: 'add', after: itemBefore != null ? itemBefore.id : void 0 }); }); }; textEditor = wiki.textEditor = function(div, item, caretPos, doubleClicked) { var original, textarea, _ref; if (div.hasClass('textEditing')) { return; } div.addClass('textEditing'); textarea = $("").focusout(function() { div.removeClass('textEditing'); if (item.text = textarea.val()) { plugin["do"](div.empty(), item); if (item.text === original) { return; } pageHandler.put(div.parents('.page:first'), { type: 'edit', id: item.id, item: item }); } else { pageHandler.put(div.parents('.page:first'), { type: 'remove', id: item.id }); div.remove(); } return null; }).bind('keydown', function(e) { var middle, pageElement, prefix, prevItem, prevTextLen, sel, suffix, text; if ((e.altKey || e.ctlKey || e.metaKey) && e.which === 83) { textarea.focusout(); return false; } if (item.type === 'paragraph') { sel = util.getSelectionPos(textarea); if (e.which === $.ui.keyCode.BACKSPACE && sel.start === 0 && sel.start === sel.end) { prevItem = getItem(div.prev()); if (prevItem.type !== 'paragraph') { return false; } prevTextLen = prevItem.text.length; prevItem.text += textarea.val(); textarea.val(''); textEditor(div.prev(), prevItem, prevTextLen); return false; } else if (e.which === $.ui.keyCode.ENTER && item.type === 'paragraph') { if (!sel) { return false; } text = textarea.val(); prefix = text.substring(0, sel.start); if (sel.start !== sel.end) { middle = text.substring(sel.start, sel.end); } suffix = text.substring(sel.end); textarea.val(prefix); textarea.focusout(); pageElement = div.parent().parent(); createTextElement(pageElement, div, suffix); if (middle != null) { createTextElement(pageElement, div, middle); } return false; } } }); div.html(textarea); if (caretPos != null) { return util.setCaretPosition(textarea, caretPos); } else if (doubleClicked) { util.setCaretPosition(textarea, textarea.val().length); return textarea.scrollTop(textarea[0].scrollHeight - textarea.height()); } else { return textarea.focus(); } }; getItem = wiki.getItem = function(element) { if ($(element).length > 0) { return $(element).data("item") || $(element).data('staticItem'); } }; wiki.getData = function(vis) { var idx, who; if (vis) { idx = $('.item').index(vis); who = $(".item:lt(" + idx + ")").filter('.chart,.data,.calculator').last(); if (who != null) { return who.data('item').data; } else { return {}; } } else { who = $('.chart,.data,.calculator').last(); if (who != null) { return who.data('item').data; } else { return {}; } } }; wiki.getDataNodes = function(vis) { var idx, who; if (vis) { idx = $('.item').index(vis); who = $(".item:lt(" + idx + ")").filter('.chart,.data,.calculator').toArray().reverse(); return $(who); } else { who = $('.chart,.data,.calculator').toArray().reverse(); return $(who); } }; doInternalLink = wiki.doInternalLink = function(name, page, site) { if (site == null) { site = null; } name = util.asSlug(name); if (page != null) { $(page).nextAll().remove(); } wiki.createPage(name, site).appendTo($('.main')).each(refresh); return active.set($('.page').last()); }; LEFTARROW = 37; RIGHTARROW = 39; $(document).keydown(function(event) { var direction, newIndex, pages; direction = (function() { switch (event.which) { case LEFTARROW: return -1; case RIGHTARROW: return +1; } })(); if (direction && !(event.target.tagName === "TEXTAREA")) { pages = $('.page'); newIndex = pages.index($('.active')) + direction; if ((0 <= newIndex && newIndex < pages.length)) { return active.set(pages.eq(newIndex)); } } }); $(window).on('popstate', state.show); $(document).ajaxError(function(event, request, settings) { if (request.status === 0 || request.status === 404) { return; } wiki.log('ajax error', event, request, settings); return $('.main').prepend("
  • \n Error on " + settings.url + ": " + request.responseText + "\n
  • "); }); getTemplate = function(slug, done) { if (!slug) { return done(null); } wiki.log('getTemplate', slug); return pageHandler.get({ whenGotten: function(data, siteFound) { return done(data.story); }, whenNotGotten: function() { return done(null); }, pageInformation: { slug: slug } }); }; finishClick = function(e, name) { var page; e.preventDefault(); if (!e.shiftKey) { page = $(e.target).parents('.page'); } doInternalLink(name, page, $(e.target).data('site')); return false; }; $('.main').delegate('.show-page-source', 'click', function(e) { var json, pageElement; e.preventDefault(); pageElement = $(this).parent().parent(); json = pageElement.data('data'); return wiki.dialog("JSON for " + json.title, $('
    ').text(JSON.stringify(json, null, 2)));
        }).delegate('.page', 'click', function(e) {
          if (!$(e.target).is("a")) {
            return active.set(this);
          }
        }).delegate('.internal', 'click', function(e) {
          var name;
          name = $(e.target).data('pageName');
          pageHandler.context = $(e.target).attr('title').split(' => ');
          return finishClick(e, name);
        }).delegate('.remote', 'click', function(e) {
          var name;
          name = $(e.target).data('slug');
          pageHandler.context = [$(e.target).data('site')];
          return finishClick(e, name);
        }).delegate('.revision', 'dblclick', function(e) {
          var $page, action, json, rev;
          e.preventDefault();
          $page = $(this).parents('.page');
          rev = $page.data('rev');
          action = $page.data('data').journal[rev];
          json = JSON.stringify(action, null, 2);
          return wiki.dialog("Revision " + rev + ", " + action.type + " action", $('
    ').text(json));
        }).delegate('.action', 'click', function(e) {
          var $action, $page, name, rev, slug;
          e.preventDefault();
          $action = $(e.target);
          if ($action.is('.fork') && ((name = $action.data('slug')) != null)) {
            pageHandler.context = [$action.data('site')];
            return finishClick(e, name);
          } else {
            $page = $(this).parents('.page');
            slug = util.asSlug($page.data('data').title);
            rev = $(this).parent().children().index($action);
            if (!e.shiftKey) {
              $page.nextAll().remove();
            }
            wiki.createPage("" + slug + "_rev" + rev, $page.data('site')).appendTo($('.main')).each(refresh);
            return active.set($('.page').last());
          }
        }).delegate('.fork-page', 'click', function(e) {
          var item, pageElement, remoteSite;
          pageElement = $(e.target).parents('.page');
          if (pageElement.hasClass('local')) {
            if (!useLocalStorage()) {
              item = pageElement.data('data');
              pageElement.removeClass('local');
              return pageHandler.put(pageElement, {
                type: 'fork',
                item: item
              });
            }
          } else {
            if ((remoteSite = pageElement.data('site')) != null) {
              return pageHandler.put(pageElement, {
                type: 'fork',
                site: remoteSite
              });
            }
          }
        }).delegate('.action', 'hover', function() {
          var id;
          id = $(this).attr('data-id');
          $("[data-id=" + id + "]").toggleClass('target');
          return $('.main').trigger('rev');
        }).delegate('.item', 'hover', function() {
          var id;
          id = $(this).attr('data-id');
          return $(".action[data-id=" + id + "]").toggleClass('target');
        }).delegate('button.create', 'click', function(e) {
          return getTemplate($(e.target).data('slug'), function(story) {
            var $page, page;
            $page = $(e.target).parents('.page:first');
            $page.removeClass('ghost');
            page = $page.data('data');
            page.story = story || [];
            pageHandler.put($page, {
              type: 'create',
              id: page.id,
              item: {
                title: page.title,
                story: story || void 0
              }
            });
            return wiki.buildPage(page, null, $page.empty());
          });
        }).delegate('.ghost', 'rev', function(e) {
          var $item, $page, position;
          wiki.log('rev', e);
          $page = $(e.target).parents('.page:first');
          $item = $page.find('.target');
          position = $item.offset().top + $page.scrollTop() - $page.height() / 2;
          wiki.log('scroll', $page, $item, position);
          return $page.stop().animate({
            scrollTop: postion
          }, 'slow');
        }).delegate('.score', 'hover', function(e) {
          return $('.main').trigger('thumb', $(e.target).data('thumb'));
        });
        $(".provider input").click(function() {
          $("footer input:first").val($(this).attr('data-provider'));
          return $("footer form").submit();
        });
        if (($firstPage = $('.page:first')).data('serverGenerated')) {
          return window.location = "/view/" + ($firstPage.attr('id'));
        } else {
          state.first();
          $('.page').each(refresh);
          return active.set($('.page').last());
        }
      });
    
    }).call(this);
    
    });
    
    require.define("/lib/util.coffee",function(require,module,exports,__dirname,__filename,process,global){(function() {
      var util;
    
      module.exports = wiki.util = util = {};
    
      util.createSynopsis = require('./synopsis');
    
      util.symbols = {
        create: '☼',
        add: '+',
        edit: '✎',
        fork: '⚑',
        move: '↕',
        remove: '✕'
      };
    
      util.resolveLinks = function(string) {
        var renderInternalLink;
        renderInternalLink = function(match, name) {
          var slug;
          slug = util.asSlug(name);
          return " ')) + "\">" + name + "";
        };
        return string.replace(/\[\[([^\]]+)\]\]/gi, renderInternalLink).replace(/\[(http.*?) (.*?)\]/gi, "$2 ");
      };
    
      util.randomByte = function() {
        return (((1 + Math.random()) * 0x100) | 0).toString(16).substring(1);
      };
    
      util.randomBytes = function(n) {
        return ((function() {
          var _i, _results;
          _results = [];
          for (_i = 1; 1 <= n ? _i <= n : _i >= n; 1 <= n ? _i++ : _i--) {
            _results.push(util.randomByte());
          }
          return _results;
        })()).join('');
      };
    
      util.formatTime = function(time) {
        var am, d, h, mi, mo;
        d = new Date((time > 10000000000 ? time : time * 1000));
        mo = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][d.getMonth()];
        h = d.getHours();
        am = h < 12 ? 'AM' : 'PM';
        h = h === 0 ? 12 : h > 12 ? h - 12 : h;
        mi = (d.getMinutes() < 10 ? "0" : "") + d.getMinutes();
        return "" + h + ":" + mi + " " + am + "
    " + (d.getDate()) + " " + mo + " " + (d.getFullYear()); }; util.formatDate = function(msSinceEpoch) { var am, d, day, h, mi, mo, sec, wk, yr; d = new Date(msSinceEpoch); wk = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][d.getDay()]; mo = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][d.getMonth()]; day = d.getDate(); yr = d.getFullYear(); h = d.getHours(); am = h < 12 ? 'AM' : 'PM'; h = h === 0 ? 12 : h > 12 ? h - 12 : h; mi = (d.getMinutes() < 10 ? "0" : "") + d.getMinutes(); sec = (d.getSeconds() < 10 ? "0" : "") + d.getSeconds(); return "" + wk + " " + mo + " " + day + ", " + yr + "
    " + h + ":" + mi + ":" + sec + " " + am; }; util.formatElapsedTime = function(msSinceEpoch) { var days, hrs, mins, months, msecs, secs, weeks, years; msecs = new Date().getTime() - msSinceEpoch; if ((secs = msecs / 1000) < 2) { return "" + (Math.floor(msecs)) + " milliseconds ago"; } if ((mins = secs / 60) < 2) { return "" + (Math.floor(secs)) + " seconds ago"; } if ((hrs = mins / 60) < 2) { return "" + (Math.floor(mins)) + " minutes ago"; } if ((days = hrs / 24) < 2) { return "" + (Math.floor(hrs)) + " hours ago"; } if ((weeks = days / 7) < 2) { return "" + (Math.floor(days)) + " days ago"; } if ((months = days / 31) < 2) { return "" + (Math.floor(weeks)) + " weeks ago"; } if ((years = days / 365) < 2) { return "" + (Math.floor(months)) + " months ago"; } return "" + (Math.floor(years)) + " years ago"; }; util.asSlug = function(name) { return name.replace(/\s/g, '-').replace(/[^A-Za-z0-9-]/g, '').toLowerCase(); }; if (typeof wiki !== "undefined" && wiki !== null) { wiki.asSlug = util.asSlug; } util.emptyPage = function() { return { title: 'empty', story: [], journal: [] }; }; util.getSelectionPos = function(jQueryElement) { var el, iePos, sel; el = jQueryElement.get(0); if (document.selection) { el.focus(); sel = document.selection.createRange(); sel.moveStart('character', -el.value.length); iePos = sel.text.length; return { start: iePos, end: iePos }; } else { return { start: el.selectionStart, end: el.selectionEnd }; } }; util.setCaretPosition = function(jQueryElement, caretPos) { var el, range; el = jQueryElement.get(0); if (el != null) { if (el.createTextRange) { range = el.createTextRange(); range.move("character", caretPos); range.select(); } else { el.setSelectionRange(caretPos, caretPos); } return el.focus(); } }; }).call(this); }); require.define("/lib/synopsis.coffee",function(require,module,exports,__dirname,__filename,process,global){(function() { module.exports = function(page) { var p1, p2, synopsis; synopsis = page.synopsis; if ((page != null) && (page.story != null)) { p1 = page.story[0]; p2 = page.story[1]; if (p1 && p1.type === 'paragraph') { synopsis || (synopsis = p1.text); } if (p2 && p2.type === 'paragraph') { synopsis || (synopsis = p2.text); } if (p1 && (p1.text != null)) { synopsis || (synopsis = p1.text); } if (p2 && (p2.text != null)) { synopsis || (synopsis = p2.text); } synopsis || (synopsis = (page.story != null) && ("A page with " + page.story.length + " items.")); } else { synopsis = 'A page with no story.'; } return synopsis; }; }).call(this); }); require.define("/lib/pageHandler.coffee",function(require,module,exports,__dirname,__filename,process,global){(function() { var pageFromLocalStorage, pageHandler, pushToLocal, pushToServer, recursiveGet, revision, state, util; util = require('./util'); state = require('./state'); revision = require('./revision'); module.exports = pageHandler = {}; pageFromLocalStorage = function(slug) { var json; if (json = localStorage[slug]) { return JSON.parse(json); } else { return void 0; } }; recursiveGet = function(_arg) { var localContext, localPage, pageInformation, rev, site, slug, url, whenGotten, whenNotGotten; pageInformation = _arg.pageInformation, whenGotten = _arg.whenGotten, whenNotGotten = _arg.whenNotGotten, localContext = _arg.localContext; slug = pageInformation.slug, rev = pageInformation.rev, site = pageInformation.site; if (site) { localContext = []; } else { site = localContext.shift(); } if (site === 'view') { site = null; } if (site != null) { if (site === 'local') { if (localPage = pageFromLocalStorage(pageInformation.slug)) { return whenGotten(localPage, 'local'); } else { return whenNotGotten(); } } else { if (site === 'origin') { url = "/" + slug + ".json"; } else { url = "http://" + site + "/" + slug + ".json"; } } } else { url = "/" + slug + ".json"; } return $.ajax({ type: 'GET', dataType: 'json', url: url + ("?random=" + (util.randomBytes(4))), success: function(page) { if (rev) { page = revision.create(rev, page); } return whenGotten(page, site); }, error: function(xhr, type, msg) { var report; if ((xhr.status !== 404) && (xhr.status !== 0)) { wiki.log('pageHandler.get error', xhr, xhr.status, type, msg); report = { 'title': "" + xhr.status + " " + msg, 'story': [ { 'type': 'paragraph', 'id': '928739187243', 'text': "
    " + xhr.responseText
                  }
                ]
              };
              return whenGotten(report, 'local');
            }
            if (localContext.length > 0) {
              return recursiveGet({
                pageInformation: pageInformation,
                whenGotten: whenGotten,
                whenNotGotten: whenNotGotten,
                localContext: localContext
              });
            } else {
              return whenNotGotten();
            }
          }
        });
      };
    
      pageHandler.get = function(_arg) {
        var localPage, pageInformation, whenGotten, whenNotGotten;
        whenGotten = _arg.whenGotten, whenNotGotten = _arg.whenNotGotten, pageInformation = _arg.pageInformation;
        if (!pageInformation.site) {
          if (localPage = pageFromLocalStorage(pageInformation.slug)) {
            if (pageInformation.rev) {
              localPage = revision.create(pageInformation.rev, localPage);
            }
            return whenGotten(localPage, 'local');
          }
        }
        if (!pageHandler.context.length) {
          pageHandler.context = ['view'];
        }
        return recursiveGet({
          pageInformation: pageInformation,
          whenGotten: whenGotten,
          whenNotGotten: whenNotGotten,
          localContext: _.clone(pageHandler.context)
        });
      };
    
      pageHandler.context = [];
    
      pushToLocal = function(pageElement, pagePutInfo, action) {
        var page, site;
        page = pageFromLocalStorage(pagePutInfo.slug);
        if (action.type === 'create') {
          page = {
            title: action.item.title
          };
        }
        page || (page = pageElement.data("data"));
        if (page.journal == null) {
          page.journal = [];
        }
        if ((site = action['fork']) != null) {
          page.journal = page.journal.concat({
            'type': 'fork',
            'site': site
          });
          delete action['fork'];
        }
        page.journal = page.journal.concat(action);
        page.story = $(pageElement).find(".item").map(function() {
          return $(this).data("item");
        }).get();
        localStorage[pagePutInfo.slug] = JSON.stringify(page);
        return wiki.addToJournal(pageElement.find('.journal'), action);
      };
    
      pushToServer = function(pageElement, pagePutInfo, action) {
        return $.ajax({
          type: 'PUT',
          url: "/page/" + pagePutInfo.slug + "/action",
          data: {
            'action': JSON.stringify(action)
          },
          success: function() {
            wiki.addToJournal(pageElement.find('.journal'), action);
            if (action.type === 'fork') {
              localStorage.removeItem(pageElement.attr('id'));
              return state.setUrl;
            }
          },
          error: function(xhr, type, msg) {
            return wiki.log("pageHandler.put ajax error callback", type, msg);
          }
        });
      };
    
      pageHandler.put = function(pageElement, action) {
        var checkedSite, forkFrom, pagePutInfo;
        checkedSite = function() {
          var site;
          switch (site = pageElement.data('site')) {
            case 'origin':
            case 'local':
            case 'view':
              return null;
            case location.host:
              return null;
            default:
              return site;
          }
        };
        pagePutInfo = {
          slug: pageElement.attr('id').split('_rev')[0],
          rev: pageElement.attr('id').split('_rev')[1],
          site: checkedSite(),
          local: pageElement.hasClass('local')
        };
        forkFrom = pagePutInfo.site;
        wiki.log('pageHandler.put', action, pagePutInfo);
        if (wiki.useLocalStorage()) {
          if (pagePutInfo.site != null) {
            wiki.log('remote => local');
          } else if (!pagePutInfo.local) {
            wiki.log('origin => local');
            action.site = forkFrom = location.host;
          }
        }
        action.date = (new Date()).getTime();
        if (action.site === 'origin') {
          delete action.site;
        }
        if (forkFrom) {
          pageElement.find('h1 img').attr('src', '/favicon.png');
          pageElement.find('h1 a').attr('href', '/');
          pageElement.data('site', null);
          state.setUrl();
          if (action.type !== 'fork') {
            action.fork = forkFrom;
            wiki.addToJournal(pageElement.find('.journal'), {
              type: 'fork',
              site: forkFrom,
              date: action.date
            });
          }
        }
        if (wiki.useLocalStorage() || pagePutInfo.site === 'local') {
          pushToLocal(pageElement, pagePutInfo, action);
          return pageElement.addClass("local");
        } else {
          return pushToServer(pageElement, pagePutInfo, action);
        }
      };
    
    }).call(this);
    
    });
    
    require.define("/lib/state.coffee",function(require,module,exports,__dirname,__filename,process,global){(function() {
      var active, state,
        __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
    
      active = require('./active');
    
      module.exports = state = {};
    
      state.pagesInDom = function() {
        return $.makeArray($(".page").map(function(_, el) {
          return el.id;
        }));
      };
    
      state.urlPages = function() {
        var i;
        return ((function() {
          var _i, _len, _ref, _results, _step;
          _ref = $(location).attr('pathname').split('/');
          _results = [];
          for (_i = 0, _len = _ref.length, _step = 2; _i < _len; _i += _step) {
            i = _ref[_i];
            _results.push(i);
          }
          return _results;
        })()).slice(1);
      };
    
      state.locsInDom = function() {
        return $.makeArray($(".page").map(function(_, el) {
          return $(el).data('site') || 'view';
        }));
      };
    
      state.urlLocs = function() {
        var j, _i, _len, _ref, _results, _step;
        _ref = $(location).attr('pathname').split('/').slice(1);
        _results = [];
        for (_i = 0, _len = _ref.length, _step = 2; _i < _len; _i += _step) {
          j = _ref[_i];
          _results.push(j);
        }
        return _results;
      };
    
      state.setUrl = function() {
        var idx, locs, page, pages, url, _ref;
        document.title = (_ref = $('.page:last').data('data')) != null ? _ref.title : void 0;
        if (history && history.pushState) {
          locs = state.locsInDom();
          pages = state.pagesInDom();
          url = ((function() {
            var _i, _len, _results;
            _results = [];
            for (idx = _i = 0, _len = pages.length; _i < _len; idx = ++_i) {
              page = pages[idx];
              _results.push("/" + ((locs != null ? locs[idx] : void 0) || 'view') + "/" + page);
            }
            return _results;
          })()).join('');
          if (url !== $(location).attr('pathname')) {
            return history.pushState(null, null, url);
          }
        }
      };
    
      state.show = function(e) {
        var idx, name, newLocs, newPages, old, oldLocs, oldPages, previous, _i, _len, _ref;
        oldPages = state.pagesInDom();
        newPages = state.urlPages();
        oldLocs = state.locsInDom();
        newLocs = state.urlLocs();
        if (!location.pathname || location.pathname === '/') {
          return;
        }
        previous = $('.page').eq(0);
        for (idx = _i = 0, _len = newPages.length; _i < _len; idx = ++_i) {
          name = newPages[idx];
          if (name !== oldPages[idx]) {
            old = $('.page').eq(idx);
            if (old) {
              old.remove();
            }
            wiki.createPage(name, newLocs[idx]).insertAfter(previous).each(wiki.refresh);
          }
          previous = $('.page').eq(idx);
        }
        previous.nextAll().remove();
        active.set($('.page').last());
        return document.title = (_ref = $('.page:last').data('data')) != null ? _ref.title : void 0;
      };
    
      state.first = function() {
        var firstUrlLocs, firstUrlPages, idx, oldPages, urlPage, _i, _len, _results;
        state.setUrl();
        firstUrlPages = state.urlPages();
        firstUrlLocs = state.urlLocs();
        oldPages = state.pagesInDom();
        _results = [];
        for (idx = _i = 0, _len = firstUrlPages.length; _i < _len; idx = ++_i) {
          urlPage = firstUrlPages[idx];
          if (__indexOf.call(oldPages, urlPage) < 0) {
            if (urlPage !== '') {
              _results.push(wiki.createPage(urlPage, firstUrlLocs[idx]).appendTo('.main'));
            } else {
              _results.push(void 0);
            }
          }
        }
        return _results;
      };
    
    }).call(this);
    
    });
    
    require.define("/lib/active.coffee",function(require,module,exports,__dirname,__filename,process,global){(function() {
      var active, findScrollContainer, scrollTo;
    
      module.exports = active = {};
    
      active.scrollContainer = void 0;
    
      findScrollContainer = function() {
        var scrolled;
        scrolled = $("body, html").filter(function() {
          return $(this).scrollLeft() > 0;
        });
        if (scrolled.length > 0) {
          return scrolled;
        } else {
          return $("body, html").scrollLeft(12).filter(function() {
            return $(this).scrollLeft() > 0;
          }).scrollTop(0);
        }
      };
    
      scrollTo = function(el) {
        var bodyWidth, contentWidth, maxX, minX, target, width, _ref;
        if ((_ref = active.scrollContainer) == null) {
          active.scrollContainer = findScrollContainer();
        }
        bodyWidth = $("body").width();
        minX = active.scrollContainer.scrollLeft();
        maxX = minX + bodyWidth;
        target = el.position().left;
        width = el.outerWidth(true);
        contentWidth = $(".page").outerWidth(true) * $(".page").size();
        if (target < minX) {
          return active.scrollContainer.animate({
            scrollLeft: target
          });
        } else if (target + width > maxX) {
          return active.scrollContainer.animate({
            scrollLeft: target - (bodyWidth - width)
          });
        } else if (maxX > $(".pages").outerWidth()) {
          return active.scrollContainer.animate({
            scrollLeft: Math.min(target, contentWidth - bodyWidth)
          });
        }
      };
    
      active.set = function(el) {
        el = $(el);
        $(".active").removeClass("active");
        return scrollTo(el.addClass("active"));
      };
    
    }).call(this);
    
    });
    
    require.define("/lib/revision.coffee",function(require,module,exports,__dirname,__filename,process,global){(function() {
      var create;
    
      create = function(revIndex, data) {
        var afterIndex, editIndex, itemId, items, journal, journalEntry, removeIndex, revJournal, revStory, revStoryIds, revTitle, storyItem, _i, _j, _k, _len, _len1, _len2, _ref;
        journal = data.journal;
        revTitle = data.title;
        revStory = [];
        revJournal = journal.slice(0, +(+revIndex) + 1 || 9e9);
        for (_i = 0, _len = revJournal.length; _i < _len; _i++) {
          journalEntry = revJournal[_i];
          revStoryIds = revStory.map(function(storyItem) {
            return storyItem.id;
          });
          switch (journalEntry.type) {
            case 'create':
              if (journalEntry.item.title != null) {
                revTitle = journalEntry.item.title;
                revStory = journalEntry.item.story || [];
              }
              break;
            case 'add':
              if ((afterIndex = revStoryIds.indexOf(journalEntry.after)) !== -1) {
                revStory.splice(afterIndex + 1, 0, journalEntry.item);
              } else {
                revStory.push(journalEntry.item);
              }
              break;
            case 'edit':
              if ((editIndex = revStoryIds.indexOf(journalEntry.id)) !== -1) {
                revStory.splice(editIndex, 1, journalEntry.item);
              } else {
                revStory.push(journalEntry.item);
              }
              break;
            case 'move':
              items = {};
              for (_j = 0, _len1 = revStory.length; _j < _len1; _j++) {
                storyItem = revStory[_j];
                items[storyItem.id] = storyItem;
              }
              revStory = [];
              _ref = journalEntry.order;
              for (_k = 0, _len2 = _ref.length; _k < _len2; _k++) {
                itemId = _ref[_k];
                if (items[itemId] != null) {
                  revStory.push(items[itemId]);
                }
              }
              break;
            case 'remove':
              if ((removeIndex = revStoryIds.indexOf(journalEntry.id)) !== -1) {
                revStory.splice(removeIndex, 1);
              }
          }
        }
        return {
          story: revStory,
          journal: revJournal,
          title: revTitle
        };
      };
    
      exports.create = create;
    
    }).call(this);
    
    });
    
    require.define("/lib/plugin.coffee",function(require,module,exports,__dirname,__filename,process,global){(function() {
      var getScript, plugin, scripts, util;
    
      util = require('./util.coffee');
    
      module.exports = plugin = {};
    
      scripts = {};
    
      getScript = wiki.getScript = function(url, callback) {
        if (callback == null) {
          callback = function() {};
        }
        if (scripts[url] != null) {
          return callback();
        } else {
          return $.getScript(url).done(function() {
            scripts[url] = true;
            return callback();
          }).fail(function() {
            return callback();
          });
        }
      };
    
      plugin.get = wiki.getPlugin = function(name, callback) {
        if (window.plugins[name]) {
          return callback(window.plugins[name]);
        }
        return getScript("/plugins/" + name + "/" + name + ".js", function() {
          if (window.plugins[name]) {
            return callback(window.plugins[name]);
          }
          return getScript("/plugins/" + name + ".js", function() {
            return callback(window.plugins[name]);
          });
        });
      };
    
      plugin["do"] = wiki.doPlugin = function(div, item, done) {
        var error;
        if (done == null) {
          done = function() {};
        }
        error = function(ex) {
          var errorElement;
          errorElement = $("
    ").addClass('error'); errorElement.text(ex.toString()); return div.append(errorElement); }; div.data('pageElement', div.parents(".page")); div.data('item', item); return plugin.get(item.type, function(script) { try { if (script == null) { throw TypeError("Can't find plugin for '" + item.type + "'"); } if (script.emit.length > 2) { return script.emit(div, item, function() { script.bind(div, item); return done(); }); } else { script.emit(div, item); script.bind(div, item); return done(); } } catch (err) { wiki.log('plugin error', err); error(err); return done(); } }); }; wiki.registerPlugin = function(pluginName, pluginFn) { return window.plugins[pluginName] = pluginFn($); }; window.plugins = { paragraph: { emit: function(div, item) { return div.append("

    " + (wiki.resolveLinks(item.text)) + "

    "); }, bind: function(div, item) { return div.dblclick(function() { return wiki.textEditor(div, item, null, true); }); } }, image: { emit: function(div, item) { item.text || (item.text = item.caption); return div.append("

    " + (wiki.resolveLinks(item.text)) + "

    "); }, bind: function(div, item) { div.dblclick(function() { return wiki.textEditor(div, item); }); return div.find('img').dblclick(function() { return wiki.dialog(item.text, this); }); } }, future: { emit: function(div, item) { var info, _i, _len, _ref, _results; div.append("" + item.text + "

    new blank page"); if (((info = wiki.neighborhood[location.host]) != null) && (info.sitemap != null)) { _ref = info.sitemap; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { item = _ref[_i]; if (item.slug.match(/-template$/)) { _results.push(div.append("
    from " + (wiki.resolveLinks("[[" + item.title + "]]")))); } else { _results.push(void 0); } } return _results; } }, bind: function(div, item) {} } }; }).call(this); }); require.define("/lib/refresh.coffee",function(require,module,exports,__dirname,__filename,process,global){(function() { var buildPageHeader, createFactory, emitHeader, handleDragging, initAddButton, initDragging, neighborhood, pageHandler, plugin, refresh, renderPageIntoPageElement, state, util, __slice = [].slice; util = require('./util.coffee'); pageHandler = require('./pageHandler.coffee'); plugin = require('./plugin.coffee'); state = require('./state.coffee'); neighborhood = require('./neighborhood.coffee'); handleDragging = function(evt, ui) { var action, before, beforeElement, destinationPageElement, equals, item, itemElement, moveFromPage, moveToPage, moveWithinPage, order, sourcePageElement, sourceSite, thisPageElement; itemElement = ui.item; item = wiki.getItem(itemElement); thisPageElement = $(this).parents('.page:first'); sourcePageElement = itemElement.data('pageElement'); sourceSite = sourcePageElement.data('site'); destinationPageElement = itemElement.parents('.page:first'); equals = function(a, b) { return a && b && a.get(0) === b.get(0); }; moveWithinPage = !sourcePageElement || equals(sourcePageElement, destinationPageElement); moveFromPage = !moveWithinPage && equals(thisPageElement, sourcePageElement); moveToPage = !moveWithinPage && equals(thisPageElement, destinationPageElement); if (moveFromPage) { if (sourcePageElement.hasClass('ghost') || sourcePageElement.attr('id') === destinationPageElement.attr('id')) { return; } } action = moveWithinPage ? (order = $(this).children().map(function(_, value) { return $(value).attr('data-id'); }).get(), { type: 'move', order: order }) : moveFromPage ? (wiki.log('drag from', sourcePageElement.find('h1').text()), { type: 'remove' }) : moveToPage ? (itemElement.data('pageElement', thisPageElement), beforeElement = itemElement.prev('.item'), before = wiki.getItem(beforeElement), { type: 'add', item: item, after: before != null ? before.id : void 0 }) : void 0; action.id = item.id; return pageHandler.put(thisPageElement, action); }; initDragging = function($page) { var $story; $story = $page.find('.story'); return $story.sortable({ connectWith: '.page .story' }).on("sortupdate", handleDragging); }; initAddButton = function($page) { return $page.find(".add-factory").live("click", function(evt) { if ($page.hasClass('ghost')) { return; } evt.preventDefault(); return createFactory($page); }); }; createFactory = function($page) { var before, beforeElement, item, itemElement; item = { type: "factory", id: util.randomBytes(8) }; itemElement = $("
    ", { "class": "item factory" }).data('item', item).attr('data-id', item.id); itemElement.data('pageElement', $page); $page.find(".story").append(itemElement); plugin["do"](itemElement, item); beforeElement = itemElement.prev('.item'); before = wiki.getItem(beforeElement); return pageHandler.put($page, { item: item, id: item.id, type: "add", after: before != null ? before.id : void 0 }); }; buildPageHeader = function(_arg) { var favicon_src, header_href, title, tooltip; title = _arg.title, tooltip = _arg.tooltip, header_href = _arg.header_href, favicon_src = _arg.favicon_src; return "

    " + title + "

    "; }; emitHeader = function($page, page) { var date, header, isRemotePage, pageHeader, rev, site; site = $page.data('site'); isRemotePage = (site != null) && site !== 'local' && site !== 'origin' && site !== 'view'; header = ''; pageHeader = isRemotePage ? buildPageHeader({ tooltip: site, header_href: "//" + site, favicon_src: "http://" + site + "/favicon.png", title: page.title }) : buildPageHeader({ tooltip: location.host, header_href: "/", favicon_src: "/favicon.png", title: page.title }); $page.append(pageHeader); if (!isRemotePage) { $('img.favicon', $page).error(function(e) { return plugin.get('favicon', function(favicon) { return favicon.create(); }); }); } if ((rev = $page.attr('id').split('_rev')[1]) != null) { date = page.journal[page.journal.length - 1].date; return $page.addClass('ghost').data('rev', rev).append($("

    \n \n " + (date != null ? util.formatDate(date) : "Revision " + rev) + "\n \n

    ")); } }; renderPageIntoPageElement = function(pageData, $page, siteFound) { var $footer, $journal, $story, action, addContext, context, emitItem, page, site, slug, _i, _j, _len, _len1, _ref, _ref1, _ref2; page = $.extend(util.emptyPage(), pageData); $page.data("data", page); slug = $page.attr('id'); site = $page.data('site'); context = ['view']; if (site != null) { context.push(site); } addContext = function(site) { if ((site != null) && !_.include(context, site)) { return context.push(site); } }; _ref = page.journal.slice(0).reverse(); for (_i = 0, _len = _ref.length; _i < _len; _i++) { action = _ref[_i]; addContext(action.site); } wiki.resolutionContext = context; emitHeader($page, page); _ref1 = ['story', 'journal', 'footer'].map(function(className) { return $("
    ").addClass(className).appendTo($page); }), $story = _ref1[0], $journal = _ref1[1], $footer = _ref1[2]; emitItem = function(i) { var $item, item; if (i >= page.story.length) { return; } item = page.story[i]; $item = $("
    "); $story.append($item); return plugin["do"]($item, item, function() { return emitItem(i + 1); }); }; emitItem(0); _ref2 = page.journal; for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { action = _ref2[_j]; wiki.addToJournal($journal, action); } $journal.append(""); return $footer.append("CC BY-SA 3.0 .\nJSON .\n" + (siteFound || 'origin') + ""); }; wiki.buildPage = function(data, siteFound, $page) { if (siteFound === 'local') { $page.addClass('local'); } else { $page.data('site', siteFound); } renderPageIntoPageElement(data, $page, siteFound); state.setUrl(); initDragging($page); initAddButton($page); return $page; }; module.exports = refresh = wiki.refresh = function() { var $page, createGhostPage, pageInformation, registerNeighbors, rev, slug, whenGotten, _ref; $page = $(this); _ref = $page.attr('id').split('_rev'), slug = _ref[0], rev = _ref[1]; pageInformation = { slug: slug, rev: rev, site: $page.data('site') }; createGhostPage = function() { var heading, hits, info, page, result, site, title, _ref1, _ref2; title = $("a[href=\"/" + slug + ".html\"]:last").text() || slug; page = { 'title': title, 'story': [ { 'id': util.randomBytes(8), 'type': 'future', 'text': 'We could not find this page.', 'title': title } ] }; heading = { 'type': 'paragraph', 'id': util.randomBytes(8), 'text': "We did find the page in your current neighborhood." }; hits = []; _ref1 = wiki.neighborhood; for (site in _ref1) { info = _ref1[site]; if (info.sitemap != null) { result = _.find(info.sitemap, function(each) { return each.slug === slug; }); if (result != null) { hits.push({ "type": "reference", "id": util.randomBytes(8), "site": site, "slug": slug, "title": result.title || slug, "text": result.synopsis || '' }); } } } if (hits.length > 0) { (_ref2 = page.story).push.apply(_ref2, [heading].concat(__slice.call(hits))); page.story[0].text = 'We could not find this page in the expected context.'; } return wiki.buildPage(page, void 0, $page).addClass('ghost'); }; registerNeighbors = function(data, site) { var action, item, _i, _j, _len, _len1, _ref1, _ref2, _results; if (_.include(['local', 'origin', 'view', null, void 0], site)) { neighborhood.registerNeighbor(location.host); } else { neighborhood.registerNeighbor(site); } _ref1 = data.story || []; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { item = _ref1[_i]; if (item.site != null) { neighborhood.registerNeighbor(item.site); } } _ref2 = data.journal || []; _results = []; for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { action = _ref2[_j]; if (action.site != null) { _results.push(neighborhood.registerNeighbor(action.site)); } else { _results.push(void 0); } } return _results; }; whenGotten = function(data, siteFound) { wiki.buildPage(data, siteFound, $page); return registerNeighbors(data, siteFound); }; return pageHandler.get({ whenGotten: whenGotten, whenNotGotten: createGhostPage, pageInformation: pageInformation }); }; }).call(this); }); require.define("/lib/neighborhood.coffee",function(require,module,exports,__dirname,__filename,process,global){(function() { var active, createSearch, neighborhood, nextAvailableFetch, nextFetchInterval, populateSiteInfoFor, util, _ref, __hasProp = {}.hasOwnProperty; active = require('./active.coffee'); util = require('./util.coffee'); createSearch = require('./search.coffee'); module.exports = neighborhood = {}; if ((_ref = wiki.neighborhood) == null) { wiki.neighborhood = {}; } nextAvailableFetch = 0; nextFetchInterval = 2000; populateSiteInfoFor = function(site, neighborInfo) { var fetchMap, now, transition; if (neighborInfo.sitemapRequestInflight) { return; } neighborInfo.sitemapRequestInflight = true; transition = function(site, from, to) { return $(".neighbor[data-site=\"" + site + "\"]").find('div').removeClass(from).addClass(to); }; fetchMap = function() { var request, sitemapUrl; sitemapUrl = "http://" + site + "/system/sitemap.json"; transition(site, 'wait', 'fetch'); request = $.ajax({ type: 'GET', dataType: 'json', url: sitemapUrl }); return request.always(function() { return neighborInfo.sitemapRequestInflight = false; }).done(function(data) { neighborInfo.sitemap = data; transition(site, 'fetch', 'done'); return $('body').trigger('new-neighbor-done', site); }).fail(function(data) { return transition(site, 'fetch', 'fail'); }); }; now = Date.now(); if (now > nextAvailableFetch) { nextAvailableFetch = now + nextFetchInterval; return setTimeout(fetchMap, 100); } else { setTimeout(fetchMap, nextAvailableFetch - now); return nextAvailableFetch += nextFetchInterval; } }; wiki.registerNeighbor = neighborhood.registerNeighbor = function(site) { var neighborInfo; if (wiki.neighborhood[site] != null) { return; } neighborInfo = {}; wiki.neighborhood[site] = neighborInfo; populateSiteInfoFor(site, neighborInfo); return $('body').trigger('new-neighbor', site); }; neighborhood.listNeighbors = function() { return _.keys(wiki.neighborhood); }; neighborhood.search = function(searchQuery) { var finds, match, matchingPages, neighborInfo, neighborSite, sitemap, start, tally, tick, _ref1; finds = []; tally = {}; tick = function(key) { if (tally[key] != null) { return tally[key]++; } else { return tally[key] = 1; } }; match = function(key, text) { var hit; hit = (text != null) && text.toLowerCase().indexOf(searchQuery.toLowerCase()) >= 0; if (hit) { tick(key); } return hit; }; start = Date.now(); _ref1 = wiki.neighborhood; for (neighborSite in _ref1) { if (!__hasProp.call(_ref1, neighborSite)) continue; neighborInfo = _ref1[neighborSite]; sitemap = neighborInfo.sitemap; if (sitemap != null) { tick('sites'); } matchingPages = _.each(sitemap, function(page) { tick('pages'); if (!(match('title', page.title) || match('text', page.synopsis) || match('slug', page.slug))) { return; } tick('finds'); return finds.push({ page: page, site: neighborSite, rank: 1 }); }); } tally['msec'] = Date.now() - start; return { finds: finds, tally: tally }; }; $(function() { var $neighborhood, flag, search; $neighborhood = $('.neighborhood'); flag = function(site) { return "\n
    \n \n
    \n
    "; }; $('body').on('new-neighbor', function(e, site) { return $neighborhood.append(flag(site)); }).delegate('.neighbor img', 'click', function(e) { return wiki.doInternalLink('welcome-visitors', null, this.title); }); search = createSearch({ neighborhood: neighborhood }); return $('input.search').on('keypress', function(e) { var searchQuery; if (e.keyCode !== 13) { return; } searchQuery = $(this).val(); search.performSearch(searchQuery); return $(this).val(""); }); }); }).call(this); }); require.define("/lib/search.coffee",function(require,module,exports,__dirname,__filename,process,global){(function() { var active, createSearch, util; util = require('./util'); active = require('./active'); require('./dom'); createSearch = function(_arg) { var neighborhood, performSearch; neighborhood = _arg.neighborhood; performSearch = function(searchQuery) { var $searchResultPage, explanatoryPara, result, searchResultPageData, searchResultReferences, searchResults, tally; searchResults = neighborhood.search(searchQuery); tally = searchResults.tally; explanatoryPara = { type: 'paragraph', id: util.randomBytes(8), text: "String '" + searchQuery + "' found on " + (tally.finds || 'none') + " of " + (tally.pages || 'no') + " pages from " + (tally.sites || 'no') + " sites.\nText matched on " + (tally.title || 'no') + " titles, " + (tally.text || 'no') + " paragraphs, and " + (tally.slug || 'no') + " slugs.\nElapsed time " + tally.msec + " milliseconds." }; searchResultReferences = (function() { var _i, _len, _ref, _results; _ref = searchResults.finds; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { result = _ref[_i]; _results.push({ "type": "reference", "id": util.randomBytes(8), "site": result.site, "slug": result.page.slug, "title": result.page.title, "text": result.page.synopsis || '' }); } return _results; })(); searchResultPageData = { title: "Search Results", story: [explanatoryPara].concat(searchResultReferences) }; $searchResultPage = wiki.createPage('search-results').addClass('ghost'); $searchResultPage.appendTo($('.main')); wiki.buildPage(searchResultPageData, null, $searchResultPage); return active.set($('.page').last()); }; return { performSearch: performSearch }; }; module.exports = createSearch; }).call(this); }); require.define("/lib/dom.coffee",function(require,module,exports,__dirname,__filename,process,global){(function() { wiki.createPage = function(name, loc) { if (loc && loc !== 'view') { return $("
    ").attr('id', name).attr('data-site', loc).addClass("page"); } else { return $("
    ").attr('id', name).addClass("page"); } }; }).call(this); }); require.define("/client.coffee",function(require,module,exports,__dirname,__filename,process,global){(function() { require('./lib/legacy.coffee'); }).call(this); }); require("/client.coffee"); })();