// Meteran Password
// Berdasarkan:
// http://www.intelligent-web.co.uk
// http://www.geekwisdom.com/dyn/passwdmeter

/*
	Algoritma Kekuatan Password:
	
	Panjang Password :
		5 Poin: kurang dari 4 karaketer
		10 Poin: 5 s/d 7 karaketer
		25 Poin: 8 atau lebih karakter
		
	Huruf:
		0 Poin: Tanpa huruf
		10 Poin: semuanya huruf kecil
		20 Poin: memakai huruf kecil dan besar

	Angka:
		0 Poin: tanpa angka
		10 Poin: 1 angka
		20 Poin: 3 angka atau lebih
		
	Karakter:
		0 Poin: tanpa karakter
		10 Poin: 1 karakter
		25 Poin: lebih 1 karakter

	Tambahan:
		2 Poin: huruf dan angka
		3 Poin: huruf, angka dan karakter
		5 Poin: campuran huruf, angka dan karakter
		
	Meteran Password:
	
		>= 90: Sangat Aman
		>= 80: Aman
		>= 70: Sangat Kuat
		>= 60: Kuat
		>= 50: Rata-Rata
		>= 25: Lemah
		>= 0: Sangat Lemak
		
*/


var m_strUpperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var m_strLowerCase = "abcdefghijklmnopqrstuvwxyz";
var m_strNumber = "0123456789";
var m_strCharacters = "!@#$%^&*?_~"

// Cek password
function checkPassword(strPassword)
{
	var nScore = 0;
	
	// Panjang Password
	// 1
	if (strPassword.length < 5)
	{
		nScore += 5;
	}
	// 2
	else if (strPassword.length > 4 && strPassword.length < 8)
	{
		nScore += 10;
	}
	// 3
	else if (strPassword.length > 7)
	{
		nScore += 25;
	}

	// Huruf
	var nUpperCount = countContain(strPassword, m_strUpperCase);
	var nLowerCount = countContain(strPassword, m_strLowerCase);
	var nLowerUpperCount = nUpperCount + nLowerCount;
	// 1
	if (nUpperCount == 0 && nLowerCount != 0) 
	{ 
		nScore += 10; 
	}
	// 2
	else if (nUpperCount != 0 && nLowerCount != 0) 
	{ 
		nScore += 20; 
	}
	
	// Angka
	var nNumberCount = countContain(strPassword, m_strNumber);
	// 1
	if (nNumberCount == 1)
	{
		nScore += 10;
	}
	// 2
	if (nNumberCount >= 3)
	{
		nScore += 20;
	}
	
	// Karakter
	var nCharacterCount = countContain(strPassword, m_strCharacters);
	// 1
	if (nCharacterCount == 1)
	{
		nScore += 10;
	}	
	// 1
	if (nCharacterCount > 1)
	{
		nScore += 25;
	}
	
	// Tambahan
	// 1
	if (nNumberCount != 0 && nLowerUpperCount != 0)
	{
		nScore += 2;
	}
	// 2
	if (nNumberCount != 0 && nLowerUpperCount != 0 && nCharacterCount != 0)
	{
		nScore += 3;
	}
	// 3
	if (nNumberCount != 0 && nUpperCount != 0 && nLowerCount != 0 && nCharacterCount != 0)
	{
		nScore += 5;
	}
	
	
	return nScore;
}
 
// Fungsi utama 
function runPassword(strPassword, strFieldID) 
{
	// Cek password
	var nScore = checkPassword(strPassword);
	
	 // Kontrol id
    	var ctlBar = document.getElementById(strFieldID + "_bar"); 
    	var ctlText = document.getElementById(strFieldID + "_text");
    	if (!ctlBar || !ctlText)
    		return;
    	
    	// setel lebar
    	ctlBar.style.width = nScore + "%";

 	// warna dan pesan
	// -- Sangat Aman
 	if (nScore >= 90)
 	{
 		var strText = "Sangat Aman";
 		var strColor = "#0ca908";
 	}
 	// -- Aman
 	else if (nScore >= 80)
 	{
 		var strText = "Aman";
 		vstrColor = "#7ff67c";
	}
	// -- Sangat Kuat
 	else if (nScore >= 70)
 	{
 		var strText = "Sangat Kuat";
 		var strColor = "#1740ef";
	}
	// -- Kuat
 	else if (nScore >= 60)
 	{
 		var strText = "Kuat";
 		var strColor = "#5a74e3";
	}
	// -- Rata-Rata
 	else if (nScore >= 50)
 	{
 		var strText = "Rata-Rata";
 		var strColor = "#e3cb00";
	}
	// -- Lemah
 	else if (nScore >= 25)
 	{
 		var strText = "Lemah";
 		var strColor = "#e7d61a";
	}
	// -- Sangat Lemah
 	else
 	{
 		var strText = "Sangat Lemah";
 		var strColor = "#e71a1a";
	}
	ctlBar.style.backgroundColor = strColor;
	ctlText.innerHTML = "<span style='color: " + strColor + ";'>" + strText + " - " + nScore + "</span>";
}
 
// fungsi pengecekan karakter
function countContain(strPassword, strCheck)
{ 
	var nCount = 0;
	
	for (i = 0; i < strPassword.length; i++) 
	{
		if (strCheck.indexOf(strPassword.charAt(i)) > -1) 
		{ 
	        	nCount++;
		} 
	} 
 
	return nCount; 
} 
 
 
 
 
 



