home *** CD-ROM | disk | FTP | other *** search
/ Cricao de Sites - 650 Layouts Prontos / WebMasters.iso / CMS / drupal-6.0.exe / drupal-6.0 / modules / user / user.js < prev    next >
Encoding:
JavaScript  |  2007-09-12  |  6.9 KB  |  189 lines

  1. // $Id: user.js,v 1.6 2007/09/12 18:29:32 goba Exp $
  2.  
  3. /**
  4.  * Attach handlers to evaluate the strength of any password fields and to check
  5.  * that its confirmation is correct.
  6.  */
  7. Drupal.behaviors.password = function(context) {
  8.   var translate = Drupal.settings.password;
  9.   $("input.password-field:not(.password-processed)", context).each(function() {
  10.     var passwordInput = $(this).addClass('password-processed');
  11.     var parent = $(this).parent();
  12.     // Wait this number of milliseconds before checking password.
  13.     var monitorDelay = 700;
  14.  
  15.     // Add the password strength layers.
  16.     $(this).after('<span class="password-strength"><span class="password-title">'+ translate.strengthTitle +'</span> <span class="password-result"></span></span>').parent();
  17.     var passwordStrength = $("span.password-strength", parent);
  18.     var passwordResult = $("span.password-result", passwordStrength);
  19.     parent.addClass("password-parent");
  20.  
  21.     // Add the password confirmation layer.
  22.     var outerItem  = $(this).parent().parent();
  23.     $("input.password-confirm", outerItem).after('<span class="password-confirm">'+ translate["confirmTitle"] +' <span></span></span>').parent().addClass("confirm-parent");
  24.     var confirmInput = $("input.password-confirm", outerItem);
  25.     var confirmResult = $("span.password-confirm", outerItem);
  26.     var confirmChild = $("span", confirmResult);
  27.  
  28.     // Add the description box at the end.
  29.     $(confirmInput).parent().after('<div class="password-description"></div>');
  30.     var passwordDescription = $("div.password-description", $(this).parent().parent()).hide();
  31.  
  32.     // Check the password fields.
  33.     var passwordCheck = function () {
  34.       // Remove timers for a delayed check if they exist.
  35.       if (this.timer) {
  36.         clearTimeout(this.timer);
  37.       }
  38.  
  39.       // Verify that there is a password to check.
  40.       if (!passwordInput.val()) {
  41.         passwordStrength.css({ visibility: "hidden" });
  42.         passwordDescription.hide();
  43.         return;
  44.       }
  45.  
  46.       // Evaluate password strength.
  47.  
  48.       var result = Drupal.evaluatePasswordStrength(passwordInput.val());
  49.       passwordResult.html(result.strength == "" ? "" : translate[result.strength +"Strength"]);
  50.  
  51.       // Map the password strength to the relevant drupal CSS class.
  52.       var classMap = { low: "error", medium: "warning", high: "ok" };
  53.       var newClass = classMap[result.strength] || "";
  54.  
  55.       // Remove the previous styling if any exists; add the new class.
  56.       if (this.passwordClass) {
  57.         passwordResult.removeClass(this.passwordClass);
  58.         passwordDescription.removeClass(this.passwordClass);
  59.       }
  60.       passwordDescription.html(result.message);
  61.       passwordResult.addClass(newClass);
  62.       if (result.strength == "high") {
  63.         passwordDescription.hide();
  64.       }
  65.       else {
  66.         passwordDescription.addClass(newClass);
  67.       }
  68.       this.passwordClass = newClass;
  69.  
  70.       // Check that password and confirmation match.
  71.  
  72.       // Hide the result layer if confirmation is empty, otherwise show the layer.
  73.       confirmResult.css({ visibility: (confirmInput.val() == "" ? "hidden" : "visible") });
  74.  
  75.       var success = passwordInput.val() == confirmInput.val();
  76.  
  77.       // Remove the previous styling if any exists.
  78.       if (this.confirmClass) {
  79.         confirmChild.removeClass(this.confirmClass);
  80.       }
  81.  
  82.       // Fill in the correct message and set the class accordingly.
  83.       var confirmClass = success ? "ok" : "error";
  84.       confirmChild.html(translate["confirm"+ (success ? "Success" : "Failure")]).addClass(confirmClass);
  85.       this.confirmClass = confirmClass;
  86.  
  87.       // Show the indicator and tips.
  88.       passwordStrength.css({ visibility: "visible" });
  89.       passwordDescription.show();
  90.     };
  91.  
  92.     // Do a delayed check on the password fields.
  93.     var passwordDelayedCheck = function() {
  94.       // Postpone the check since the user is most likely still typing.
  95.       if (this.timer) {
  96.         clearTimeout(this.timer);
  97.       }
  98.  
  99.       // When the user clears the field, hide the tips immediately.
  100.       if (!passwordInput.val()) {
  101.         passwordStrength.css({ visibility: "hidden" });
  102.         passwordDescription.hide();
  103.         return;
  104.       }
  105.  
  106.       // Schedule the actual check.
  107.       this.timer = setTimeout(passwordCheck, monitorDelay);
  108.     };
  109.     // Monitor keyup and blur events.
  110.     // Blur must be used because a mouse paste does not trigger keyup.
  111.     passwordInput.keyup(passwordDelayedCheck).blur(passwordCheck);
  112.     confirmInput.keyup(passwordDelayedCheck).blur(passwordCheck);
  113.   });
  114. };
  115.  
  116. /**
  117.  * Evaluate the strength of a user's password.
  118.  *
  119.  * Returns the estimated strength and the relevant output message.
  120.  */
  121. Drupal.evaluatePasswordStrength = function(value) {
  122.   var strength = "", msg = "", translate = Drupal.settings.password;
  123.  
  124.   var hasLetters = value.match(/[a-zA-Z]+/);
  125.   var hasNumbers = value.match(/[0-9]+/);
  126.   var hasPunctuation = value.match(/[^a-zA-Z0-9]+/);
  127.   var hasCasing = value.match(/[a-z]+.*[A-Z]+|[A-Z]+.*[a-z]+/);
  128.  
  129.   // Check if the password is blank.
  130.   if (!value.length) {
  131.     strength = "";
  132.     msg = "";
  133.   }
  134.   // Check if length is less than 6 characters.
  135.   else if (value.length < 6) {
  136.     strength = "low";
  137.     msg = translate.tooShort;
  138.   }
  139.   // Check if password is the same as the username (convert both to lowercase).
  140.   else if (value.toLowerCase() == translate.username.toLowerCase()) {
  141.     strength  = "low";
  142.     msg = translate.sameAsUsername;
  143.   }
  144.   // Check if it contains letters, numbers, punctuation, and upper/lower case.
  145.   else if (hasLetters && hasNumbers && hasPunctuation && hasCasing) {
  146.     strength = "high";
  147.   }
  148.   // Password is not secure enough so construct the medium-strength message.
  149.   else {
  150.     // Extremely bad passwords still count as low.
  151.     var count = (hasLetters ? 1 : 0) + (hasNumbers ? 1 : 0) + (hasPunctuation ? 1 : 0) + (hasCasing ? 1 : 0);
  152.     strength = count > 1 ? "medium" : "low";
  153.  
  154.     msg = [];
  155.     if (!hasLetters || !hasCasing) {
  156.       msg.push(translate.addLetters);
  157.     }
  158.     if (!hasNumbers) {
  159.       msg.push(translate.addNumbers);
  160.     }
  161.     if (!hasPunctuation) {
  162.       msg.push(translate.addPunctuation);
  163.     }
  164.     msg = translate.needsMoreVariation +"<ul><li>"+ msg.join("</li><li>") +"</li></ul>";
  165.   }
  166.  
  167.   return { strength: strength, message: msg };
  168. };
  169.  
  170. /**
  171.  * Set the client's system timezone as default values of form fields.
  172.  */
  173. Drupal.setDefaultTimezone = function() {
  174.   var offset = new Date().getTimezoneOffset() * -60;
  175.   $("#edit-date-default-timezone, #edit-user-register-timezone").val(offset);
  176. };
  177.  
  178. /**
  179.  * On the admin/user/settings page, conditionally show all of the
  180.  * picture-related form elements depending on the current value of the
  181.  * "Picture support" radio buttons.
  182.  */
  183. Drupal.behaviors.userSettings = function (context) {
  184.   $('div.user-admin-picture-radios input[type=radio]:not(.userSettings-processed)', context).addClass('userSettings-processed').click(function () {
  185.     $('div.user-admin-picture-settings', context)[['hide', 'show'][this.value]]();
  186.   });
  187. };
  188.  
  189.