15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cr.define('options.accounts', function() {
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Email alias only, assuming it's a gmail address.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *   e.g. 'john'
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *        {name: 'john', email: 'john@gmail.com'}
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @const
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var format1String =
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '^\\s*([\\w\\.!#\\$%&\'\\*\\+-\\/=\\?\\^`\\{\\|\\}~]+)\\s*$';
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Email address only.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *   e.g. 'john@chromium.org'
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *        {name: 'john', email: 'john@chromium.org'}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @const
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var format2String =
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '^\\s*([\\w\\.!#\\$%&\'\\*\\+-\\/=\\?\\^`\\{\\|\\}~]+)@' +
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '([A-Za-z0-9\-]{2,63}\\..+)\\s*$';
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Full format.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *   e.g. '"John Doe" <john@chromium.org>'
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *        {name: 'John doe', email: 'john@chromium.org'}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @const
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var format3String =
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '^\\s*"{0,1}([^"]+)"{0,1}\\s*' +
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '<([\\w\\.!#\\$%&\'\\*\\+-\\/=\\?\\^`\\{\\|\\}~]+@' +
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '[A-Za-z0-9\-]{2,63}\\..+)>\\s*$';
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Creates a new user name edit element.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {Object=} opt_propertyBag Optional properties.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @constructor
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @extends {HTMLInputElement}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var UserNameEdit = cr.ui.define('input');
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserNameEdit.prototype = {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __proto__: HTMLInputElement.prototype,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Called when an element is decorated as a user name edit.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decorate: function() {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pattern = format1String + '|' + format2String + '|' +
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     format3String;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      this.onkeydown = this.handleKeyDown_.bind(this);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Parses given str for user info.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Note that the email parsing is based on RFC 5322 and does not support
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * IMA (Internationalized Email Address). We take only the following chars
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * as valid for an email alias (aka local-part):
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   - Letters: a–z, A–Z
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   - Digits: 0-9
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   - Characters: ! # $ % & ' * + - / = ? ^ _ ` { | } ~
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   - Dot: . (Note that we did not cover the cases that dot should not
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *       appear as first or last character and should not appear two or
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *       more times in a row.)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {string} str A string to parse.
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @return {?{name: string, email: string}} User info parsed from the
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *     string.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parse: function(str) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /** @const */ var format1 = new RegExp(format1String);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /** @const */ var format2 = new RegExp(format2String);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /** @const */ var format3 = new RegExp(format3String);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var matches = format1.exec(str);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (matches) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          name: matches[1],
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          email: matches[1] + '@gmail.com'
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        };
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      matches = format2.exec(str);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (matches) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          name: matches[1],
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          email: matches[1] + '@' + matches[2]
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        };
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      matches = format3.exec(str);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (matches) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          name: matches[1],
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          email: matches[2]
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        };
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return null;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * Handler for key down event.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @private
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @param {Event} e The keydown event object.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    handleKeyDown_: function(e) {
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (e.keyIdentifier == 'Enter') {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var user = this.parse(this.value);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (user) {
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          var event = new Event('add');
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          event.user = user;
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          this.dispatchEvent(event);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.select();
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        // Avoid double-handling so the dialog doesn't close.
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        e.stopPropagation();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UserNameEdit: UserNameEdit
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130