/*

 * Password strength

 */

"use strict";

var UapPasswordStrength = {

  colors: ['#F00', '#F90', '#FF0', '#9F0', '#0F0'],

  labels: [],



  init: function(args){

    var obj = this;

    obj.setAttributes(obj, args);



    if ( typeof window.uapPasswordStrengthLabels === 'string' ){

        obj.labels = JSON.parse(window.uapPasswordStrengthLabels);

    } else {

        obj.labels = window.uapPasswordStrengthLabels;

    }


window.addEventListener( 'DOMContentLoaded', function(){

        jQuery(document).on('keyup', jQuery('[name=pass1]'), function (evt) {

            obj.handleTypePassword(obj, evt);

        })

        jQuery(document).on('keyup', jQuery('[name=pass2]'), function (evt) {

            obj.handleTypePassword(obj, evt);

        })

    })

  },



  setAttributes: function(obj, args){

      for ( var key in args ) {

        obj[key] = args[key];

      }

  },



  handleTypePassword: function(obj, evt){

      var rules = jQuery(evt.target).attr('data-rules');

      if ( !rules ){

         return;

      }

      rules = rules.split(',');

      var strength = obj.mesureStrength(evt.target.value, rules);

      var color = obj.getColor(strength);

      var ul = jQuery(evt.target).parent().find('ul');

      ul.children('li').css({ "background": "#DDD" }).slice(0, color.idx).css({ "background": color.col });



      var newLabel = obj.labels[0];

      if (strength>10 && strength<21){

          newLabel = obj.labels[1];

      } else if (strength>20 && strength<31){

          newLabel = obj.labels[2];

      } else if (strength>30){

          newLabel = obj.labels[3];

      }

      jQuery(evt.target).parent().find('.uap-strength-label').html(newLabel);



  },



  mesureStrength: function (p, rules) {



      var _force = 0;

      var _regex = /[$-/:-?{-~!"^_`\[\]]/g;



      var _letters = /[a-zA-Z]+/.test(p);

      var _lowerLetters = /[a-z]+/.test(p);

      var _upperLetters = /[A-Z]+/.test(p);

      var _numbers = /[0-9]+/.test(p);

      var _symbols = _regex.test(p);



      if (p.length<rules[0]){

          return 0;

      }

      if (rules[1]==2 && (!_numbers || !_letters )){

          return 0;

      } else if (rules[1]==3 && (!_numbers || !_letters || !_upperLetters)){

          return 0;

      }



      var _flags = [_lowerLetters, _upperLetters, _numbers, _symbols];

      var _passedMatches = jQuery.grep(_flags, function (el) { return el === true; }).length;



      _force += 2 * p.length + ((p.length >= 10) ? 1 : 0);

      _force += _passedMatches * 10;



      // penality (short password)

      _force = (p.length <= 6) ? Math.min(_force, 10) : _force;



      // penality (poor variety of characters)

      _force = (_passedMatches == 1) ? Math.min(_force, 10) : _force;

      _force = (_passedMatches == 2) ? Math.min(_force, 20) : _force;

      _force = (_passedMatches == 3) ? Math.min(_force, 40) : _force;

      return _force;

  },



  getColor: function (s) {

      var idx = 0;

      if (s <= 10) { idx = 0; }

      else if (s <= 20) { idx = 1; }

      else if (s <= 30) { idx = 2; }

      else if (s <= 40) { idx = 3; }

      else { idx = 4; }

      return { idx: idx + 1, col: this.colors[idx] };

  }



}

UapPasswordStrength.init({});

