/*Password meter will show a meter in red, yellow or green depending
  on the security level of the entered password.
  Passwords with less than 7 characters will always be considered LOW.
  There are three groups of elements considered for passwords:
  lowercase letters [a-z]
  uppercase letters [A-Z]
  numbers           [0-9]
  symbols			[@#!%&=?+_.*$^-]

  The passwordMeter must be invoked in the onKeyUp event of the passsword field
*/
var pmet_languages = ['ENG','ESP'];

var pmet_levels = new Array();
pmet_levels[0] = ['Weak','Ok','Strong'];
pmet_levels[1] = ['Débil','Bien','Fuerte'];

var pmet_label = new Array();
pmet_label[0] = "Password Security Meter";
pmet_label[1] = "Medidor de Seguridad de la Clave";

var pmet_err = new Array();
pmet_err[0] = "Password contains invalid characters. Use 5 to 20 letters, numbers, or any of the following: @#!%&=?+_.*$^-";
pmet_err[1] = "La clave contiene caracteres inválidos. Use 5 to 20 letras, números o cualquiera de los siguientes: @#!%&=?+_.*$^-";

//set the meter images

var pmet_bg = new Array();
pmet_bg[0]  = "ps0.gif";
pmet_bg[10] = "ps1.gif";
pmet_bg[20] = "ps1.gif"; 
pmet_bg[30] = "ps2.gif"; 
pmet_bg[40] = "ps2.gif"; 
pmet_bg[50] = "ps3.gif"; 
pmet_bg[60] = "ps3.gif";
pmet_bg[70] = "ps4.gif";
pmet_bg[80] = "ps4.gif";
pmet_bg[90] = "ps5.gif";
pmet_bg[100] = "ps5.gif";

var pmet_bg_path = '/images/meter/';

