function FormValidate(name){
	this.name = name;
	this.fields = new Array();
	this.ajaxObj = false;
	this.status = false;
	
	this.add = function(e, p, s, h) {
		var parm = p.split('|');
		var field = new Array();
		field['name'] = e;
		field['param'] = parm;
		field['send'] = s;
		field['msg'] = h;
		field['enable'] = true;
		this.fields.push(field);
	}

	this.enable = function(e) {
		this.find(e)['enable'] = true;
	}

	this.disable = function(e) {
		this.find(e)['enable'] = false;
	}
	
	this.checkform = function() {
		var retval = true;
		for (var i = 0; i < this.fields.length; i++) {
			if ( !this.isvalid(this.fields[i]['name']) ) {
				retval = false;
				break;
			}
		}
		return retval;
	}	
	
	this.isvalid = function(field) {

		var el = this.find(field)
		var ret = true;
		var req = false;
		var parm = el['param'];
		var checkbox = false;

		var elem = gid(field);
		// se non trova il campo salta
		if (!elem.id && !elem.name) return true;
		
		var msg  = el['msg'];

		hideMsg(msg);

		if (!el['enable'])
			return true;

		for (var i = 0; i < parm.length; i++) {
	        var rule = parm[i].split(':');
			switch(rule[0].toLowerCase()) { 
				case 'req': 
					ret=this.notEmpty(elem);
					req=true;
					break; 
				case 'alpha':
					ret=this.isAlphabet(elem);
					break; 
				case 'numeric':
					ret=this.isNumeric(elem);
					break; 
				case 'mixed':
					ret=this.isAlphanumeric(elem);
					break;
				case 'min':
					ret=this.lengthMin(elem, rule[1]);
					break;
				case 'max':
					ret=this.lengthMax(elem, rule[1]);
					break;
				case 'exact':
					ret=this.lengthExact(elem, rule[1]);
					break;
				case 'checked':
					ret=this.isChecked(elem);
					break;
				case 'selected':
					ret=this.madeSelection(elem);
					break;
				case 'email':
					ret=this.emailValidator(elem);
					break;
				case 'psw':
					ret=this.passwordValidator(elem);
					break;
				case 'phone':
					ret=this.validatePhone(elem);
					break;
				case 'cfis':
					ret=this.CFValidator(elem);
					break;
				case 'none':
					ret=true;
					break;
				default:
					alert(e + ': Regola ' + rule + ' non valida.') 
			}	
			if (req && !ret) 
				break;
		}					
	
		if (!req && !this.notEmpty(elem)) {
				return true;
		} else {
			if (!ret) 
				this.error(field,msg);
			return ret;
		}
	}

	this.error = function(field, msg) {
		inlineMsg(field,msg);
	}
	
	this.find = function(field) {
		var retval = false	
		for (var i = 0; i < this.fields.length; i++) {
            if  (this.fields[i]['name'] == field) {
				retval = this.fields[i]
				break;
			}
		}
		return retval
	} 		

	this.notEmpty = function (elem, helperMsg){
		if(elem.value.length == 0){
			return false;
		}
		return true;
	}

	this.isNumeric = function (elem){
		var numericExpression = /^[0-9]+$/;
		if(elem.value.match(numericExpression)){
			return true;
		}else{
			return false;
		}
	}

	this.isAlphabet = function (elem){
		var uInput = elem.value;
		if(uInput.length == 0 )
			return true;

		var alphaExp = /^[a-zA-Z]+$/;
		if(elem.value.match(alphaExp)){
			return true;
		}else{
			return false;
		}
	}

	this.isAlphanumeric = function(elem) {
	    var uInput = elem.value.replace(/[\(\)\.\-\ ]/g, ''); ;
	    if (uInput.length == 0)
	        return true;

	    var alphaExp = /^[0-9a-zA-Z &]+$/;
	    if (elem.value.match(alphaExp)) {
	        return true;
	    } else {
	        return false;
	    }
	}

	this.lengthExact = function (elem, l){
		var uInput = elem.value;
		if(uInput.length == l ){
			return true;
		}else{
			return false;
		}
	}

	this.lengthMin = function (elem, l){
		var uInput = elem.value;
		if(uInput.length >= l ){
			return true;
		}else{
			return false;
		}
	}

	this.lengthMax = function (elem, l){
		var uInput = elem.value;
		if(uInput.length <= l){
			return true;
		}else{
			return false;
		}
	}

	this.isChecked = function (elem){
		if(this.getCheckedValue(elem)!=null){
			return true;
		}else{
			return false;
		}
	}

	this.madeSelection = function (elem){
		if(elem.value == "Please Choose"){
			return false;
		}else{
			return true;
		}
	}

	this.emailValidator = function (elem){
		var emailExp = /^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,4}$/;
		if(elem.value.match(emailExp)){
			return true;
		}else{
			return false;
		}
	}

	this.validatePhone = function (elem) {
    	var stripped = elem.value.replace(/[\(\)\.\-\ ]/g, '');     

		if (isNaN(parseInt(stripped))) {
			return false;
		}else{
			return true;
		}
	}

	this.passwordValidator = function (elem) {
		var s = elem.value
		if (s == "") {
			return false;
		}
	    if (s.length < 8) {
	       return false;
	    }
	    else if (!this.isAlphanumeric(elem)) {
		   return false;
	    }
		return true;
	}
    this.CFValidator = function(elem) {
        var result = true;
		var cf = elem.value
        if( cf.length < 16 ) {
            if( cf.length != 11 ) return false;
            if( cf == '12345678903' || cf == '44444444440' ) return false;
    	    
            var validi = "0123456789";
            for( i = 0; i < 11; i++ ){
                if( validi.indexOf( cf.charAt(i) ) == -1 ) {
                    return false;
                }
            }
            
            var s = 0;
            for( i = 0; i <= 9; i += 2 )
	            s += cf.charCodeAt(i) - '0'.charCodeAt(0);
            for( i = 1; i <= 9; i += 2 ){
	            c = 2*( cf.charCodeAt(i) - '0'.charCodeAt(0) );
	            if( c > 9 )  c = c - 9;
	            s += c;
            }
            if( ( 10 - s%10 )%10 != cf.charCodeAt(10) - '0'.charCodeAt(0) ) {
	            return false;
            }
            
            return result;
        } else if( cf.length == 16 ) {
            if( cf.length != 16 ) return false;
            var validi, i, s, set1, set2, setpari, setdisp;
            cf = cf.toUpperCase();
    	    
            validi = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            for( i = 0; i < 16; i++ ){
	            if( validi.indexOf( cf.charAt(i) ) == -1 )
		            return false;
            }
    	    
            set1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            set2 = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ";
            setpari = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            setdisp = "BAKPLCQDREVOSFTGUHMINJWZYX";
            s = 0;
            for( i = 1; i <= 13; i += 2 )
	            s += setpari.indexOf( set2.charAt( set1.indexOf( cf.charAt(i) )));
            for( i = 0; i <= 14; i += 2 )
	            s += setdisp.indexOf( set2.charAt( set1.indexOf( cf.charAt(i) )));
    	    
            if( s%26 != cf.charCodeAt(15)-'A'.charCodeAt(0) ) {
                return false;
	        }
    		
            return result;
        }
    }
	
	this.submit = function(ajaxObj) {
		var f = '';
		for (var i = 0; i < this.fields.length; i++) {
			if (this.fields[i]['send'].toUpperCase() == 'Y') {
				name  = this.fields[i]['name'];
				value = this.GetValue( name );
				ajaxObj.setVar(name,  escape(value ? value : "").replace(/\+/g, "%2B"))
			}
		}
		return f;
	}

	this.GetValue = function(el) {
		var retval   = false;
		try {
			var element  = gid(el);
	    	var elemType = element.type.toUpperCase();
	        var elemName = element.name;
	        if (elemName) {
		    	if (elemType == "TEXT"
		                || elemType == "TEXTAREA"
		                || elemType == "PASSWORD"
						|| elemType == "BUTTON"
						|| elemType == "RESET"
						|| elemType == "SUBMIT"
						|| elemType == "FILE"
						|| elemType == "IMAGE"
		                || elemType == "HIDDEN")
					retval = element.value;
		        else if (elemType == "CHECKBOX" && element.checked)
		            retval = element.value ? element.value : "On";
		        ///else if (elemType == "RADIO" && element.checked) 
		        else if (elemType == "RADIO") 
		            retval = this.getCheckedValue(element);
		        else if (elemType.indexOf("SELECT") != -1)
		            for (var j = 0; j < element.options.length; j++) {
		                var option = element.options[j];
		                if (option.selected)
		                    retval = option.value ? option.value : option.text;
		            }
	        }
		} catch (er) {
			retval = false;
		}
		return retval;
	}

	this.getCheckedValue = function(element) {
		var value = null;        

		// var element = gid(el);        
		var radioGroupName = null;                  
		// if null, then the id must be the radio group name        
		if (element == null) {                
			radioGroupName = element;        
		} else {           
			if (element.length > 0 ) {
				radioGroupName = element[0].getAttribute("name");			
			} else {
				radioGroupName = element.name;             
			}
		}        
		if (radioGroupName == null) {                
			return null;        
		}        
		var radios = document.getElementsByTagName('input');        
		for (var i=0; i<radios.length; i++) {                
			var input = radios[ i ];                    
			if (input.type.toUpperCase() == 'RADIO' && input.name == radioGroupName && input.checked) {
			    value = input.value;                        
				break;                
			}        
		}        
		return value;
	}

}

