(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 = $("" + 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("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"); return $footer.append("\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"); })();