From 593f5df5031fee1921a3bdfc59e9fb016f4f5013 Mon Sep 17 00:00:00 2001
From: riking <rikingcoding@gmail.com>
Date: Tue, 18 Mar 2014 18:19:20 -0700
Subject: [PATCH 1/8] Corrections to JSDoc

---
 .../admin/controllers/admin_api_controller.js            | 4 ++--
 app/assets/javascripts/admin/models/api_key.js           | 2 +-
 .../javascripts/admin/routes/admin_backups_route.js      | 4 ++--
 .../javascripts/discourse/dialects/bbcode_dialect.js     | 9 ++++++++-
 app/assets/javascripts/discourse/dialects/dialect.js     | 6 +++---
 app/assets/javascripts/discourse/lib/markdown.js         | 9 ++++++---
 app/assets/javascripts/discourse/lib/utilities.js        | 2 +-
 .../javascripts/discourse/mixins/modal_functionality.js  | 3 ++-
 app/assets/javascripts/discourse/models/post_stream.js   | 5 ++---
 app/assets/javascripts/discourse/models/topic_list.js    | 6 +++---
 app/assets/javascripts/discourse/models/user.js          | 4 +++-
 app/assets/javascripts/discourse/views/container_view.js | 4 ++--
 12 files changed, 35 insertions(+), 23 deletions(-)