//
//
// inline message v1.0
//
//

var MSGTIMER = 20;
var MSGSPEED = 5;
var MSGOFFSET = 3;
var MSGHIDE = 3;

function inlineMsg(target,string) {
	inlineMsg(target,string, true)
}
// build out the divs, set attributes and call the fade function //
function inlineMsg(target,string,autohide) {
  var msg;
  var msgcontent;
  if(!document.getElementById('msg')) {
    msg = document.createElement('div');
    msg.id = 'msg';
    msgcontent = document.createElement('div');
    msgcontent.id = 'msgcontent';
    document.body.appendChild(msg);
    msg.appendChild(msgcontent);
    msg.style.filter = 'alpha(opacity=0)';
    msg.style.opacity = 0;
    msg.alpha = 0;
  } else {
    msg = document.getElementById('msg');
    msgcontent = document.getElementById('msgcontent');
  }
  msgcontent.innerHTML = string;
  msg.style.display = 'block';
  var msgheight = msg.offsetHeight;
  var targetdiv = document.getElementById(target);
  if (targetdiv!=null) {	
      targetdiv.focus();
	  var targetheight = targetdiv.offsetHeight;
	  var targetwidth = targetdiv.offsetWidth;
	  var topposition = topPosition(targetdiv) - ((msgheight - targetheight) / 2);
	  var leftposition = leftPosition(targetdiv) + targetwidth + MSGOFFSET;
	  msg.style.top = topposition + 'px';
	  msg.style.left = leftposition + 'px';
	  clearInterval(msg.timer);
	  //if (autohide) {
	  msg.timer = setInterval("fadeMsg(1)", MSGTIMER);
	  if(!autohide) {
	    autohide = MSGHIDE;  
	  }
	  window.setTimeout("hideMsg()", (autohide * 1000));
	  //}
  }
}

