	YAHOO.namespace('Infinite');

	YAHOO.Infinite.PasswordStrength = function (formEl, feedbackEl) {
		this.formEl = YAHOO.util.Dom.get(formEl);
		YAHOO.util.Event.addListener(this.formEl, 'keyup', this.handleKeyUp, null, this);

		if (YAHOO.lang.isUndefined(feedbackEl))
		{
			// At this time, the assumption is that if feedbackEl isnt provided,
			// that the script should search for an ancestor element with the
			// class name of 'formElement'  the formEl that has been provided.
			parentEl = YAHOO.util.Dom.getAncestorByClassName(formEl, 'formElement');
			this.feedbackEl = document.createElement("div");
			this.feedbackEl.id = "feedbackEl";
			//parentEl.appendChild(this.feedbackEl);
			YAHOO.util.Dom.insertAfter(this.feedbackEl, parentEl.firstChild);
		}
		else
		{
			this.feedbackEl = YAHOO.util.Dom.get(feedback);
		}

		this.handleKeyUp();
	}

	YAHOO.Infinite.PasswordStrength.prototype = {
		formEl: null,
		feedbackEl: null,
		currentStrength: 0,
		maximumStrength: 10,

		getPasswordStrength: function (password) {
			// initial score based on password length
			score = password.length / 2;

			// a weak password
			if (password.length == 1) return 1;
			if (password.length < 5) return Math.round(score);

			// bonus if password contains numbers
			if (/\d/.test(password)) score += 3;

			 // bonus if password contains bother upper and lower chars
			if (/[A-Z]/.test(password) && /[a-z]/.test(password)) score += 2;

			// if it contains non a-zA-Z0-9 its a special character
			if (/[^A-Za-z0-9 \.]/.test(password)) score += 3;

			// max of 10
			if (score > this.maximumStrength) score = this.maximumStrength;

			return Math.round(score);
		},

		handleKeyUp: function(e) {
			YAHOO.util.Dom.removeClass(this.feedbackEl, 'strength' + this.currentStrength);

			this.currentStrength = this.getPasswordStrength(this.formEl.value);
			YAHOO.util.Dom.addClass(this.feedbackEl, 'strength' + this.currentStrength);
			this.feedbackEl.innerHTML = this.getStrengthWord(this.currentStrength);

			if (this.currentStrength > 0)
			{
				YAHOO.util.Dom.addClass(this.formEl, 'nonempty');
			}
			else
			{
				YAHOO.util.Dom.removeClass(this.formEl, 'nonempty');
			}
		},

		getStrengthWord: function(strength) {
			switch (strength) {
				case 0: //Very Weak
					return 'Empty!';
					break;
				case 1:
				case 2:
					return 'Very Weak';
					break;
				case 3: //Weak
				case 4:
					return 'Weak';
					break;
				case 5: //Medium
				case 6:
					return 'Medium';
					break;
				case 7: //Good
				case 8:
					return 'Good';
					break;
				case 9: //Great
				case 10:
					return 'Great';
					break;
			}
		}
	}

