From 2c682f0b7793b0927164bace714aaa5a1f00f9f8 Mon Sep 17 00:00:00 2001
From: Shane Tomlinson <stomlinson@mozilla.com>
Date: Thu, 23 Aug 2012 11:54:47 +0100
Subject: [PATCH] Replace all the jQuery calls with dom.* calls.

* to dom-jquery, add closest and insertAfter
---
 resources/static/common/js/lib/dom-jquery.js | 21 +++++
 resources/static/pages/js/manage_account.js  | 88 ++++++++++----------
 2 files changed, 66 insertions(+), 43 deletions(-)

diff --git a/resources/static/common/js/lib/dom-jquery.js b/resources/static/common/js/lib/dom-jquery.js
index 78ab5814c..cfbeef859 100644
--- a/resources/static/common/js/lib/dom-jquery.js
+++ b/resources/static/common/js/lib/dom-jquery.js
@@ -69,6 +69,17 @@ BrowserID.DOM = ( function() {
             return jQuery( selector ).children()[ index ];
         },
 
+        /**
+        * Find the closest ancestor that matches the selector
+        * @method closest
+        * @param {selector || element} selector - element to get children for
+        * @param {selector || element} searchFrom - element to search from
+        * @return {array} The closest ancestor matching the selector
+        */
+        closest: function( selector, searchFrom ) {
+          return jQuery( searchFrom ).closest( selector );
+        },
+
         /**
         * Iterate over a set of elements
         * @method forEach
@@ -260,6 +271,16 @@ BrowserID.DOM = ( function() {
             return el;
         },
 
+        /**
+        * Insert an element after another element
+        * @method insertAfter
+        * @param {selector || element} elementToInsert
+        * @param {selector || element} elementToInsertBefore
+        */
+        insertAfter: function( elementToInsert, elementToInsertAfter ) {
+          jQuery( elementToInsertAfter ).after( elementToInsert );
+        },
+
         /**
         * Insert an element before another element
         * @method insertBefore
diff --git a/resources/static/pages/js/manage_account.js b/resources/static/pages/js/manage_account.js
index 724016d26..119febf71 100644
--- a/resources/static/pages/js/manage_account.js
+++ b/resources/static/pages/js/manage_account.js
@@ -17,79 +17,83 @@ BrowserID.manageAccount = (function() {
       pageHelpers = bid.PageHelpers,
       cancelEvent = pageHelpers.cancelEvent,
       confirmAction = confirm,
+      complete = helpers.complete,
       doc = document,
       tooltip = bid.Tooltip,
       authLevel;
 
   function syncAndDisplayEmails(oncomplete) {
+    var self=this;
     user.syncEmails(function() {
-      displayStoredEmails(oncomplete);
+      displayStoredEmails.call(self, oncomplete);
     }, pageHelpers.getFailure(errors.syncEmails, oncomplete));
   }
 
   function displayStoredEmails(oncomplete) {
     var emails = user.getSortedEmailKeypairs();
     if (_.isEmpty(emails)) {
-      $("#content").hide();
+      dom.hide("#content");
     } else {
-      $("#content").show();
-      $("#vAlign").hide();
-      displayEmails(emails);
+      dom.show("#content");
+      dom.hide("#vAlign");
+      renderEmails.call(this, emails);
     }
-    oncomplete && oncomplete();
+    complete(oncomplete);
   }
 
   function removeEmail(email, oncomplete) {
-    function complete() {
-      oncomplete && oncomplete();
-    }
-
+    var self=this;
     user.syncEmails(function() {
       var emails = user.getStoredEmailKeypairs();
       if (!emails[email]) {
-        displayStoredEmails(oncomplete);
+        displayStoredEmails.call(self, oncomplete);
       }
       else if (_.size(emails) > 1) {
         if (confirmAction(format(gettext("Remove %(email) from your Persona account?"),
                                  { email: email }))) {
           user.removeEmail(email, function() {
-            displayStoredEmails(oncomplete);
+            displayStoredEmails.call(self, oncomplete);
           }, pageHelpers.getFailure(errors.removeEmail, oncomplete));
         }
         else {
-          complete();
+          complete(oncomplete);
         }
       }
       else {
         if (confirmAction(gettext("Removing the last address will cancel your Persona account.\nAre you sure you want to continue?"))) {
           user.cancelUser(function() {
             doc.location="/";
-            complete();
+            complete(oncomplete);
           }, pageHelpers.getFailure(errors.cancelUser, oncomplete));
         }
         else {
-          complete();
+          complete(oncomplete);
         }
       }
     }, pageHelpers.getFailure(errors.syncEmails, oncomplete));
   }
 
-  function displayEmails(emails) {
-    var list = $("#emailList").empty();
+  function renderEmails(emails) {
+    var self=this,
+        list = dom.getElements("#emailList");
+
+    dom.setInner(list, "");
 
     // Set up to use mustache style templating, the normal Django style blows
     // up the node templates
     _.templateSettings = {
         interpolate : /\{\{(.+?)\}\}/g
     };
-    var template = $("#templateUser").html();
+    var template = dom.getInner("#templateUser");
 
     _(emails).each(function(item) {
       var e = item.address,
           identity = _.template(template, { email: e });
 
-      var idEl = $(identity).appendTo(list);
-      idEl.find(".delete").click(cancelEvent(removeEmail.bind(null, e)));
+      var idEl = dom.appendTo(identity, list),
+          deleteButton = dom.getDescendentElements(".delete", idEl);
+
+      self.click(deleteButton, removeEmail.curry(e));
     });
   }
 
@@ -97,30 +101,25 @@ BrowserID.manageAccount = (function() {
     if (confirmAction(gettext("Are you sure you want to cancel your Persona account?"))) {
       user.cancelUser(function() {
         doc.location="/";
-        oncomplete && oncomplete();
+        complete(oncomplete);
       }, pageHelpers.getFailure(errors.cancelUser, oncomplete));
     }
   }
 
   function startEdit(event) {
-    // XXX add some helpers in the dom library to find section.
     event.preventDefault();
-    $(event.target).closest("section").addClass("edit");
+    dom.addClass(dom.closest("section", event.target), "edit");
   }
 
   function cancelEdit(event) {
     event.preventDefault();
-    $(event.target).closest("section").removeClass("edit");
+    dom.removeClass(dom.closest("section", event.target), "edit");
   }
 
-  function changePassword(oncomplete) {
+  function submit(oncomplete) {
     var oldPassword = dom.getInner("#old_password"),
         newPassword = dom.getInner("#new_password");
 
-    function complete(status) {
-      typeof oncomplete == "function" && oncomplete(status);
-    }
-
     function changePassword() {
       user.changePassword(oldPassword, newPassword, function(status) {
         if(status) {
@@ -132,32 +131,32 @@ BrowserID.manageAccount = (function() {
           tooltip.showTooltip("#tooltipInvalidPassword");
         }
 
-        complete(status);
+        complete(oncomplete, status);
       }, pageHelpers.getFailure(errors.updatePassword, oncomplete));
     }
 
     if(!oldPassword) {
       tooltip.showTooltip("#tooltipOldRequired");
-      complete(false);
+      complete(oncomplete, false);
     }
     else if(oldPassword.length < bid.PASSWORD_MIN_LENGTH || bid.PASSWORD_MAX_LENGTH < oldPassword.length) {
       // If the old password is out of range, we know it is invalid. Show the
       // tooltip. See issue #2121
       // - https://github.com/mozilla/browserid/issues/2121
       tooltip.showTooltip("#tooltipInvalidPassword");
-      complete(false);
+      complete(oncomplete, false);
     }
     else if(!newPassword) {
       tooltip.showTooltip("#tooltipNewRequired");
-      complete(false);
+      complete(oncomplete, false);
     }
     else if(newPassword === oldPassword) {
       tooltip.showTooltip("#tooltipPasswordsSame");
-      complete(false);
+      complete(oncomplete, false);
     }
     else if(newPassword.length < bid.PASSWORD_MIN_LENGTH || bid.PASSWORD_MAX_LENGTH < newPassword.length) {
       tooltip.showTooltip("#tooltipPasswordLength");
-      complete(false);
+      complete(oncomplete, false);
     }
     else if(authLevel !== "password") {
       var email = getSecondary();
@@ -170,7 +169,7 @@ BrowserID.manageAccount = (function() {
         }
         else {
           tooltip.showTooltip("#tooltipInvalidPassword");
-          complete(false);
+          complete(oncomplete, false);
         }
       }, pageHelpers.getFailure(errors.authenticate, oncomplete));
     }
@@ -190,7 +189,7 @@ BrowserID.manageAccount = (function() {
   function displayChangePassword(oncomplete) {
     var canSetPassword = !!getSecondary();
     dom[canSetPassword ? "addClass" : "removeClass"]("body", "canSetPassword");
-    oncomplete && oncomplete();
+    complete(oncomplete);
   }
 
   function getSecondary() {
@@ -212,32 +211,35 @@ BrowserID.manageAccount = (function() {
 
       var self=this,
           oncomplete = options.ready,
-          template = new EJS({ text: $("#templateManage").html() }),
+          template = new EJS({ text: dom.getInner("#templateManage") }),
           manage = template.render({});
 
-      $("#hAlign").after(manage);
+      dom.insertAfter(manage, "#hAlign");
 
       self.click("#cancelAccount", cancelAccount);
 
       self.bind("button.edit", "click", startEdit);
       self.bind("button.done", "click", cancelEdit);
-      self.bind("#edit_password_form", "submit", cancelEvent(changePassword));
 
       user.checkAuthentication(function(auth_level) {
         authLevel = auth_level;
 
-        syncAndDisplayEmails(function() {
+        syncAndDisplayEmails.call(self, function() {
           displayHelpTextToNewUser();
           displayChangePassword(oncomplete);
         });
       }, pageHelpers.getFailure(errors.checkAuthentication, oncomplete));
-    }
+
+      Module.sc.start.call(self, options);
+    },
+
+    submit: submit
 
     // BEGIN TESTING API
     ,
     cancelAccount: cancelAccount,
     removeEmail: removeEmail,
-    changePassword: changePassword
+    changePassword: submit
     // END TESTING API
   });
 
-- 
GitLab