/** *
 * Password strength meter
 * Virgo Media, Inc.
 * http://www.virgomedia.com
*/

/*
	Password Strength Algorithm:
	
	1. Reward shiftKeyBonus points for using SHIFT KEY 
	 (charPoints['symbol'], charPoints['upper'])
	 - for lengths >= 6 and 10

	2. Sum charPoints values for using
 	 - numeric characters
 	 - special charactes
 	 - upper case
	 - lower case
	 - eg. lower + numeric = 4
	
	3. Multiply password length by lengthPoint per character
	 - eg, 5 x 1.25 = 6.25
	
	4. Multiply sumCharPoints x lengthPoints
*/

var strSuggest="";
var strScore="";
var shiftKeyBonus = .5;
var	lengthPoint = 1.25;
var lengthPoints;
var sumCharPoints;
var sumScore;
var minimumScore = 52;

// Score password based on above logic
function scorePassword(strPassword){
	var len = strPassword.length;
	var charPoints = new Array();
		charPoints['numeric']	= 1;
		charPoints['symbol']	= 2;
		charPoints['lower']		= 3;
		charPoints['upper']		= 3;	
	
	var addUpper =0;
	var addLower =0;
	var addNumeric =0;
	var addSymbol =0;
	var hasSpace = /[ ]/.test(strPassword);	
	var hasUpper = /[A-Z]/.test(strPassword);
	var hasLower = /[a-z]/.test(strPassword);
	var hasNumeric = /[0-9]/.test(strPassword); 
	var hasSymbol =  /[!@#$%^&*?_~()+=]/.test(strPassword); 
	var disallowed = /[\\\/;<>\[\]]/.test(strPassword);
	var base;	

	sumScore = 0;
	strScore= "";
	strSuggest="<strong>Password Should Contain:</strong> <br />";

	lengthPoints =  ( len * lengthPoint);	

	/* Deduct points for repetitive, easy keystrokes */
	if(len > 2){
		if((strPassword.charAt(1) == strPassword.charAt(2)) || (strPassword.charAt(0) == strPassword.charAt(2))){
			lengthPoint = .9;	
		}
		if((strPassword.charAt(1) == strPassword.charAt(2)) && (strPassword.charAt(0) == strPassword.charAt(2))){
			lengthPoint = .5;	
		}

		if(strPassword.substring(0,3) == "asd"){
			lengthPoint = 1;
		}
	}

	if(len < 6){
		strSuggest= strSuggest + " - At least 6 characters <br />";
	}else{
		charPoints['upper']		+=  shiftKeyBonus;
		charPoints['symbol']	+=	shiftKeyBonus;		
	}
	
	if(len >=10){
		charPoints['upper']		+=  shiftKeyBonus;
		charPoints['symbol']	+=	shiftKeyBonus;		
	}
	
	// Disallow Spaces
	if(hasSpace){
		alert("Sorry, spaces are not allowed");
		var pf = document.getElementById("new_password");
		pf.value="";
		return false;
	}
	if(disallowed){
		alert("Sorry, these characters are illegal: \\\/;<>\[\]");
		var pf = document.getElementById("new_password");
		pf.value="";
		return false;

	}
	if(hasUpper){
		addUpper = charPoints['upper'];
	}else{
		strSuggest= strSuggest + " - Uppercase letters <br />";
	}
	if(hasLower){
		addLower = charPoints['lower'];
	}else{
		strSuggest= strSuggest + " - Lowercase letters<br />";
	}
	if(hasNumeric){
		addNumeric = charPoints['numeric'];
	}else{
		strSuggest= strSuggest + " - Numbers<br />";
	}
	if(hasSymbol){
		addSymbol = charPoints['symbol'];
	}else{
		strSuggest= strSuggest + " - Special characters: !@#$%^&*?_~()+= <br />";
	}

	base = (addUpper + addLower + addNumeric + addSymbol);
	sumScore = (base * lengthPoints);
	if(sumScore <= 1){
		sumScore = 1;
	}

	if(sumScore >= 100){
		sumScore = 100;
	}

	if(sumScore > 60){
//		alert(base +", "+ addUpper +", "+ addLower +", "+ addNumeric +", "+ addSymbol);	
	}

	return Math.floor(sumScore);
}
 
function checkPassword(strPassword, strFieldID){
var strColor;
var strScore 	= "";
var score 		= scorePassword(strPassword);
var scoreIndex 	= Math.ceil(score / 10);
if(scoreIndex >=9){
	scoreIndex =9;
}
var statusColor = "#000";

var ctlText = document.getElementById(strFieldID + "_text");

if (!ctlText)
return;

if(strPassword.length <6){
	ctlText.innerHTML = '<strong style="color:red">This password is too short.</strong>';		
	return;
}
    	
var StatusReturn = new Array();
StatusReturn[0] = new Array();
	StatusReturn[0]['strText'] = "too weak";
	StatusReturn[0]['color'] = "#000";

	StatusReturn[1] = new Array();
		StatusReturn[1]['strText'] = "too weak";
		StatusReturn[1]['color'] = "#660000";
	StatusReturn[2] = new Array();
		StatusReturn[2]['strText'] = "very weak";
		StatusReturn[2]['color'] = "#990000";	
	StatusReturn[3] = new Array();
		StatusReturn[3]['strText'] = "still weak";
		StatusReturn[3]['color'] = "#990000";	
	StatusReturn[4] = new Array();
		StatusReturn[4]['strText'] = "getting warmer";
		StatusReturn[4]['color'] = "#FF6600";	
	StatusReturn[5] = new Array();
		StatusReturn[5]['strText'] = "medium";
		StatusReturn[5]['color'] = "#003399";	
	StatusReturn[6] = new Array();
		StatusReturn[6]['strText'] = "medium";
		StatusReturn[6]['color'] = "#003366";	
	StatusReturn[7] = new Array();
		StatusReturn[7]['strText'] = "strong";
		StatusReturn[7]['color'] = "#00ff00";
	StatusReturn[8] = new Array();
		StatusReturn[8]['strText'] = "stronger";
		StatusReturn[8]['color'] = "#009900";	
	StatusReturn[9] = new Array();
		StatusReturn[9]['strText'] = "very strong";
		StatusReturn[9]['color'] = "#006600";	

	strColor =  StatusReturn[scoreIndex]['color'];
	strScore =  "This password is " + StatusReturn[scoreIndex]['strText'];

	if(score >1){
		ctlText.innerHTML = '<strong style="color:'+strColor+'">' +strScore + '</strong>';		
	}
//	alert( ctlText.innerHTML + "\n" + strScore);
}
 
function passSecurity(){
	if(sumScore >= minimumScore){
		return true;
	}else{
		alert("Your password needs to be stronger to continue.");
		return false;
	}
}
 
 
 
 
 