diff --git a/app/assets/javascripts/admin/controllers/admin_api_controller.js b/app/assets/javascripts/admin/controllers/admin_api_controller.js
index 8a0861c6e..856c39c3d 100644
--- a/app/assets/javascripts/admin/controllers/admin_api_controller.js
+++ b/app/assets/javascripts/admin/controllers/admin_api_controller.js
@@ -25,7 +25,7 @@ Discourse.AdminApiController = Ember.ArrayController.extend({
       Creates an API key instance with internal user object
 
       @method regenerateKey
-      @param {Discourse.ApiKey} the key to regenerate
+      @param {Discourse.ApiKey} key the key to regenerate
     **/
     regenerateKey: function(key) {
       bootbox.confirm(I18n.t("admin.api.confirm_regen"), I18n.t("no_value"), I18n.t("yes_value"), function(result) {
@@ -39,7 +39,7 @@ Discourse.AdminApiController = Ember.ArrayController.extend({
       Revokes an API key
 
       @method revokeKey
-      @param {Discourse.ApiKey} the key to revoke
+      @param {Discourse.ApiKey} key the key to revoke
     **/
     revokeKey: function(key) {
       var self = this;
diff --git a/app/assets/javascripts/admin/models/api_key.js b/app/assets/javascripts/admin/models/api_key.js
index 4c21df9a5..409688558 100644
--- a/app/assets/javascripts/admin/models/api_key.js
+++ b/app/assets/javascripts/admin/models/api_key.js
@@ -40,7 +40,7 @@ Discourse.ApiKey.reopenClass({
     Creates an API key instance with internal user object
 
     @method create
-    @param {Object} the properties to create
+    @param {...} var_args the properties to initialize this with
     @returns {Discourse.ApiKey} the ApiKey instance
   **/
   create: function() {
diff --git a/app/assets/javascripts/admin/routes/admin_backups_route.js b/app/assets/javascripts/admin/routes/admin_backups_route.js
index 74cd765c6..deadc2407 100644
--- a/app/assets/javascripts/admin/routes/admin_backups_route.js
+++ b/app/assets/javascripts/admin/routes/admin_backups_route.js
@@ -69,7 +69,7 @@ Discourse.AdminBackupsRoute = Discourse.Route.extend({
       Destroys a backup
 
       @method destroyBackup
-      @param {Discourse.Backup} the backup to destroy
+      @param {Discourse.Backup} backup the backup to destroy
     **/
     destroyBackup: function(backup) {
       var self = this;
@@ -91,7 +91,7 @@ Discourse.AdminBackupsRoute = Discourse.Route.extend({
       Start a restore and redirect the user to the logs tab
 
       @method startRestore
-      @param {Discourse.Backup} the backup to restore
+      @param {Discourse.Backup} backup the backup to restore
     **/
     startRestore: function(backup) {
       var self = this;
diff --git a/app/assets/javascripts/discourse/dialects/bbcode_dialect.js b/app/assets/javascripts/discourse/dialects/bbcode_dialect.js
index 51357be81..d47698d8b 100644
--- a/app/assets/javascripts/discourse/dialects/bbcode_dialect.js
+++ b/app/assets/javascripts/discourse/dialects/bbcode_dialect.js
@@ -4,7 +4,14 @@
   @method replaceBBCode
   @param {tag} tag the tag we want to match
   @param {function} emitter the function that creates JsonML for the tag
-  @param {Object} hash of options to pass to `inlineBetween`
+  @param {Object} opts options to pass to Discourse.Dialect.inlineBetween
+    @param {Function} [opts.emitter] The function that will be called with the contents and returns JsonML.
+    @param {String} [opts.start] The starting token we want to find
+    @param {String} [opts.stop] The ending token we want to find
+    @param {String} [opts.between] A shortcut for when the `start` and `stop` are the same.
+    @param {Boolean} [opts.rawContents] If true, the contents between the tokens will not be parsed.
+    @param {Boolean} [opts.wordBoundary] If true, the match must be on a word boundary
+    @param {Boolean} [opts.spaceBoundary] If true, the match must be on a sppace boundary
 **/
 function replaceBBCode(tag, emitter, opts) {
   opts = opts || {};
diff --git a/app/assets/javascripts/discourse/dialects/dialect.js b/app/assets/javascripts/discourse/dialects/dialect.js
index cf12fc64d..d3d35b645 100644
--- a/app/assets/javascripts/discourse/dialects/dialect.js
+++ b/app/assets/javascripts/discourse/dialects/dialect.js
@@ -143,6 +143,7 @@ Discourse.Dialect = {
 
     @method cook
     @param {String} text the raw text to cook
+    @param {Object} opts hash of options
     @returns {String} the cooked text
   **/
   cook: function(text, opts) {
@@ -288,9 +289,8 @@ Discourse.Dialect = {
     the other helpers such as `replaceBlock` so consider using them first!
 
     @method registerBlock
-    @param {String} the name of the block handler
-    @param {Function} the handler
-
+    @param {String} name the name of the block handler
+    @param {Function} handler the handler
   **/
   registerBlock: function(name, handler) {
     dialect.block[name] = handler;
diff --git a/app/assets/javascripts/discourse/lib/markdown.js b/app/assets/javascripts/discourse/lib/markdown.js
index a2bdfde35..00748dfae 100644
--- a/app/assets/javascripts/discourse/lib/markdown.js
+++ b/app/assets/javascripts/discourse/lib/markdown.js
@@ -13,10 +13,10 @@ Discourse.Markdown = {
   validIframes: [],
 
   /**
-    Whitelists classes for sanitization
+    Whitelists more classes for sanitization.
 
+    @param {...String} var_args Classes to whitelist
     @method whiteListClass
-    @param {String} val The value to whitelist. Can supply more than one argument
   **/
   whiteListClass: function() {
     var args = Array.prototype.slice.call(arguments),
@@ -113,7 +113,10 @@ Discourse.Markdown = {
     Checks to see if a URL is allowed in the cooked content
 
     @method urlAllowed
-    @param {String} url Url to check
+    @param {String} uri Url to check
+    @param {Number} effect ignored
+    @param {Number} ltype ignored
+    @param {Object} hints an object with hints, used to check if this url is from an iframe
     @return {String} url to insert in the cooked content
   **/
   urlAllowed: function (uri, effect, ltype, hints) {
diff --git a/app/assets/javascripts/discourse/lib/utilities.js b/app/assets/javascripts/discourse/lib/utilities.js
index 0e4e91352..71dbe1952 100644
--- a/app/assets/javascripts/discourse/lib/utilities.js
+++ b/app/assets/javascripts/discourse/lib/utilities.js
@@ -210,7 +210,7 @@ Discourse.Utilities = {
     Check the extension of the file against the list of authorized extensions
 
     @method isAuthorizedUpload
-    @param {File} files The file we want to upload
+    @param {File} file The file we want to upload
   **/
   isAuthorizedUpload: function(file) {
     var extensions = Discourse.SiteSettings.authorized_extensions;
diff --git a/app/assets/javascripts/discourse/mixins/modal_functionality.js b/app/assets/javascripts/discourse/mixins/modal_functionality.js
index acb228204..8cb98fc86 100644
--- a/app/assets/javascripts/discourse/mixins/modal_functionality.js
+++ b/app/assets/javascripts/discourse/mixins/modal_functionality.js
@@ -13,7 +13,8 @@ Discourse.ModalFunctionality = Em.Mixin.create({
     Flash a message at the top of the modal
 
     @method blank
-    @param {String} name the name of the property we want to check
+    @param {String} message I18n name of the message
+    @param {String} messageClass CSS class to apply
     @return {Boolean}
   **/
   flash: function(message, messageClass) {
diff --git a/app/assets/javascripts/discourse/models/post_stream.js b/app/assets/javascripts/discourse/models/post_stream.js
index c66f1a82d..90e78859c 100644
--- a/app/assets/javascripts/discourse/models/post_stream.js
+++ b/app/assets/javascripts/discourse/models/post_stream.js
@@ -179,7 +179,6 @@ Discourse.PostStream = Em.Object.extend({
     Cancel any active filters on the stream.
 
     @method cancelFilter
-    @returns {Ember.Deferred} a promise that resolves when the filter has been cancelled.
   **/
   cancelFilter: function() {
     this.set('summary', false);
@@ -373,8 +372,8 @@ Discourse.PostStream = Em.Object.extend({
     `undoPost` when it fails.
 
     @method stagePost
-    @param {Discourse.Post} the post to stage in the stream
-    @param {Discourse.User} the user creating the post
+    @param {Discourse.Post} post the post to stage in the stream
+    @param {Discourse.User} user the user creating the post
   **/
   stagePost: function(post, user) {
 
diff --git a/app/assets/javascripts/discourse/models/topic_list.js b/app/assets/javascripts/discourse/models/topic_list.js
index 7c8b2e07f..5c2d1b1cd 100644
--- a/app/assets/javascripts/discourse/models/topic_list.js
+++ b/app/assets/javascripts/discourse/models/topic_list.js
@@ -162,7 +162,7 @@ Discourse.TopicList.reopenClass({
     Stitch together side loaded topic data
 
     @method topicsFrom
-    @param {Object} JSON object with topic data
+    @param {Object} result JSON object with topic data
     @returns {Array} the list of topics
   **/
   topicsFrom: function(result) {
@@ -204,8 +204,8 @@ Discourse.TopicList.reopenClass({
     Lists topics on a given menu item
 
     @method list
-    @param {Object} The menu item to filter to
-    @param {Object} Any additional params
+    @param {Object} filter The menu item to filter to
+    @param {Object} params Any additional params to pass to TopicList.find()
     @returns {Promise} a promise that resolves to the list of topics
   **/
   list: function(filter, params) {
diff --git a/app/assets/javascripts/discourse/models/user.js b/app/assets/javascripts/discourse/models/user.js
index c09e53feb..e253b0c47 100644
--- a/app/assets/javascripts/discourse/models/user.js
+++ b/app/assets/javascripts/discourse/models/user.js
@@ -461,6 +461,7 @@ Discourse.User.reopenClass(Discourse.Singleton, {
     @method checkUsername
     @param {String} username A username to check
     @param {String} email An email address to check
+    @param {Number} forUserId user id - provide when changing username
   **/
   checkUsername: function(username, email, forUserId) {
     return Discourse.ajax('/users/check_username', {
@@ -472,7 +473,7 @@ Discourse.User.reopenClass(Discourse.Singleton, {
     Groups the user's statistics
 
     @method groupStats
-    @param {Array} Given stats
+    @param {Array} stats Given stats
     @returns {Object}
   **/
   groupStats: function(stats) {
@@ -507,6 +508,7 @@ Discourse.User.reopenClass(Discourse.Singleton, {
     @param {String} name This user's name
     @param {String} email This user's email
     @param {String} password This user's password
+    @param {String} username This user's username
     @param {String} passwordConfirm This user's confirmed password
     @param {String} challenge
     @returns Result of ajax call
diff --git a/app/assets/javascripts/discourse/views/container_view.js b/app/assets/javascripts/discourse/views/container_view.js
index 580a690b7..65b3e70ae 100644
--- a/app/assets/javascripts/discourse/views/container_view.js
+++ b/app/assets/javascripts/discourse/views/container_view.js
@@ -14,7 +14,7 @@ Discourse.ContainerView = Ember.ContainerView.extend(Discourse.Presence, {
 
     @method attachViewWithArgs
     @param {Object} viewArgs The arguments to pass when creating the view
-    @param {Class} klass The view class we want to create
+    @param {Class} viewClass The view class we want to create
   **/
   attachViewWithArgs: function(viewArgs, viewClass) {
     if (!viewClass) { viewClass = Ember.View.extend(); }
@@ -26,7 +26,7 @@ Discourse.ContainerView = Ember.ContainerView.extend(Discourse.Presence, {
     Attaches a view with no arguments and wires up the container properly
 
     @method attachViewClass
-    @param {Class} klass The view class we want to create
+    @param {Class} viewClass The view class we want to add
   **/
   attachViewClass: function(viewClass) {
     this.attachViewWithArgs(null, viewClass);

From 3f35d1062e2d1f5a65505be1d15a5c3b76c2455b Mon Sep 17 00:00:00 2001
From: riking <rikingcoding@gmail.com>
Date: Tue, 18 Mar 2014 18:21:10 -0700
Subject: [PATCH 2/8] Remove trailing commas, add trailing semicolons

---
 .../admin/controllers/admin_backups_controller.js           | 2 +-
 .../admin/controllers/admin_backups_index_controller.js     | 3 +--
 .../admin/controllers/admin_backups_logs_controller.js      | 2 +-
 .../admin/controllers/admin_email_logs_controllers.js       | 6 ++----
 app/assets/javascripts/admin/models/backup.js               | 3 +--
 app/assets/javascripts/admin/models/backup_status.js        | 3 +--
 app/assets/javascripts/admin/routes/admin_backups_route.js  | 5 ++---
 app/assets/javascripts/admin/views/admin_customize_view.js  | 2 +-
 .../discourse/controllers/_discovery_controller.js          | 2 +-
 .../javascripts/discourse/controllers/group_controller.js   | 2 +-
 app/assets/javascripts/discourse/lib/computed.js            | 2 +-
 app/assets/javascripts/discourse/mixins/scroll_top.js       | 3 +--
 app/assets/javascripts/discourse/models/category_list.js    | 2 +-
 app/assets/javascripts/discourse/models/top_list.js         | 2 +-
 .../discourse/routes/discovery_categories_route.js          | 2 +-
 .../javascripts/discourse/routes/preferences_routes.js      | 2 +-
 .../javascripts/discourse/views/composer/composer_view.js   | 2 +-
 app/assets/javascripts/locales/cs.js.erb                    | 2 +-
 app/assets/javascripts/locales/ru.js.erb                    | 2 +-
 19 files changed, 21 insertions(+), 28 deletions(-)

diff --git a/app/assets/javascripts/admin/controllers/admin_backups_controller.js b/app/assets/javascripts/admin/controllers/admin_backups_controller.js
index 600f02a78..ccfa5a8a0 100644
--- a/app/assets/javascripts/admin/controllers/admin_backups_controller.js
+++ b/app/assets/javascripts/admin/controllers/admin_backups_controller.js
@@ -1,5 +1,5 @@
 Discourse.AdminBackupsController = Ember.ObjectController.extend({
   noOperationIsRunning: Em.computed.not("isOperationRunning"),
   rollbackEnabled: Em.computed.and("canRollback", "restoreEnabled", "noOperationIsRunning"),
-  rollbackDisabled: Em.computed.not("rollbackEnabled"),
+  rollbackDisabled: Em.computed.not("rollbackEnabled")
 });
diff --git a/app/assets/javascripts/admin/controllers/admin_backups_index_controller.js b/app/assets/javascripts/admin/controllers/admin_backups_index_controller.js
index c505e177e..1867b2527 100644
--- a/app/assets/javascripts/admin/controllers/admin_backups_index_controller.js
+++ b/app/assets/javascripts/admin/controllers/admin_backups_index_controller.js
@@ -71,6 +71,5 @@ Discourse.AdminBackupsIndexController = Ember.ArrayController.extend({
     }).then(function() {
       Discourse.set("isReadOnly", enable);
     });
-  },
-
+  }
 });
diff --git a/app/assets/javascripts/admin/controllers/admin_backups_logs_controller.js b/app/assets/javascripts/admin/controllers/admin_backups_logs_controller.js
index 1a9f8e7cc..1e4fd13ae 100644
--- a/app/assets/javascripts/admin/controllers/admin_backups_logs_controller.js
+++ b/app/assets/javascripts/admin/controllers/admin_backups_logs_controller.js
@@ -1,4 +1,4 @@
 Discourse.AdminBackupsLogsController = Ember.ArrayController.extend({
   needs: ["adminBackups"],
-  status: Em.computed.alias("controllers.adminBackups"),
+  status: Em.computed.alias("controllers.adminBackups")
 });
diff --git a/app/assets/javascripts/admin/controllers/admin_email_logs_controllers.js b/app/assets/javascripts/admin/controllers/admin_email_logs_controllers.js
index 356b25549..449104c05 100644
--- a/app/assets/javascripts/admin/controllers/admin_email_logs_controllers.js
+++ b/app/assets/javascripts/admin/controllers/admin_email_logs_controllers.js
@@ -13,8 +13,7 @@ Discourse.AdminEmailSentController = Discourse.Controller.extend({
     Discourse.EmailLog.findAll(this.get("filter")).then(function(logs) {
       self.set("model", logs);
     });
-  }, 250).observes("filter.user", "filter.address", "filter.type", "filter.reply_key"),
-
+  }, 250).observes("filter.user", "filter.address", "filter.type", "filter.reply_key")
 });
 
   /**
@@ -32,8 +31,7 @@ Discourse.AdminEmailSkippedController = Discourse.Controller.extend({
     Discourse.EmailLog.findAll(this.get("filter")).then(function(logs) {
       self.set("model", logs);
     });
-  }, 250).observes("filter.user", "filter.address", "filter.type", "filter.skipped_reason"),
-
+  }, 250).observes("filter.user", "filter.address", "filter.type", "filter.skipped_reason")
 });
 
 
diff --git a/app/assets/javascripts/admin/models/backup.js b/app/assets/javascripts/admin/models/backup.js
index 48cbe0e9d..28a6115a8 100644
--- a/app/assets/javascripts/admin/models/backup.js
+++ b/app/assets/javascripts/admin/models/backup.js
@@ -85,6 +85,5 @@ Discourse.Backup.reopenClass({
         window.location.pathname = Discourse.getURL("/");
       }
     });
-  },
-
+  }
 });
diff --git a/app/assets/javascripts/admin/models/backup_status.js b/app/assets/javascripts/admin/models/backup_status.js
index 1127b5c86..c11c87581 100644
--- a/app/assets/javascripts/admin/models/backup_status.js
+++ b/app/assets/javascripts/admin/models/backup_status.js
@@ -12,6 +12,5 @@ Discourse.BackupStatus = Discourse.Model.extend({
 
   restoreEnabled: function() {
     return Discourse.SiteSettings.allow_restore && !this.get("isOperationRunning");
-  }.property("isOperationRunning"),
-
+  }.property("isOperationRunning")
 });
diff --git a/app/assets/javascripts/admin/routes/admin_backups_route.js b/app/assets/javascripts/admin/routes/admin_backups_route.js
index deadc2407..bed160c63 100644
--- a/app/assets/javascripts/admin/routes/admin_backups_route.js
+++ b/app/assets/javascripts/admin/routes/admin_backups_route.js
@@ -31,7 +31,7 @@ Discourse.AdminBackupsRoute = Discourse.Route.extend({
     }).then(function (status) {
       return Discourse.BackupStatus.create({
         isOperationRunning: status.is_operation_running,
-        canRollback: status.can_rollback,
+        canRollback: status.can_rollback
       });
     });
   },
@@ -160,7 +160,6 @@ Discourse.AdminBackupsRoute = Discourse.Route.extend({
 
     uploadError: function(filename, message) {
       bootbox.alert(I18n.t("admin.backups.upload.error", { filename: filename, message: message }));
-    },
+    }
   }
-
 });
diff --git a/app/assets/javascripts/admin/views/admin_customize_view.js b/app/assets/javascripts/admin/views/admin_customize_view.js
index 83fc6961e..767559bf7 100644
--- a/app/assets/javascripts/admin/views/admin_customize_view.js
+++ b/app/assets/javascripts/admin/views/admin_customize_view.js
@@ -22,7 +22,7 @@ Discourse.AdminCustomizeView = Discourse.View.extend({
     selectStylesheet: function() { this.set('selected', 'stylesheet'); },
 
     selectMobileHeader:     function() { this.set('selected', 'mobileHeader'); },
-    selectMobileStylesheet: function() { this.set('selected', 'mobileStylesheet'); },
+    selectMobileStylesheet: function() { this.set('selected', 'mobileStylesheet'); }
   },
 
   didInsertElement: function() {
diff --git a/app/assets/javascripts/discourse/controllers/_discovery_controller.js b/app/assets/javascripts/discourse/controllers/_discovery_controller.js
index 0613340ed..fe94813e5 100644
--- a/app/assets/javascripts/discourse/controllers/_discovery_controller.js
+++ b/app/assets/javascripts/discourse/controllers/_discovery_controller.js
@@ -20,5 +20,5 @@ Discourse.DiscoveryController = Discourse.ObjectController.extend({
   showMoreDailyUrl: function() { return this.showMoreUrl('daily'); }.property('category', 'noSubcategories'),
   showMoreWeeklyUrl: function() { return this.showMoreUrl('weekly'); }.property('category', 'noSubcategories'),
   showMoreMonthlyUrl: function() { return this.showMoreUrl('monthly'); }.property('category', 'noSubcategories'),
-  showMoreYearlyUrl: function() { return this.showMoreUrl('yearly'); }.property('category', 'noSubcategories'),
+  showMoreYearlyUrl: function() { return this.showMoreUrl('yearly'); }.property('category', 'noSubcategories')
 });
diff --git a/app/assets/javascripts/discourse/controllers/group_controller.js b/app/assets/javascripts/discourse/controllers/group_controller.js
index 8d7d193ec..2d7b0ff7d 100644
--- a/app/assets/javascripts/discourse/controllers/group_controller.js
+++ b/app/assets/javascripts/discourse/controllers/group_controller.js
@@ -12,6 +12,6 @@ Discourse.GroupController = Discourse.ObjectController.extend({
   // It would be nice if bootstrap marked action lists as selected when their links
   // were 'active' not the `li` tags.
   showingIndex: Em.computed.equal('showing', 'index'),
-  showingMembers: Em.computed.equal('showing', 'members'),
+  showingMembers: Em.computed.equal('showing', 'members')
 });
 
diff --git a/app/assets/javascripts/discourse/lib/computed.js b/app/assets/javascripts/discourse/lib/computed.js
index 5dab103d7..952a508dc 100644
--- a/app/assets/javascripts/discourse/lib/computed.js
+++ b/app/assets/javascripts/discourse/lib/computed.js
@@ -110,6 +110,6 @@ Discourse.computed = {
       });
     });
     return computed.property.apply(computed, args);
-  },
+  }
 
 };
diff --git a/app/assets/javascripts/discourse/mixins/scroll_top.js b/app/assets/javascripts/discourse/mixins/scroll_top.js
index b9c7c68cc..da92d81bf 100644
--- a/app/assets/javascripts/discourse/mixins/scroll_top.js
+++ b/app/assets/javascripts/discourse/mixins/scroll_top.js
@@ -12,7 +12,6 @@ Discourse.ScrollTop = Em.Mixin.create({
     Em.run.schedule('afterRender', function() {
       $(document).scrollTop(0);
     });
-  }.on('didInsertElement'),
-
+  }.on('didInsertElement')
 });
 
diff --git a/app/assets/javascripts/discourse/models/category_list.js b/app/assets/javascripts/discourse/models/category_list.js
index 69ac54451..5048316ed 100644
--- a/app/assets/javascripts/discourse/models/category_list.js
+++ b/app/assets/javascripts/discourse/models/category_list.js
@@ -66,7 +66,7 @@ Discourse.CategoryList.reopenClass({
         can_create_category: result.category_list.can_create_category,
         can_create_topic: result.category_list.can_create_topic,
         draft_key: result.category_list.draft_key,
-        draft_sequence: result.category_list.draft_sequence,
+        draft_sequence: result.category_list.draft_sequence
       });
     });
   }
diff --git a/app/assets/javascripts/discourse/models/top_list.js b/app/assets/javascripts/discourse/models/top_list.js
index 3b05f67d1..a7a607862 100644
--- a/app/assets/javascripts/discourse/models/top_list.js
+++ b/app/assets/javascripts/discourse/models/top_list.js
@@ -19,7 +19,7 @@ Discourse.TopList.reopenClass({
         can_create_topic: result.can_create_topic,
         draft: result.draft,
         draft_key: result.draft_key,
-        draft_sequence: result.draft_sequence,
+        draft_sequence: result.draft_sequence
       });
 
       Discourse.Site.currentProp('periods').forEach(function(period) {
diff --git a/app/assets/javascripts/discourse/routes/discovery_categories_route.js b/app/assets/javascripts/discourse/routes/discovery_categories_route.js
index 369156330..42d2cfc78 100644
--- a/app/assets/javascripts/discourse/routes/discovery_categories_route.js
+++ b/app/assets/javascripts/discourse/routes/discovery_categories_route.js
@@ -45,5 +45,5 @@ Discourse.DiscoveryCategoriesRoute = Discourse.Route.extend({
       }));
       this.controllerFor('editCategory').set('selectedTab', 'general');
     }
-  },
+  }
 });
diff --git a/app/assets/javascripts/discourse/routes/preferences_routes.js b/app/assets/javascripts/discourse/routes/preferences_routes.js
index 8ec049e9d..fbf0d63b2 100644
--- a/app/assets/javascripts/discourse/routes/preferences_routes.js
+++ b/app/assets/javascripts/discourse/routes/preferences_routes.js
@@ -57,7 +57,7 @@ Discourse.PreferencesRoute = Discourse.RestrictedUserRoute.extend({
 Discourse.PreferencesIndexRoute = Discourse.RestrictedUserRoute.extend({
   renderTemplate: function() {
     this.render('preferences', { into: 'user', outlet: 'userOutlet', controller: 'preferences' });
-  },
+  }
 });
 
 /**
diff --git a/app/assets/javascripts/discourse/views/composer/composer_view.js b/app/assets/javascripts/discourse/views/composer/composer_view.js
index 38259443b..ee4cb67b8 100644
--- a/app/assets/javascripts/discourse/views/composer/composer_view.js
+++ b/app/assets/javascripts/discourse/views/composer/composer_view.js
@@ -504,7 +504,7 @@ Discourse.ComposerView = Discourse.View.extend(Ember.Evented, {
     var $uploadTarget = $('#reply-control');
     $uploadTarget.fileupload('destroy');
     $uploadTarget.off();
-  },
+  }
 });
 
 // not sure if this is the right way, keeping here for now, we could use a mixin perhaps
diff --git a/app/assets/javascripts/locales/cs.js.erb b/app/assets/javascripts/locales/cs.js.erb
index a251213ee..14a5e7623 100644
--- a/app/assets/javascripts/locales/cs.js.erb
+++ b/app/assets/javascripts/locales/cs.js.erb
@@ -7,4 +7,4 @@ I18n.pluralizationRules['cs'] = function (n) {
   if (n == 1) return "one";
   if (n >= 2 && n <= 4) return "few";
   return "other";
-}
+};
diff --git a/app/assets/javascripts/locales/ru.js.erb b/app/assets/javascripts/locales/ru.js.erb
index 465531e15..9653f1882 100644
--- a/app/assets/javascripts/locales/ru.js.erb
+++ b/app/assets/javascripts/locales/ru.js.erb
@@ -7,4 +7,4 @@ I18n.pluralizationRules['ru'] = function (n) {
   if (n % 10 == 1 && n % 100 != 11) return "one";
   if (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20)) return "few";
   return "many";
-}
+};

From 86774fa5c1a5bf822b47044e8c75a06fdf18c394 Mon Sep 17 00:00:00 2001
From: riking <rikingcoding@gmail.com>
Date: Tue, 18 Mar 2014 18:23:15 -0700
Subject: [PATCH 3/8] Simplify return statements

---
 .../discourse/controllers/user_invited_controller.js     | 3 +--
 app/assets/javascripts/discourse/dialects/dialect.js     | 9 ++++-----
 app/assets/javascripts/discourse/lib/formatter.js        | 2 +-
 app/assets/javascripts/discourse/lib/mobile.js           | 2 +-
 app/assets/javascripts/discourse/lib/user_search.js      | 3 +--
 app/assets/javascripts/discourse/models/composer.js      | 8 ++------
 app/assets/javascripts/discourse/models/post.js          | 5 ++---
 app/assets/javascripts/discourse/models/topic.js         | 3 +--
 8 files changed, 13 insertions(+), 22 deletions(-)

diff --git a/app/assets/javascripts/discourse/controllers/user_invited_controller.js b/app/assets/javascripts/discourse/controllers/user_invited_controller.js
index db07e01ea..fac3c5be2 100644
--- a/app/assets/javascripts/discourse/controllers/user_invited_controller.js
+++ b/app/assets/javascripts/discourse/controllers/user_invited_controller.js
@@ -44,8 +44,7 @@ Discourse.UserInvitedController = Ember.ArrayController.extend({
     @property showSearch
   **/
   showSearch: function() {
-    if (Em.isNone(this.get('searchTerm')) && this.get('model.length') === 0) { return false; }
-    return true;
+    return !(Em.isNone(this.get('searchTerm')) && this.get('model.length') === 0);
   }.property('searchTerm', 'model.length'),
 
   /**
diff --git a/app/assets/javascripts/discourse/dialects/dialect.js b/app/assets/javascripts/discourse/dialects/dialect.js
index d3d35b645..6dfe71cfb 100644
--- a/app/assets/javascripts/discourse/dialects/dialect.js
+++ b/app/assets/javascripts/discourse/dialects/dialect.js
@@ -120,10 +120,10 @@ function parseTree(tree, path, insideCounts) {
 **/
 function invalidBoundary(args, prev) {
 
-  if (!args.wordBoundary && !args.spaceBoundary) { return; }
+  if (!args.wordBoundary && !args.spaceBoundary) { return false; }
 
   var last = prev[prev.length - 1];
-  if (typeof last !== "string") { return; }
+  if (typeof last !== "string") { return false; }
 
   if (args.wordBoundary && (last.match(/(\w|\/)$/))) { return true; }
   if (args.spaceBoundary && (!last.match(/\s$/))) { return true; }
@@ -149,10 +149,9 @@ Discourse.Dialect = {
   cook: function(text, opts) {
     if (!initialized) { initializeDialects(); }
     dialect.options = opts;
-    var tree = parser.toHTMLTree(text, 'Discourse'),
-        html = parser.renderJsonML(parseTree(tree));
+    var tree = parser.toHTMLTree(text, 'Discourse');
 
-    return html;
+    return parser.renderJsonML(parseTree(tree));
   },
 
   /**
diff --git a/app/assets/javascripts/discourse/lib/formatter.js b/app/assets/javascripts/discourse/lib/formatter.js
index 946aebc3d..337a81f8d 100644
--- a/app/assets/javascripts/discourse/lib/formatter.js
+++ b/app/assets/javascripts/discourse/lib/formatter.js
@@ -237,7 +237,7 @@ relativeAgeMediumSpan = function(distance, leaveAgo) {
 
 relativeAgeMedium = function(date, options){
   var displayDate, fiveDaysAgo, oneMinuteAgo, fullReadable, leaveAgo;
-  var wrapInSpan = options.wrapInSpan === false ? false : true;
+  var wrapInSpan = options.wrapInSpan !== false;
 
   leaveAgo = options.leaveAgo;
   var distance = Math.round((new Date() - date) / 1000);
diff --git a/app/assets/javascripts/discourse/lib/mobile.js b/app/assets/javascripts/discourse/lib/mobile.js
index c1b904970..902053b71 100644
--- a/app/assets/javascripts/discourse/lib/mobile.js
+++ b/app/assets/javascripts/discourse/lib/mobile.js
@@ -14,7 +14,7 @@ Discourse.Mobile = {
     this.mobileView = $html.hasClass('mobile-view');
 
     if (localStorage && localStorage.mobileView) {
-      var savedValue = (localStorage.mobileView === 'true' ? true : false);
+      var savedValue = (localStorage.mobileView === 'true');
       if (savedValue !== this.mobileView) {
         this.reloadPage(savedValue);
       }
diff --git a/app/assets/javascripts/discourse/lib/user_search.js b/app/assets/javascripts/discourse/lib/user_search.js
index c0a11c80f..c9756046c 100644
--- a/app/assets/javascripts/discourse/lib/user_search.js
+++ b/app/assets/javascripts/discourse/lib/user_search.js
@@ -54,8 +54,7 @@ Discourse.UserSearch = {
           users.push(u);
           results.push(u);
         }
-        if (results.length > limit) return false;
-        return true;
+        return results.length <= limit;
       });
 
       _.each(r.groups,function(g) {
diff --git a/app/assets/javascripts/discourse/models/composer.js b/app/assets/javascripts/discourse/models/composer.js
index f05797533..4416bf5c0 100644
--- a/app/assets/javascripts/discourse/models/composer.js
+++ b/app/assets/javascripts/discourse/models/composer.js
@@ -126,14 +126,10 @@ Discourse.Composer = Discourse.Model.extend({
     // reply is always required
     if (this.get('missingReplyCharacters') > 0) return true;
 
-    if (this.get('canCategorize') &&
+    return this.get('canCategorize') &&
         !Discourse.SiteSettings.allow_uncategorized_topics &&
         !this.get('categoryId') &&
-        !Discourse.User.currentProp('staff')) {
-      return true;
-    }
-
-    return false;
+        !Discourse.User.currentProp('staff');
   }.property('loading', 'canEditTitle', 'titleLength', 'targetUsernames', 'replyLength', 'categoryId', 'missingReplyCharacters'),
 
   /**
diff --git a/app/assets/javascripts/discourse/models/post.js b/app/assets/javascripts/discourse/models/post.js
index f681d1f47..a41377b15 100644
--- a/app/assets/javascripts/discourse/models/post.js
+++ b/app/assets/javascripts/discourse/models/post.js
@@ -103,11 +103,10 @@ Discourse.Post = Discourse.Model.extend({
   }.property('updated_at'),
 
   flagsAvailable: function() {
-    var post = this,
-        flags = Discourse.Site.currentProp('flagTypes').filter(function(item) {
+    var post = this;
+    return Discourse.Site.currentProp('flagTypes').filter(function(item) {
       return post.get("actionByName." + (item.get('name_key')) + ".can_act");
     });
-    return flags;
   }.property('actions_summary.@each.can_act'),
 
   actionsHistory: function() {
diff --git a/app/assets/javascripts/discourse/models/topic.js b/app/assets/javascripts/discourse/models/topic.js
index ca4858cd4..bb7b60fe6 100644
--- a/app/assets/javascripts/discourse/models/topic.js
+++ b/app/assets/javascripts/discourse/models/topic.js
@@ -168,8 +168,7 @@ Discourse.Topic = Discourse.Model.extend({
     if (!wordCount) return;
 
     // Avg for 500 words per minute when you account for skimming
-    var minutes = Math.floor(wordCount / 500.0);
-    return minutes;
+    return Math.floor(wordCount / 500.0);
   }.property('word_count'),
 
   toggleStar: function() {

From 834a721bbe18e2e062b9cb01e1cc814c010b2f24 Mon Sep 17 00:00:00 2001
From: riking <rikingcoding@gmail.com>
Date: Tue, 18 Mar 2014 18:24:36 -0700
Subject: [PATCH 4/8] Remove two noop backslashes in regexes

---
 .../discourse/components/auto_close_form_component.js           | 2 +-
 app/assets/javascripts/discourse/lib/user_search.js             | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/assets/javascripts/discourse/components/auto_close_form_component.js b/app/assets/javascripts/discourse/components/auto_close_form_component.js
index 2d8e1bbe7..b760c7109 100644
--- a/app/assets/javascripts/discourse/components/auto_close_form_component.js
+++ b/app/assets/javascripts/discourse/components/auto_close_form_component.js
@@ -8,7 +8,7 @@ Discourse.AutoCloseFormComponent = Ember.Component.extend({
 
   autoCloseChanged: function() {
     if( this.get('autoCloseTime') && this.get('autoCloseTime').length > 0 ) {
-      this.set('autoCloseTime', this.get('autoCloseTime').replace(/[^\d-\s\:]/g, '') );
+      this.set('autoCloseTime', this.get('autoCloseTime').replace(/[^:\d-\s]/g, '') );
     }
     this.set('autoCloseValid', this.isAutoCloseValid());
   }.observes('autoCloseTime'),
diff --git a/app/assets/javascripts/discourse/lib/user_search.js b/app/assets/javascripts/discourse/lib/user_search.js
index c9756046c..9bf1989c9 100644
--- a/app/assets/javascripts/discourse/lib/user_search.js
+++ b/app/assets/javascripts/discourse/lib/user_search.js
@@ -35,7 +35,7 @@ Discourse.UserSearch = {
     var promise = Ember.Deferred.create();
 
     // TODO site setting for allowed regex in username
-    if (term.match(/[^a-zA-Z0-9\_\.]/)) {
+    if (term.match(/[^a-zA-Z0-9_\.]/)) {
       promise.resolve([]);
       return promise;
     }

From 2ade638d790e259ba21b7e52bc19a29fc98c2f7d Mon Sep 17 00:00:00 2001
From: riking <rikingcoding@gmail.com>
Date: Tue, 18 Mar 2014 18:25:29 -0700
Subject: [PATCH 5/8] Remove unused variables

---
 app/assets/javascripts/discourse/lib/autocomplete.js          | 3 +--
 app/assets/javascripts/discourse/lib/caret_position.js        | 2 --
 app/assets/javascripts/discourse/lib/eyeline.js               | 4 ----
 .../javascripts/discourse/views/actions_history_view.js       | 1 +
 app/jobs/scheduled/poll_mailbox.rb                            | 2 +-
 5 files changed, 3 insertions(+), 9 deletions(-)

diff --git a/app/assets/javascripts/discourse/lib/autocomplete.js b/app/assets/javascripts/discourse/lib/autocomplete.js
index f439626b5..fdb424c0e 100644
--- a/app/assets/javascripts/discourse/lib/autocomplete.js
+++ b/app/assets/javascripts/discourse/lib/autocomplete.js
@@ -271,7 +271,7 @@ $.fn.autocomplete = function(options) {
   });
 
   return $(this).keydown(function(e) {
-    var c, caretPosition, i, initial, next, nextIsGood, prev, prevIsGood, stopFound, term, total, userToComplete;
+    var c, caretPosition, i, initial, next, prev, prevIsGood, stopFound, term, total, userToComplete;
 
     if(options.allowAny){
       // saves us wiring up a change event as well, keypress is while its pressed
@@ -298,7 +298,6 @@ $.fn.autocomplete = function(options) {
     if ((completeStart === null) && e.which === 8 && options.key) {
       c = Discourse.Utilities.caretPosition(me[0]);
       next = me[0].value[c];
-      nextIsGood = next === void 0 || /\s/.test(next);
       c -= 1;
       initial = c;
       prevIsGood = true;
diff --git a/app/assets/javascripts/discourse/lib/caret_position.js b/app/assets/javascripts/discourse/lib/caret_position.js
index 8569d3b76..c08127728 100644
--- a/app/assets/javascripts/discourse/lib/caret_position.js
+++ b/app/assets/javascripts/discourse/lib/caret_position.js
@@ -71,8 +71,6 @@ $.fn.caretPosition = function(options) {
     "line-height": important("line-height")
   });
 
-  before = void 0;
-  after = void 0;
   pos = options && (options.pos || options.pos === 0) ? options.pos : getCaret(textarea[0]);
   val = textarea.val().replace("\r", "");
   if (options && options.key) {
diff --git a/app/assets/javascripts/discourse/lib/eyeline.js b/app/assets/javascripts/discourse/lib/eyeline.js
index 54a0434f5..ded17866e 100644
--- a/app/assets/javascripts/discourse/lib/eyeline.js
+++ b/app/assets/javascripts/discourse/lib/eyeline.js
@@ -21,7 +21,6 @@ Discourse.Eyeline.prototype.update = function() {
       docViewBottom = docViewTop + windowHeight,
       $elements = $(this.selector),
       atBottom = false,
-      foundElement = false,
       bottomOffset = $elements.last().offset(),
       self = this;
 
@@ -29,9 +28,6 @@ Discourse.Eyeline.prototype.update = function() {
     atBottom = (bottomOffset.top <= docViewBottom) && (bottomOffset.top >= docViewTop);
   }
 
-  // Whether we've seen any elements in this search
-  foundElement = false;
-
   return $elements.each(function(i, elem) {
     var $elem = $(elem),
         elemTop = $elem.offset().top,
diff --git a/app/assets/javascripts/discourse/views/actions_history_view.js b/app/assets/javascripts/discourse/views/actions_history_view.js
index 61bb81c01..06ec4b6ac 100644
--- a/app/assets/javascripts/discourse/views/actions_history_view.js
+++ b/app/assets/javascripts/discourse/views/actions_history_view.js
@@ -47,6 +47,7 @@ Discourse.ActionsHistoryComponent = Em.Component.extend({
           var key = 'post.actions.people.' + c.get('actionType.name_key');
           if (postUrl) { key = key + "_with_url"; }
 
+          // TODO postUrl might be uninitialized? pick a good default
           buffer.push(" " + I18n.t(key, { icons: iconsHtml, postUrl: postUrl}) + ".");
         }
         renderActionIf('usersCollapsed', 'who-acted', c.get('description'));
diff --git a/app/jobs/scheduled/poll_mailbox.rb b/app/jobs/scheduled/poll_mailbox.rb
index 581ab2193..0b70aa932 100644
--- a/app/jobs/scheduled/poll_mailbox.rb
+++ b/app/jobs/scheduled/poll_mailbox.rb
@@ -22,7 +22,7 @@ module Jobs
       begin
         mail_string = mail.pop
         Email::Receiver.new(mail_string).process
-      rescue Email::Receiver::UserNotSufficientTrustLevelError => e
+      rescue Email::Receiver::UserNotSufficientTrustLevelError
         # inform the user about the rejection
         @message = Mail::Message.new(mail_string)
         clientMessage = RejectionMailer.send_trust_level(@message.from, @message.body)

From a871158c80bdebc17b9fea5d93b2667c925883af Mon Sep 17 00:00:00 2001
From: riking <rikingcoding@gmail.com>
Date: Tue, 18 Mar 2014 18:26:23 -0700
Subject: [PATCH 6/8] Fix some bad HTML

---
 .../discourse/templates/choose_topic.js.handlebars            | 1 +
 .../templates/components/category-drop.js.handlebars          | 4 ++--
 .../discourse/templates/composer/similar_topics.js.handlebars | 2 +-
 app/assets/javascripts/discourse/views/post_menu_view.js      | 3 ++-
 4 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/app/assets/javascripts/discourse/templates/choose_topic.js.handlebars b/app/assets/javascripts/discourse/templates/choose_topic.js.handlebars
index 9632519ea..7f9cbf879 100644
--- a/app/assets/javascripts/discourse/templates/choose_topic.js.handlebars
+++ b/app/assets/javascripts/discourse/templates/choose_topic.js.handlebars
@@ -12,6 +12,7 @@
       <div class='controls'>
         <label class='radio'>
         <input type='radio' id="choose-topic-{{unbound id}}" name='choose_topic_id' {{action chooseTopic this target="view"}}>{{title}}
+        </label>
       </div>
     {{/each}}
     </ul>
diff --git a/app/assets/javascripts/discourse/templates/components/category-drop.js.handlebars b/app/assets/javascripts/discourse/templates/components/category-drop.js.handlebars
index b9efc8495..36bba0c22 100644
--- a/app/assets/javascripts/discourse/templates/components/category-drop.js.handlebars
+++ b/app/assets/javascripts/discourse/templates/components/category-drop.js.handlebars
@@ -7,9 +7,9 @@
   </a>
 {{else}}
   {{#if noSubcategories}}
-    <a href='#' {{action expand}} class='badge-category home' {{bind-attr style="badgeStyle"}}>{{i18n categories.no_subcategory}}</i></a>
+    <a href='#' {{action expand}} class='badge-category home' {{bind-attr style="badgeStyle"}}>{{i18n categories.no_subcategory}}</a>
   {{else}}
-    <a href='#' {{action expand}} class='badge-category home' {{bind-attr style="badgeStyle"}}>{{allCategoriesLabel}}</i></a>
+    <a href='#' {{action expand}} class='badge-category home' {{bind-attr style="badgeStyle"}}>{{allCategoriesLabel}}</a>
   {{/if}}
 {{/if}}
 
diff --git a/app/assets/javascripts/discourse/templates/composer/similar_topics.js.handlebars b/app/assets/javascripts/discourse/templates/composer/similar_topics.js.handlebars
index f79ebc421..c2567e367 100644
--- a/app/assets/javascripts/discourse/templates/composer/similar_topics.js.handlebars
+++ b/app/assets/javascripts/discourse/templates/composer/similar_topics.js.handlebars
@@ -1,5 +1,5 @@
 <a href='#' {{action closeMessage this}} class='close'><i class='fa fa-times-circle'></i></a>
-<h3>{{i18n composer.similar_topics}}<h3>
+<h3>{{i18n composer.similar_topics}}</h3>
 
 <ul class='topics'>
   {{#each similarTopics}}
diff --git a/app/assets/javascripts/discourse/views/post_menu_view.js b/app/assets/javascripts/discourse/views/post_menu_view.js
index 11bd20379..d402327bb 100644
--- a/app/assets/javascripts/discourse/views/post_menu_view.js
+++ b/app/assets/javascripts/discourse/views/post_menu_view.js
@@ -207,7 +207,8 @@ Discourse.PostMenuView = Discourse.View.extend({
     }
 
     buffer.push("<button title=\"" + tooltip +
-                "\" data-action=\"bookmark\" class='bookmark'><div class='" + iconClass +
+                "\" data-action=\"bookmark\" class='" + buttonClass +
+                "'><div class='" + iconClass +
                 "'></div></button>");
   },
 

From 8136468ec75c93e23383391d0ee5ce861c858961 Mon Sep 17 00:00:00 2001
From: riking <rikingcoding@gmail.com>
Date: Tue, 18 Mar 2014 18:27:15 -0700
Subject: [PATCH 7/8] Fix inefficent jQuery usage

Some jQueries can be cached and reused. This commit does that.
---
 .../discourse/views/modal/modal_body_view.js  |  5 ++--
 .../javascripts/discourse/views/share_view.js | 25 +++++++++++--------
 2 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/app/assets/javascripts/discourse/views/modal/modal_body_view.js b/app/assets/javascripts/discourse/views/modal/modal_body_view.js
index a1d58f9fb..21c1a84c5 100644
--- a/app/assets/javascripts/discourse/views/modal/modal_body_view.js
+++ b/app/assets/javascripts/discourse/views/modal/modal_body_view.js
@@ -12,9 +12,10 @@ Discourse.ModalBodyView = Discourse.View.extend({
   didInsertElement: function() {
     var self = this;
 
-    $('#discourse-modal').modal('show');
+    var $discourseModal = $('#discourse-modal');
 
-    $('#discourse-modal').one("hide", function () {
+    $discourseModal.modal('show');
+    $discourseModal.one("hide", function () {
       self.get("controller").send("closeModal");
     });
 
diff --git a/app/assets/javascripts/discourse/views/share_view.js b/app/assets/javascripts/discourse/views/share_view.js
index 4ca94bdf0..44f07fb1f 100644
--- a/app/assets/javascripts/discourse/views/share_view.js
+++ b/app/assets/javascripts/discourse/views/share_view.js
@@ -39,8 +39,9 @@ Discourse.ShareView = Discourse.View.extend({
   }.observes('controller.link'),
 
   didInsertElement: function() {
-    var shareView = this;
-    $('html').on('mousedown.outside-share-link', function(e) {
+    var shareView = this,
+        $html = $('html');
+    $html.on('mousedown.outside-share-link', function(e) {
       // Use mousedown instead of click so this event is handled before routing occurs when a
       // link is clicked (which is a click event) while the share dialog is showing.
       if (shareView.$().has(e.target).length !== 0) { return; }
@@ -49,9 +50,10 @@ Discourse.ShareView = Discourse.View.extend({
       return true;
     });
 
-    $('html').on('click.discoure-share-link', '[data-share-url]', function(e) {
+    $html.on('click.discoure-share-link', '[data-share-url]', function(e) {
       e.preventDefault();
-      var $currentTarget = $(e.currentTarget);
+      var $currentTarget = $(e.currentTarget),
+          $shareLink = $('#share-link');
       var url = $currentTarget.data('share-url');
       var postNumber = $currentTarget.data('post-number');
       // Relative urls
@@ -60,7 +62,7 @@ Discourse.ShareView = Discourse.View.extend({
         url = window.location.protocol + "//" + window.location.host + url;
       }
 
-      var shareLinkWidth = $('#share-link').width();
+      var shareLinkWidth = $shareLink.width();
       var x = e.pageX - (shareLinkWidth / 2);
       if (x < 25) {
         x = 25;
@@ -70,12 +72,12 @@ Discourse.ShareView = Discourse.View.extend({
       }
 
       var header = $('.d-header');
-      var y = e.pageY - ($('#share-link').height() + 20);
+      var y = e.pageY - ($shareLink.height() + 20);
       if (y < header.offset().top + header.height()) {
         y = e.pageY + 10;
       }
 
-      $('#share-link').css({
+      $shareLink.css({
         left: "" + x + "px",
         top: "" + y + "px"
       });
@@ -84,7 +86,7 @@ Discourse.ShareView = Discourse.View.extend({
       return false;
     });
 
-    $('html').on('keydown.share-view', function(e){
+    $html.on('keydown.share-view', function(e){
       if (e.keyCode === 27) {
         shareView.get('controller').send('close');
       }
@@ -92,9 +94,10 @@ Discourse.ShareView = Discourse.View.extend({
   },
 
   willDestroyElement: function() {
-    $('html').off('click.discoure-share-link');
-    $('html').off('mousedown.outside-share-link');
-    $('html').off('keydown.share-view');
+    var $html = $('html');
+    $html.off('click.discoure-share-link');
+    $html.off('mousedown.outside-share-link');
+    $html.off('keydown.share-view');
   }
 
 });

From 4699136d83e52c4018abc9952b7dc1ba8a0fa102 Mon Sep 17 00:00:00 2001
From: riking <rikingcoding@gmail.com>
Date: Tue, 18 Mar 2014 18:28:04 -0700
Subject: [PATCH 8/8] Fix this/self usage warning

To clarify the intent of using 'this' inside the closure, it is first assigned to a variable.
---
 app/assets/javascripts/discourse/lib/page_tracker.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/app/assets/javascripts/discourse/lib/page_tracker.js b/app/assets/javascripts/discourse/lib/page_tracker.js
index d8a74a148..cd581ee01 100644
--- a/app/assets/javascripts/discourse/lib/page_tracker.js
+++ b/app/assets/javascripts/discourse/lib/page_tracker.js
@@ -22,7 +22,8 @@ Discourse.PageTracker = Ember.Object.extend(Ember.Evented, {
         self = this;
 
     router.on('didTransition', function() {
-      self.trigger('change', this.get('url'));
+      var router = this;
+      self.trigger('change', router.get('url'));
     });
     this.set('started', true);
   }