//set regular expression to see if an invalid character is typed
var RE_pmet = /^[0-9A-Za-z@#!%&=?+_.*$^-]{0,}$/;

var pmet_tiptext = new Array();
pmet_tiptext[0] = '<br>We consider three groups of characters '+
             'to evaluate the password security level: lowercase letters (a-z), uppercase letters (A-Z) and numbers (0-9).<br><br>\n'+
             'Passwords with a length of less than 7, or composed by characters of only one group, are low level.<br><br>\n\n'+
             'Password with characters of two groups, are medium level. <br><br>And passwords formed by characters of the three groups are high level.<br><br>';

pmet_tiptext[1] = '<br>Consideramos tres grupos de caracteres para las claves: letras minúsculas (a-z), letras mayúsculas (A-Z), '+
             'y números (0-9).<br><br>\n Las claves con una longitud menor a 7, o compuestas por caracteres de un solo grupo, son de bajo nivel.<br><br>\n'+
             'Las claves formadas por caracteres de dos grupos, son de nivel medio. <br><br>Y las formadas por caracteres de los tres grupos son de nivel alto.<br><br>';

var pmIE = navigator.appName.search('Explorer');

function BuildPasswordMeter(form,field,language){
	var metID = "met_" + form + "_" + field;
	pmetPreloadImages();
	document.write('<div id="'+metID+'">');
	document.write('<table border=0 cellspacing=0 cellpadding=0 style="width:200px;height:24px;table-layout:fixed;">');
	document.write('<tr style="height:24px;">');
	document.write('<td><img id="'+metID+'_img" src="'+pmet_bg_path+pmet_bg[0]+'" border=0 width=198 height=24></td>');
	document.write('</tr>');
	document.write('</table>');	
	document.write('<span id="'+metID+'_tip">&nbsp;</span>');
	document.write('</div>');
	//setTimeout('CheckPasswordMeter('+form+','+field+','+language+')',1000);
}

function CheckPasswordMeter(form,field,language){
	var metID   = "met_" + form + "_" + field;
    var currsec = EvaluateSecurity(form,field);
    var langIDX = getLanguageIndex(language);
   	var ctext    = eval("document.forms['"+form+"']."+field).value;
   	var iserr   = false;
   	if (! RE_pmet.test(ctext)){
   		currsec = 0;
   		iserr=true;
   	}
    //display the right image
	var img=document.getElementById(metID + '_img');
	img.src=pmet_bg_path + pmet_bg[currsec];
	//display tip    
    var tipCell = document.getElementById(metID + '_tip');
    if (iserr)
    	tipCell.innerHTML = pmet_err[langIDX];
	else if (currsec < 50)
    	tipCell.innerHTML = pmet_levels[langIDX][0] + ' ' + currsec + '%';
    else if (currsec < 80)
    	tipCell.innerHTML = pmet_levels[langIDX][1] + ' ' + currsec + '%';    
    else
    	tipCell.innerHTML = pmet_levels[langIDX][2] + ' ' + currsec + '%';        
     return true;
}

function EvaluateSecurity(form,field){
	var ctext    = eval("document.forms['"+form+"']."+field).value;
    var perc     = 0;
    
	//evaluate length
    if (ctext.length >= 5){
     	perc += 10;   
    	if (ctext.length >= 8){
	    	perc += 10;   
			if (ctext.length >= 12)
				perc += 5; 	
	    }
	}

    //count characters per group 	
    var totlower=0;
    var totupper=0;
    var totnumbr=0;
    var totsymbl=0;

	for (var i=0; i < ctext.length ; i++){
		var code = ctext.charCodeAt(i);
		if (code >= 65 && code <= 90)
			totupper++;
		else if (code >= 97 && code <= 122)
			totlower++;
		else if (code >= 48 && code <= 57)
			totnumbr++;
		else
			totsymbl++;	
	}
	
	if (totlower >= 4)
		perc += 20;
	else if (totlower >= 2)
		perc += 10;
	
	if (totupper >= 4)
		perc += 20;
	else if (totupper >= 2)
		perc += 10;
		
	if (totnumbr > 0){
		var numscore = totnumbr * 10;
		if (numscore > 50) numscore = 50;
		perc += numscore;
	}
	
	var symscore = totsymbl * 10;
	if (symscore > 50) symscore = 50;
	perc += symscore;
	
	if ((totlower > 0 || totupper > 0 ) && totnumbr > 0 ){
		perc += 10;
		if (totlower > 0 && totupper > 0)
			perc += 20;
		if (totsymbl > 0){
			perc += 10;
		}
	}
	
	var zeroes = 0;
	if (totlower == 0)
		zeroes++;
	if (totupper == 0)
		zeroes++;
	if (totnumbr == 0)
		zeroes++;
	if (totsymbl == 0)
		zeroes++;
	
	if (perc > 70 && zeroes >= 2){
		perc = 80;
	}
	
	if (perc > 95)
		perc = 100;
	else if (perc >= 85)
		perc = 90;
	else if (perc >= 75)
		perc = 80;
	else if (perc >= 65)
		perc = 70;
	else if (perc >= 55)
		perc = 60;
	else if (perc >= 45)
		perc = 50;
	else if (perc >= 35)
		perc = 40;
	else if (perc >= 25)
		perc = 30;
	else if (perc >= 15)
		perc = 20;
	else if (perc >= 5)
		perc = 10;
	else
		perc = 0;	
	
	if (perc > 100) 
		perc = 100
		
	return perc;		
}

function getLanguageIndex(language){
     var found=0;
     for (var idx=0; idx < pmet_languages.length; idx++){
          if (pmet_languages[idx] == language){
              found = idx;
              break;
          }
     }
     return found;
}

function showMeterTip(link,tpName){
     var tipbox = document.getElementById(tpName);
     tipbox.style.visibility = 'visible';
     PosMeterTipBox(link,tipbox);
     return true;
}

function hideMeterTip(tpName){
    var tipbox = document.getElementById(tpName);
    tipbox.style.visibility = 'hidden';
    tipbox.top = 0;
    tipbox.left = -999;
    return true;
}

function PosMeterTipBox(cP,cF){
 var dB=document.body;
 var eL=0;
 var eT=0;
 for(var p=cP; p&&p.tagName!='BODY';p=p.offsetParent){
     eL+=p.offsetLeft;
     eT+=p.offsetTop;
 }
 var eH=cP.offsetHeight;
 var dH=parseInt(cF.style.height);
 var sT=getDocumentScrollTop();
 if(eT-dH>=sT&&eT+eH+dH>getWinHeight()+sT)
    eT-=dH;
 else
    eT+=eH;
 cF.style.left=eL;
 cF.style.top=eT;
}

function getDocumentScrollTop(){
        if(document.documentElement.scrollTop) return document.documentElement.scrollTop;
        if(document.body.scrollTop) return document.body.scrollTop;
        if(window.pageYOffset) return window.pageYOffset;
        return 0;
}

function pmetPreloadImages() { 
  var d=document; 
  if(d.images){ 
  	if(!d.pmetPA) d.pmetPA=new Array();
	var idx=d.pmetPA.length;
	var args=pmetPreloadImages.arguments; 
	for(var i=10; i<=100; i+=10){
		 d.pmetPA[idx]=new Image; 
		 d.pmetPA[idx].src=pmet_bg_path + pmet_bg[i];
		 idx++;
	}
  }
}