// hide the form alert //
function hideMsg(msg) {
  var msg = document.getElementById('msg');
  if (msg)
  	if(!msg.timer) 
    	msg.timer = setInterval("fadeMsg(0)", MSGTIMER);
}

// face the message box //
function fadeMsg(flag) {
  if(flag == null) {
    flag = 1;
  }
  var msg = document.getElementById('msg');
  var value;
  if(flag == 1) {
    value = msg.alpha + MSGSPEED;
  } else {
    value = msg.alpha - MSGSPEED;
  }
  msg.alpha = value;
  msg.style.opacity = (value / 100);
  msg.style.filter = 'alpha(opacity=' + value + ')';
  if(value >= 99) {
    clearInterval(msg.timer);
    msg.timer = null;
  } else if(value <= 1) {
    msg.style.display = "none";
    clearInterval(msg.timer);
  }
}

// calculate the position of the element in relation to the left of the browser //
function leftPosition(target) {
  var left = 0;
  if(target.offsetParent) {
    while(1) {
      left += target.offsetLeft;
      if(!target.offsetParent) {
        break;
      }
      target = target.offsetParent;
    }
  } else if(target.x) {
    left += target.x;
  }
  return left;
}

// calculate the position of the element in relation to the top of the browser window //
function topPosition(target) {
  var top = 0;
  if(target.offsetParent) {
    while(1) {
      top += target.offsetTop;
      if(!target.offsetParent) {
        break;
      }
      target = target.offsetParent;
    }
  } else if(target.y) {
    top += target.y;
  }
  return top;
}

// preload the arrow //
if(document.images) {
  arrow = new Image(7,80); 
  arrow.src = "images/msg_arrow.gif"; 
}



// Password strength meter v2.0
// Matthew R. Miller - 2007
// www.codeandcoffee.com
// Based off of code from:
//  http://www.intelligent-web.co.uk
//  http://www.geekwisdom.com/dyn/passwdmeter

/*
	Password Strength Algorithm:
	
	Password Length:
		5 Points: Less than 4 characters
		10 Points: 5 to 7 characters
		25 Points: 8 or more
		
	Letters:
		0 Points: No letters
		10 Points: Letters are all lower case
		20 Points: Letters are upper case and lower case

	Numbers:
		0 Points: No numbers
		10 Points: 1 number
		20 Points: 3 or more numbers
		
	Characters:
		0 Points: No characters
		10 Points: 1 character
		25 Points: More than 1 character

	Bonus:
		2 Points: Letters and numbers
		3 Points: Letters, numbers, and characters
		5 Points: Mixed case letters, numbers, and characters
		
	Password Text Range:
	
		>= 90: Very Secure
		>= 80: Secure
		>= 70: Very Strong
		>= 60: Strong
		>= 50: Average
		>= 25: Weak
		>= 0: Very Weak
		
*/


