/*Works with required.js*/
/* msg should be declared on page*/


//Changed password requirements
//var PASSWORDREGEXP = /^[a-zA-Z0-9-\.\_\#\@]{6,10}$/;
var PASSWORDREGEXP = /(?=.*[\d])(?=.*[A-Z])(?=.*[a-z])^[\w\d!@#_.]{8,35}$/;

//PASSWORD
$(document).ready( function() {
	
	//ADVANCED
	$("input.password_adv").passStrength({
		shortPass: 		"top_shortPass",
		badPass:		"top_badPass",
		goodPass:		"top_goodPass",
		strongPass:		"top_strongPass",
		baseStyle:		"top_testresult",
		userid:			"#user_id_adv",
		messageloc:		0
	});
});
	
(function($){ 
$.fn.shortPass = 'Too short';
$.fn.badPass = 'Weak';
$.fn.goodPass = 'Good';
$.fn.strongPass = 'Strong';
//$.fn.samePassword = 'Identical Username and Password.';
//$.fn.exactPassword = 'Password cannot be passord.';
//$.fn.minAllowed = 'Minimum length is 8 characters.';
$.fn.resultStyle = "";

$.fn.passStrength = function(options) {  

var defaults = {
	shortPass: 		"shortPass",	//optional
	badPass:		"badPass",		//optional
	goodPass:		"goodPass",		//optional
	strongPass:		"strongPass",	//optional
	baseStyle:		"testresult",	//optional
	userid:			"",				//required override
	messageloc:		1				//before == 0 or after == 1
}; 
	var opts = $.extend(defaults, options);  
  
	return this.each(function() { 
		 var obj = $(this);
		
		$(obj).unbind().keyup(function()
		{
		
		var results = $.fn.teststrength($(this).val(),$(opts.userid).val(),opts);
	
		if(opts.messageloc === 1)
		{
			/*
			$(this).next("." + opts.baseStyle).remove();
			$(this).after("<span class=\""+opts.baseStyle+"\"><span></span></span>");
			$(this).next("." + opts.baseStyle).addClass($(this).resultStyle).find("span").text(results);
			*/
			// rewrote this to work with our stuff... but it does limit it to an ID...
			$("#passwordMeter").removeClass().addClass(opts.baseStyle);
			$("#passwordMeter").addClass($(this).resultStyle);
			$("#passwordMeter").find("span").text(results);

		}
		else
		{
			/*
			$(this).before("<span class=\""+opts.baseStyle+"\"><span></span></span>");
			$(this).prev("." + opts.baseStyle).addClass($(this).resultStyle).find("span").text(results);
			*/
			// rewrote this to work with our stuff... but it does limit it to an ID...
			$("#passwordMeter").removeClass().addClass(opts.baseStyle);
			$("#passwordMeter").addClass($(this).resultStyle);
			$("#passwordMeter").find("span").text(results);
			
		}
		 });
		
		//FUNCTIONS
		$.fn.teststrength = function(password,username,option){
			 	var score = 0; 
			//SA - changing minAllowed to shortPAss so the box won't show empty if nothing in password field
			     if (password.length == 0 ) { this.resultStyle =  option.badPass;return $(this).shortPass; }
			    //password < 8
			    if (password.length < 8 ) { this.resultStyle =  option.shortPass;return $(this).shortPass; }
			    
			    //password == user name
			   // if (password.toLowerCase()==username.toLowerCase()){this.resultStyle = option.badPass;return $(this).samePassword;}
			   // if (password.toLowerCase()=="password".toLowerCase()){this.resultStyle = option.badPass;return $(this).exactPassword;}
			   
			    //password length
			    score += password.length * 4;
			    score += ( $.fn.checkRepetition(1,password).length - password.length ) * 1;
			    score += ( $.fn.checkRepetition(2,password).length - password.length ) * 1;
			    score += ( $.fn.checkRepetition(3,password).length - password.length ) * 1;
			    score += ( $.fn.checkRepetition(4,password).length - password.length ) * 1;
			   
			     
			    
			    //password has 3 numbers
			    if (password.match(/(.*[0-9].*[0-9].*[0-9])/)){ score += 5;} 
			    
			    //password has 2 symbols
			    if (password.match(/(.*[!,@,#,.,_].*[!,@,#,.,_])/)){ score += 5 ;}
			    
			    //password has Upper and Lower chars
			    if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)){  score += 10;} 
			    
			    //password has number and chars
			    if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/)){  score += 15;} 
			    //
			    //password has number and symbol
			    if (password.match(/([!,@,#,.,_])/) && password.match(/([0-9])/)){  score += 15;} 
			    
			    //password has char and symbol
			    if (password.match(/([!,@,#,.,_])/) && password.match(/([a-zA-Z])/)){score += 15;}
			    
			    //password is just a numbers or chars
			    if (password.match(/^\w+$/) || password.match(/^\d+$/) ){ score -= 10;}
			    
			    if(!PASSWORDREGEXP.test(password)){
			    	score = 0;
			    }
			    /*
			    if (password.match(/(?=.*[\d])(?=.*[A-Z])(?=.*[a-z])^[\w\d!@#_.]{8,35}$/)) { 
			    	//if it passes our reg ex than do not change the score
			    	score = score; 
			    } else {
			    	//if it does not pass our reg ex set score to 0 so it fails.
			    	score= 0;
			    } */
			    //verifying 0 < score < 100
			    if ( score < 0 ){score = 0;} 
			    if ( score > 100 ){  score = 100;} 
			    if (score < 20 ){ this.resultStyle = option.badPass;return $(this).badPass;} 
			    if (score < 50 ){ this.resultStyle = option.goodPass;return $(this).goodPass;}
			
			this.resultStyle= option.strongPass;
		  return $(this).strongPass;
		};
});  
};  
})(jQuery);  

$.fn.checkRepetition = function(pLen,str) {
var res = "";
for (var i=0; i<str.length ; i++ ) 
{
var repeated=true;

for (var j=0;j < pLen && (j+i+pLen) < str.length;j++){
 repeated=repeated && (str.charAt(j+i)==str.charAt(j+i+pLen));
 }
if (j<pLen){repeated=false;}
if (repeated) {
 i+=pLen-1;
 repeated=false;
}
else {
 res+=str.charAt(i);
}
}
return res;
};		
/* END PASSWORD */


function validateZIP(field) {
	
	/*var objRegExp = /(^\d{5}$)|(^\d{5}-\d{4}$)|(^\d{9}$)/;

	if(!objRegExp.test(field.value)){
		msg = msg + '<li>Please enter your phone number in this format: xxx-xxxx or xxxxxxx.</li>';
		field.id = 'dontSubmit';
		return false;
	}*/
	
	var valid = "0123456789-";
	var hyphencount = 0;
	
	field.id = 'reqText';
	
	if (field.value.length!=5 && field.value.length!=10 && trimAll(field.value) != '') {
		msg = msg + '<li>Please enter your 5 digit or 5 digit+4 zip code.</li>';
		field.id = 'dontSubmit';
		return false;
	}
	
	for (var i=0; i < field.value.length; i++) {
		temp = "" + field.value.substring(i, i+1);
		if (temp == "-") hyphencount++;
		if (valid.indexOf(temp) == "-1") {
			msg = msg + '<li>The zip code you entered contains invalid characters.</li>';
			field.id = 'dontSubmit';
			return false;
		}
		if ((hyphencount > 1) || ((field.value.length==10) && ""+field.value.charAt(5)!="-")) {
			msg = msg + '<li>Please enter your zip code in this format: xxxxx-xxxx.</li>';
			field.id = 'dontSubmit';
			return false;
		}
	}
	if(field.value.match("-") != null){
	
		arrStr = field.value.split("-");
		
		if((arrStr[1] == 0000) || (arrStr[1] == 9999)){
			
			msg = msg + '<li>The last four digits of the zip code you entered are invalid.</li>';
			field.id = 'dontSubmit';
			return false;	
			
		}
	}
	
	return true;
}
function validateArea(field) {
	var valid = "0123456789";
	
	field.id = 'reqText';
	
	if (field.value.length!=3 && trimAll(field.value) != '') {
		msg = msg + '<li>Your area code must have 3 digits.</li>';
		field.id = 'dontSubmit';
		return false;
	}
	for (var i=0; i < field.value.length; i++) {
		temp = "" + field.value.substring(i, i+1);
		
		if (valid.indexOf(temp) == "-1") {
			msg = msg + '<li>The area code you entered contains invalid characters.</li>';
			field.id = 'dontSubmit';
			return false;
		}
	}
	
	return true;
}
				
function validatePhone(field) {
var objRegExp = /^(\d{3}-\d{4}$)|^(\d{7}$)/;
		
		if (field.value.length > 0 && field.value.value != ''){
			
			if(!objRegExp.test(field.value)){
				msg = msg + '<li>Please enter your phone number in this format: xxx-xxxx or xxxxxxx.</li>';
				field.id = 'dontSubmit';
				return false;
					
				//var objRegExp  = /(^\d{6}$)|(^\d{8}$)/;
				
				//if(!objRegExp.test(field.value)){
					//return false;
				//}
			}
			if (field.value == '555-1212') {
				msg = msg + '<li>555-1212 is not a valid phone number.</li>';
				field.id = 'dontSubmit';
				return false;
			}
			//changing the phone number format to xxx-xxxx
			var newNum;
			if (field.value.length == 8){
			}
			else {
				// for format xxx-xxxx
				newNum = field.value.substring(0,3) + '-' + field.value.substring(3,7);
				eval(field).value=newNum;
				 }
		}
		
			
	return true;
}

/*function validatePhone(field) {
	var valid = "0123456789-";
	var hyphencount = 0;
	
	field.id = 'reqText';
	if (field.value == '555-1212') {
		msg = msg + '<li>555-1212 is not a valid phone number.</li>';
		field.id = 'dontSubmit';
		return false;
	}
	
	if (field.value.length!=8 && trimAll(field.value) != '') {
		msg = msg + '<li>Please enter your phone number in this format: xxx-xxxx.</li>';
		field.id = 'dontSubmit';
		return false;
	}
	for (var i=0; i < field.value.length; i++) {
		temp = "" + field.value.substring(i, i+1);
		if (temp == "-") hyphencount++;
		if (valid.indexOf(temp) == "-1") {
			msg = msg + '<li>The phone number you entered contains invalid characters.</li>';
			field.id = 'dontSubmit';
			return false;
		}
		if ((hyphencount > 1) || ((field.value.length==8) && ""+field.value.charAt(3)!="-")) {
			msg = msg + '<li>Please enter your phone number in this format: xxx-xxxx.</li>';
			field.id = 'dontSubmit';
			return false;
		}
	}
	
	return true;
}*/

function validateEmail(field) {
	
	idName = String(field.name);
	stringId= String('td' + idName);
	document.getElementById(stringId).className = '';
	
	//field.id = 'reqText';
	field.id = 'elmail';
	
	//removed the email required on July 11, 2006 per instruction on task CMGW 000A 03 -- Joe Raymond
	if(trimAll(field.value) != ''){
		if ((/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(field.value))){
			return true;
		} else {
			msg = msg + '<li>Please enter a valid e-mail address.</li>';
			field.id = 'dontSubmit';
			return false;
		}
	}
	else{
		return true;
	}
}
function validateSSN(field) {
	
	field.id = 'reqText';
	
	var matchArr = field.value.match(/^(\d{3})-?\d{2}-?\d{4}$/);
	var numDashes = field.value.split('-').length - 1;
	if (trimAll(field.value) != ''){
		if (matchArr == null || numDashes == 1) {
			msg = msg + '<li>Please enter your SSN using 9 digits or in the format: xxx-xx-xxxx.</li>';
			field.id = 'dontSubmit';
			return false;
		}
		else 
		if (parseInt(matchArr[1],10)==0) {
			msg = msg + '<li>It appears the SSN you entered is invalid.</li>';
			field.id = 'dontSubmit';
			return false;
		}
	}

	idName = String(field.name);
	stringId= String('td' + idName);
	document.getElementById(stringId).className = '';
	
	return true;
	
}

function validateUserID(field) {
	var notvalid = "\\/ ";
		
	field.id = 'reqText';
	
	if (field.value.length<6 && trimAll(field.value) != '') {
		msg = msg + '<li>Your User ID should be between 6 and 50 characters.</li>';
		field.id = 'dontSubmit';
		return false;
	}
	for (var i=0; i < field.value.length; i++) {
		temp = "" + field.value.substring(i, i+1);
		
		if (notvalid.indexOf(temp) != "-1") {
			msg = msg + '<li>Your User ID should not contain spaces, forward, or backward slashes.</li>';
			field.id = 'dontSubmit';
			return false;
		}
		
	}
	
	return true;
}

function validatePass(field1, field2)
{ 
	var notvalid = "\\/ ";
		
	field1.id = 'reqText';
	field2.id = 'reqText';
	
	if (field1.value != field2.value)
	{
		msg = msg + '<li>The new password you entered does not match the confirm password.</li>';
		field1.id = 'dontSubmit';
		field2.id = 'dontSubmit';
		return false;
	}
	else 
	{
		if (field1.value.length<8 && trimAll(field1.value) != '' || field2.value.length < 8 && trimAll(field2.value) != '')
		{
			msg = msg + '<li>Your password must be at least 8 characters.</li>';
			field1.id = 'dontSubmit';
			field2.id = 'dontSubmit';
			return false;
		}
	}	
	
	/* test password for all requirements */
	if (!PASSWORDREGEXP.test(field1.value))
	{
		msg= msg + "<li>Your password must be at least 8 characters and contain 1 uppercase and 1 lowercase letter and 1 number.</li>"; 
		field1.id = 'dontSubmit';
		field2.id = 'dontSubmit';
		return false;
	}
		
	for (var i=0; i < field1.value.length; i++) 
	{
		temp = "" + field1.value.substring(i, i+1);
			
			if (notvalid.indexOf(temp) != "-1")
			{
				msg = msg + '<li>Your password should not contain spaces, forward, or backward slashes.</li>';
				field1.id = 'dontSubmit';
				field2.id = 'dontSubmit';
				return false;
			}
			
	}
	return true;
}

function trimAll( strValue ) {

 var objRegExp = /^(\s*)$/;

    //check for all spaces
    if(objRegExp.test(strValue)) {
       strValue = strValue.replace(objRegExp, '');
       if( strValue.length == 0)
          return strValue;
    }

   //check for leading & trailing spaces
   objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
   if(objRegExp.test(strValue)) {
       //remove leading and trailing whitespace characters
       strValue = strValue.replace(objRegExp, '$2');
    }
  return strValue;
}


