changeset 18:530941426679

Local changes are now stored and shown on the sidebar.
author Atul Varma <varmaa@toolness.com>
date Thu, 12 Feb 2009 13:09:28 -0800
parents 80176f8b01aa
children 8ec70abb260d
files jquery.timeago.js wiki.css wiki.html wiki.js
diffstat 4 files changed, 164 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jquery.timeago.js	Thu Feb 12 13:09:28 2009 -0800
@@ -0,0 +1,125 @@
+/*
+ * timeago: a jQuery plugin, version: 0.6.2 (10/14/2008)
+ * @requires jQuery v1.2 or later
+ *
+ * Timeago is a jQuery plugin that makes it easy to support automatically
+ * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
+ *
+ * For usage and examples, visit:
+ * http://timeago.yarp.com/
+ *
+ * Licensed under the MIT:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * Copyright (c) 2008-2009, Ryan McGeary (ryanonjavascript -[at]- mcgeary [*dot*] org)
+ */
+(function($) {
+  $.timeago = function(timestamp) {
+    if (timestamp instanceof Date) return inWords(timestamp);
+    else if (typeof timestamp == "string") return inWords($.timeago.parse(timestamp));
+    else return inWords($.timeago.parse($(timestamp).attr("title")));
+  };
+  var $t = $.timeago;
+
+  $.extend($.timeago, {
+    settings: {
+      refreshMillis: 60000,
+      allowFuture: false,
+      strings: {
+        prefixAgo: null,
+        prefixFromNow: null,
+        suffixAgo: "ago",
+        suffixFromNow: "from now",
+        ago: null, // DEPRECATED, use suffixAgo
+        fromNow: null, // DEPRECATED, use suffixFromNow
+        seconds: "less than a minute",
+        minute: "about a minute",
+        minutes: "%d minutes",
+        hour: "about an hour",
+        hours: "about %d hours",
+        day: "a day",
+        days: "%d days",
+        month: "about a month",
+        months: "%d months",
+        year: "about a year",
+        years: "%d years"
+      }
+    },
+    inWords: function(distanceMillis) {
+      var $l = this.settings.strings;
+      var prefix = $l.prefixAgo;
+      var suffix = $l.suffixAgo || $l.ago;
+      if (this.settings.allowFuture) {
+        if (distanceMillis < 0) {
+          prefix = $l.prefixFromNow;
+          suffix = $l.suffixFromNow || $l.fromNow;
+        }
+        distanceMillis = Math.abs(distanceMillis);
+      }
+
+      var seconds = distanceMillis / 1000;
+      var minutes = seconds / 60;
+      var hours = minutes / 60;
+      var days = hours / 24;
+      var years = days / 365;
+
+      var words = seconds < 45 && sprintf($l.seconds, Math.round(seconds)) ||
+        seconds < 90 && $l.minute ||
+        minutes < 45 && sprintf($l.minutes, Math.round(minutes)) ||
+        minutes < 90 && $l.hour ||
+        hours < 24 && sprintf($l.hours, Math.round(hours)) ||
+        hours < 48 && $l.day ||
+        days < 30 && sprintf($l.days, Math.floor(days)) ||
+        days < 60 && $l.month ||
+        days < 365 && sprintf($l.months, Math.floor(days / 30)) ||
+        years < 2 && $l.year ||
+        sprintf($l.years, Math.floor(years));
+
+      return $.trim([prefix, words, suffix].join(" "));
+    },
+    parse: function(iso8601) {
+      var s = $.trim(iso8601);
+      s = s.replace(/-/,"/").replace(/-/,"/");
+      s = s.replace(/T/," ").replace(/Z/," UTC");
+      s = s.replace(/([\+-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
+      return new Date(s);
+    }
+  });
+
+  $.fn.timeago = function() {
+    var self = this;
+    self.each(refresh);
+
+    var $s = $t.settings;
+    if ($s.refreshMillis > 0) {
+      setInterval(function() { self.each(refresh); }, $s.refreshMillis);
+    }
+    return self;
+  };
+
+  function refresh() {
+    var date = $t.parse(this.title);
+    if (!isNaN(date)) {
+      $(this).text(inWords(date));
+    }
+    return this;
+  }
+
+  function inWords(date) {
+    return $t.inWords(distance(date));
+  }
+
+  function distance(date) {
+    return (new Date().getTime() - date.getTime());
+  }
+
+  // lame sprintf implementation
+  function sprintf(string, value) {
+    return string.replace(/%d/i, value);
+  }
+
+  // fix for IE6 suckage
+  if ($.browser.msie && $.browser.version < 7.0) {
+    document.createElement('abbr');
+  }
+})(jQuery);
--- a/wiki.css	Thu Feb 12 11:49:50 2009 -0800
+++ b/wiki.css	Thu Feb 12 13:09:28 2009 -0800
@@ -12,6 +12,14 @@
     margin: 0 auto;
 }
 
+#local-changes {
+    display: none;
+}
+
+#local-changes div {
+    cursor: pointer;
+}
+
 #login {
     display: none;
 }
--- a/wiki.html	Thu Feb 12 11:49:50 2009 -0800
+++ b/wiki.html	Thu Feb 12 13:09:28 2009 -0800
@@ -19,10 +19,14 @@
     <img src="http://www.yahoo.com/favicon.ico">
     <img src="http://openid.net/favicon.ico">
   </div>
+  <div id="local-changes">
+    <h1>Local Changes</h1>
+  </div>
 </div>
 <div id="content"></div>
 </body>
 <script src="jquery.js"></script>
+<script src="jquery.timeago.js"></script>
 <script src="wikicreole.js"></script>
 <script src="wiki.js"></script>
 </html>
--- a/wiki.js	Thu Feb 12 11:49:50 2009 -0800
+++ b/wiki.js	Thu Feb 12 13:09:28 2009 -0800
@@ -38,6 +38,7 @@
   PART_SEPARATOR: "\n\n",
   creole: null,
   editingElement: null,
+  localChanges: [],
   eventHandlers: {}
 };
 
@@ -59,6 +60,28 @@
   return partsMarkup.join(App.PART_SEPARATOR);
 };
 
+App.saveChanges = function saveChanges(doFadeIn) {
+  var markup = App.getMarkup($(window.document));
+  var changeset = {date: new Date(),
+                   content: markup};
+  App.localChanges.push(changeset);
+  var changesetElem = $('<div class="changeset"></div>');
+  function setText() {
+    changesetElem.text(jQuery.timeago(changeset.date));
+  }
+  window.setInterval(setText, 60000);
+  setText();
+  changesetElem.click(
+    function() {
+      $("#content").empty();
+      $("#content").append(App.createParts(changeset.content));
+    }
+  );
+  $('#local-changes').find('h1').after(changesetElem);
+  if (doFadeIn)
+    $('#local-changes').fadeIn();
+};
+
 App.enterEditMode = function enterEditMode(parts, level, cursorPos) {
   if (App.editingElement) {
     $(App.editingElement).blur();
@@ -76,8 +99,10 @@
   function exitEditMode() {
     var markup = $(this).attr("value");
     $(this).replaceWith(App.createParts(markup));
-    if (markup != originalMarkup)
+    if (markup != originalMarkup) {
+      App.saveChanges(true);
       $('#login').fadeIn();
+    }
   }
 
   function editSiblings(aEvt) {
@@ -151,6 +176,7 @@
              {},
              function(text) {
                $("#content").append(App.createParts(text));
+               App.saveChanges(false);
              },
              "text");
 };