// Settings
// -- Toggle to true or false, if you want to change what is checked in the password
var m_strUpperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var m_strLowerCase = "abcdefghijklmnopqrstuvwxyz";
var m_strNumber = "0123456789";
var m_strCharacters = "!@#$%^&*?_~"

// Check password
function checkPassword(strPassword)
{
	// Reset combination count
	var nScore = 0;
	
	// Password length
	// -- Less than 4 characters
	if (strPassword.length < 5)
	{
		nScore += 5;
	}
	// -- 5 to 7 characters
	else if (strPassword.length > 4 && strPassword.length < 8)
	{
		nScore += 10;
	}
	// -- 8 or more
	else if (strPassword.length > 7)
	{
		nScore += 25;
	}

	// Letters
	var nUpperCount = countContain(strPassword, m_strUpperCase);
	var nLowerCount = countContain(strPassword, m_strLowerCase);
	var nLowerUpperCount = nUpperCount + nLowerCount;
	// -- Letters are all lower case
	if (nUpperCount == 0 && nLowerCount != 0) 
	{ 
		nScore += 10; 
	}
	// -- Letters are upper case and lower case
	else if (nUpperCount != 0 && nLowerCount != 0) 
	{ 
		nScore += 20; 
	}
	
	// Numbers
	var nNumberCount = countContain(strPassword, m_strNumber);
	// -- 1 number
	if (nNumberCount == 1)
	{
		nScore += 10;
	}
	// -- 3 or more numbers
	if (nNumberCount >= 3)
	{
		nScore += 20;
	}
	
	// Characters
	var nCharacterCount = countContain(strPassword, m_strCharacters);
	// -- 1 character
	if (nCharacterCount == 1)
	{
		nScore += 10;
	}	
	// -- More than 1 character
	if (nCharacterCount > 1)
	{
		nScore += 25;
	}
	
	// Bonus
	// -- Letters and numbers
	if (nNumberCount != 0 && nLowerUpperCount != 0)
	{
		nScore += 2;
	}
	// -- Letters, numbers, and characters
	if (nNumberCount != 0 && nLowerUpperCount != 0 && nCharacterCount != 0)
	{
		nScore += 3;
	}
	// -- Mixed case letters, numbers, and characters
	if (nNumberCount != 0 && nUpperCount != 0 && nLowerCount != 0 && nCharacterCount != 0)
	{
		nScore += 5;
	}
	
	
	return nScore;
}
 
// Runs password through check and then updates GUI 
function runPassword(strPassword, strFieldID) 
{
	// Check password
	var nScore = checkPassword(strPassword);
	
	 // Get controls
    	var ctlBar = document.getElementById(strFieldID + "_bar"); 
    	var ctlText = document.getElementById(strFieldID + "_text");
    	if (!ctlBar || !ctlText)
    		return;
    	
    	// Set new width
    	ctlBar.style.width = nScore + "%";

 	// Color and text
	// -- Very Secure
 	if (nScore >= 90)
 	{
 		var strText = "Very Secure";
 		var strColor = "#0ca908";
 	}
 	// -- Secure
 	else if (nScore >= 80)
 	{
 		var strText = "Secure";
 		vstrColor = "#7ff67c";
	}
	// -- Very Strong
 	else if (nScore >= 70)
 	{
 		var strText = "Very Strong";
 		var strColor = "#1740ef";
	}
	// -- Strong
 	else if (nScore >= 60)
 	{
 		var strText = "Strong";
 		var strColor = "#5a74e3";
	}
	// -- Average
 	else if (nScore >= 50)
 	{
 		var strText = "Average";
 		var strColor = "#e3cb00";
	}
	// -- Weak
 	else if (nScore >= 25)
 	{
 		var strText = "Weak";
 		var strColor = "#e7d61a";
	}
	// -- Very Weak
 	else
 	{
 		var strText = "Very Weak";
 		var strColor = "#e71a1a";
	}
	ctlBar.style.backgroundColor = strColor;
	ctlText.innerHTML = "<span style='color: " + strColor + ";'>" + strText + " - " + nScore + "</span>";
}
 
// Checks a string for a list of characters
function countContain(strPassword, strCheck)
{ 
	// Declare variables
	var nCount = 0;
	
	for (i = 0; i < strPassword.length; i++) 
	{
		if (strCheck.indexOf(strPassword.charAt(i)) > -1) 
		{ 
	        	nCount++;
		} 
	} 
 
	return nCount; 
} 
 
