// get element value after removing leading and trailing spaces
function RemoveLTSpace(elemval)
{
	var val=elemval.replace(/\s*/,"")
	var val=val.replace(/\s*$/,"")
	return val;
}

// validation for e-mail
function isEmailAddr(email)
{
	  var result = false
	  var theStr = new String(email)

	  //If space if found in the email
	  for(i=0;i<theStr.length;i++)
	  {
		  if(theStr.charCodeAt(i)==32)
			 return false;     
	  }

	  //If the length of email is less than 6 in length	
	  if(RemoveLTSpace(theStr).length < 6)
		return false;

	  //Check for @ character
	  var index = theStr.indexOf('@'); 
	  //If @ character is found.
	  if (index > 0)
	  {
			var pindex = theStr.indexOf(".",index);
			if ((pindex > index+1) && (theStr.length > pindex+1))
			  result = true;

			theStr2 = theStr.substring(pindex+1, theStr.length);       
			var pindex2 = theStr2.indexOf(".",0);
			
			if(pindex2==0)
				 result=false;
			else if(pindex2 > 0)
			{
				if(theStr.length > (pindex2+pindex+2))
					 result=true;
				else
					result=false;
				theStr3 = theStr.substring(pindex2+pindex+2, theStr.length);
				
				var pindex3 = theStr3.indexOf(".",0);
				
				if(pindex3==0 || pindex3>0)
					result= false;					
			}     
			return result;
	  }
}
// this function used to check valid chars
function check_validchar(pattern,str)
{
  var re = new RegExp(pattern,"g");
  var arr = re.test(str);
   return arr;
}  

function JSvalid_form(formnm)
{

	var formnm=eval(document.forms[formnm]);	
	for(var i=0;i<formnm.elements.length;i++)	
	{
	



// Validation for combo box
   
		if(formnm.elements[i].title)
		{
			// START CHECK FOR BLANK
		
			var altval=formnm.elements[i].title;
			
			var altval1=altval.split("~DM~");			

			//BLANK VALUE CHECK

			//BLANK VALUE CHECK
			for(z=0; z< altval1.lenght ; z++);
			{
				if(altval1[z]=="DC" && RemoveLTSpace(formnm.elements[i].value)=="")
				{
					formnm.elements[i].value=RemoveLTSpace(formnm.elements[i].value);
					alert("Please select "+altval1[1]);
					formnm.elements[i].focus();
					return false;
				}

			}

	for(z=0; z< altval1.lenght ; z++);
			{
				if(altval1[z]=="BC" && RemoveLTSpace(formnm.elements[i].value)=="")
				{
					formnm.elements[i].value=RemoveLTSpace(formnm.elements[i].value);
					alert("Please enter "+altval1[1]);
					formnm.elements[i].focus();
					return false;
				}

			}


		}










	
		if(formnm.elements[i].alt)
		{
			// START CHECK FOR BLANK
		
			var altval=formnm.elements[i].alt;
			
			var altval1=altval.split("~DM~");			

			//BLANK VALUE CHECK
			for(z=0; z< altval1.lenght ; z++);
			{

				if(altval1[z]=="BC" && RemoveLTSpace(formnm.elements[i].value)=="")
				{
					formnm.elements[i].value=RemoveLTSpace(formnm.elements[i].value);
					
					alert("Please enter "+altval1[1]);
					
					formnm.elements[i].focus();
					return false;
				}

			}

			//BLANK VALUE CHECK
			for(z=0; z< altval1.lenght ; z++);
			{
				if(altval1[z]=="DC" && RemoveLTSpace(formnm.elements[i].value)=="")
				{
					formnm.elements[i].value=RemoveLTSpace(formnm.elements[i].value);
					alert("Please select "+altval1[1]);
					formnm.elements[i].focus();
					return false;
				}

			}
             //MIN-MAX VALUE CHECK
			 for(j=0;j<altval1.length;j++)
		   	 {				 
				  altInnerArray=altval1[j].split("~");  
				  switch(altInnerArray[0])
				  {
					   case "MAXLENGTH" : 					  
						   var len;
								if(altInnerArray[2])
								{
									len=parseInt(altInnerArray[2]);
									if(formnm.elements[i].value.length > len && len > 0)	
									{
										alert(altInnerArray[1] + " field exceeded max limit of " + len + " letters.");
										formnm.elements[i].focus();
										formnm.elements[i].select();
										return false;
									}
								}
						 break;
					   case "MAXMINLENGTH" : 	
						   var minlen,maxlen;
								if(altInnerArray[2] && altInnerArray[3] && formnm.elements[i].value.length > 0)
								{
									minlen=parseInt(altInnerArray[2]);
									maxlen=parseInt(altInnerArray[3]);
									if(formnm.elements[i].value.length > maxlen || formnm.elements[i].value.length < minlen)	
									{
										alert(altInnerArray[1] + " field must be between " + minlen + " to " + maxlen + " letters. ");
										formnm.elements[i].focus();
										formnm.elements[i].select();
										return false;
									}
								}
						 break;
					}
			  }
			 //MIN-MAX VALUE CHECK ends

			//Start of Username/Email check
			for(z=0; z < altval1.length ; z++)
			{
				//Check for valid characters in UserName
				if(altval1[z] == "USERNAMECHK")
				{	
					if(!usernameCheck(formnm.elements[i].value))
					{
						alert("Sorry, " + altval1[z+1] + " can contain only Alphabets, Numbers, . , - , _ \nbeginning with alphanumeric character");
						formnm.elements[i].focus();
						formnm.elements[i].select();
						return false;
					}
				}
			
				//Check for valid email address
				if(formnm.elements[i].value.length > 0 && altval1[z] == "EMAIL")
				{	
					if (!isEmailAddr(formnm.elements[i].value))
					{
						alert("Invalid Email ID. Please enter the valid email-id in the form: yourname@yourdomain.com");
						formnm.elements[i].focus();
						formnm.elements[i].select();
						return false;
					}
				}



	//Check for valid user name 

				if(formnm.elements[i].value.length > 0 && altval1[z] == "EMAILUSER")
				{	
					if (!isEmailAddr(formnm.elements[i].value))
					{
						alert("Invalid User ID. Please enter the valid user name in the form: yourname@yourdomain.com");
						formnm.elements[i].focus();
						formnm.elements[i].select();
						return false;
					}
				}




				//Check for numeric value
				if(altval1[z] == "NUMERIC")
				{
					if(!isWholeNumber(formnm.elements[i].value)) 
					{
						alert("Sorry, " + altval1[z+1] + " can accept only numeric data. ");
						formnm.elements[i].focus();
						formnm.elements[i].select();
						return false;
					}
				}
				
				//Check for valid Phone Numer address
				if(altval1[z] == "CHKPHONE")
				{	
					if(formnm.elements[i].value.length > 0 && !isPhoneFax(formnm.elements[i].value))
					{
						alert("Please enter " + altval1[z+1] + " in the following format  xxx-xxx-xxxx.\nSimple brackets and spaces can be use in place of - as a separator");
						formnm.elements[i].focus();
						formnm.elements[i].select();
						return false;
					}
				}
				
				//Check for valid SSN Number
				if(altval1[z] == "CHKSSN")
				{	
					if(formnm.elements[i].value.length > 0)
					{
						msg = isSSN(formnm.elements[i].value);
						if(msg == "invalidAreaCode" || msg == "invalidSSN" )
						{
							if(msg == "invalidAreaCode")
								alert("Sorry,Invalid numbers entered in Area number");
							else	
								alert("Please enter SSN in the following format  xxx-xx-xxxx. Spaces can be use in place of hyphen as a separator");
							formnm.elements[i].focus();
							formnm.elements[i].select();
							return false;
						}
					}
				}				
				
				//Check for valid Name on Card
				if(altval1[z] == "CARDNAME")
				{	
					if(formnm.elements[i].value.length > 0 && !isCardName(formnm.elements[i].value))
					{
						alert("Sorry, Name on Card must be between 6 to 20 characters and cannot contain \n special characters other than alphabets, numbers, underscore, space, hyphen and dot");
						formnm.elements[i].focus();
						formnm.elements[i].select();
						return false;
					}
				}	
				
				//Check for valid Double values
				if(altval1[z] == "ISDBL")
				{	
					if(formnm.elements[i].value.length > 0 && !isDouble(formnm.elements[i].value))
					{
						alert("Sorry, " + altval1[z+1] + " can accept numeric values in the format xxxxxx.xx");
						formnm.elements[i].focus();
						formnm.elements[i].select();
						return false;
					}
				}	
				
				//Check for valid Decimal values
				if(altval1[z] == "ISDEC")
				{	
					if(formnm.elements[i].value.length > 0 && !isDecimal(formnm.elements[i].value))
					{
						alert("Sorry, " + altval1[z+1] + " can accept decimal values only.");
						formnm.elements[i].focus();
						formnm.elements[i].select();
						return false;
					}
				}	
				
				//Check for valid Decimal values
				if(altval1[z] == "ISNUM")
				{	
					if(formnm.elements[i].value.length > 0 && !isWholeNumber(formnm.elements[i].value))
					{
						alert("Sorry, " + altval1[z+1] + " can accept numeric values only.");
						formnm.elements[i].focus();
						formnm.elements[i].select();
						return false;
					}
				}											

				//Check for valid date
				if(altval1[z] == "CHKDATE")
				{	
					if(formnm.elements[i].value.length > 0 )
					{
						msg = checkDateValidity(formnm.elements[i].value);
						if(msg == "InvalidFormat" || msg == "InvalidDate" || msg == "InvalidBirthDate")
						{		
							if(msg == "InvalidFormat")
									alert('Invalid Date Format. Please enter date in mm-dd-yyyy format');
							else if(msg == "InvalidDate")		
						 			alert('Invalid Day, Month, or Year range detected. Please correct.');
						 	else
						 			alert(altval1[z+1] + ' can not be greater than current date');
							formnm.elements[i].focus();
							formnm.elements[i].select();
							return false;
						}
					}
				}				
											
				//Check for valid date
				if(altval1[z] == "CHKFUTUREDT")
				{	
					if(formnm.elements[i].value.length > 0 )
					{
						msg = checkFutureDateValidity(formnm.elements[i].value);
						if(msg == "InvalidFormat" || msg == "InvalidDate" || msg == "InvalidFutureDate")
						{		
							if(msg == "InvalidFormat")
									alert('Invalid Date Format. Please enter date in mm-dd-yyyy format');
							else if(msg == "InvalidDate")		
						 			alert('Invalid Day, Month, or Year range detected. Please correct.');
						 	else
						 			alert(altval1[z+1] + ' can not be less than current date');
							formnm.elements[i].focus();
							formnm.elements[i].select();
							return false;
						}
					}
				}			
			}
			//End of Username/Email check

		}
	}
	//alert("exiting JSvalid_form function form=");
	return true;
}

function usernameCheck(str)
{
	// Check for 1st character to be alphanumeric
	ascCode=str.charCodeAt(0);
	if((ascCode>=65 && ascCode<=90) || 
		(ascCode>=97 && ascCode<=122) || 
		(ascCode>=48 && ascCode<=57) 
		);
		else
		{
			return false;
		} 

	//check for invalid character in remaining part of the string.	
	for (i=0;i<str.length;i++){
		ascCode=str.charCodeAt(i);
	    if(	(ascCode>=65 && ascCode<=90) || 
			(ascCode>=97 && ascCode<=122) || 
			(ascCode>=48 && ascCode<=57) || 
			(ascCode==95) || (ascCode==46) || (ascCode==45)
		);
		else
		{
			return false;
		}
	}
	return true;
}

function isPhoneFax(str)
{
     // Check for correct phone code
     //xxx-xxx-xxxx or xxx xxx xxxx
     rePhoneFax1 = new RegExp(/(^\d{3}([-\s]?)\d{3}([-\s]?)\d{4}$)/);
     //(xxx)(xxx)(xxxx)
     rePhoneFax2 = new RegExp(/\(([\d]{3})\)\(([\d]{3})\)\(([\d]{4})\)/);
     //(xxx)xxx xxxx || (xxx)xxx-xxxx  || (xxx)xxxxxxx
     rePhoneFax3 = new RegExp(/\(([\d]{3})\)\d{3}([-\s]?)\d{4}$/);
     if (rePhoneFax1.test(str) || rePhoneFax2.test(str) || rePhoneFax3.test(str)) 
          return true;
     else
     	  return false;	     
}

function isSSN(str)
{
     // Check for correct SSN Number
     //xxx-xx-xxxx or xxx xx xxxx 
     reSSN1 = new RegExp(/(^\d{3}([-\s]?)\d{2}([-\s]?)\d{4}$)/);
     areaCode= str.substring(0,3);
	 if (reSSN1.test(str))
	 {
	 	if( areaCode=="666" || areaCode=="000" || (areaCode>=900 && areaCode<=999))
	 		return "invalidAreaCode";
	 	else
	 		return "validAreaCode";
     }
	 else
	 {
	 	return "invalidSSN";
	 }     
}

function isCardName(str)
{
     // Check for correct card name
     //xxx-xxx-xxxx or xxx xxx xxxx
     reCardName = new RegExp(/^\w([\w\s\.-]){5,19}$/);
     if (reCardName.test(str)) 
          return true;
     else
     	  return false;	     
}

// function for password match
function password_match(pass1,pass2)
{
	//alert(pass1 + ',' + pass2);
	pass1=eval(pass1);
	pass2=eval(pass2);
	if(pass1.value!=pass2.value)
	{
			return false;
	}
		return true;
}

//This function is used select/deselect all the checkboxes provided the formname and initial checkbox name
	   function selectCheckbox(frmName,cbxName) 
	   {
		   var frm = eval(document.forms[frmName]);
		   for(var i = 0; i < frm.length; i++)
   		   {
				 if(frm.elements[i].type == "checkbox") 
				 		frm.elements[i].checked= (frm.elements[cbxName].checked)? true : false;
			}	 		
	   }

//This function is used select/deselect all the checkboxes provided the formname and initial checkbox name
   function checkselectCheckbox(frmName,cbxName) 
   {
       var frm = eval(document.forms[frmName]);
       var flag = true;
       var eleID;
       for(var i = 0; i < frm.length; i++)
          {
               if(frm.elements[i].type == "checkbox" && frm.elements[i].name == cbxName)
                       eleID = i;
                     if(frm.elements[i].type == "checkbox" && frm.elements[i].name != cbxName) 
                                     if(frm.elements[i].checked == false)
                                    {
                                            flag = false;
                                            break;
                                    }
            }
                     if(flag == false)
                             frm.elements[eleID].checked = false;
                     if(flag == true)
                             frm.elements[eleID].checked = true;

   }	   

//This function is used to validate credit-card	   

//This function is used to check if an option is selected.
function checkOptionSelected(controlName , displayName)
{
	var optSelected = document.getElementById(controlName).options[document.getElementById(controlName).selectedIndex].value ;
	if(optSelected=="0")
	{	
		alert("Please select a value for " + displayName);
		document.getElementById(controlName).focus();		
		return false;
	}
	return true;	
}

//This function is used to check for the validity of credit card.
function checkCCNumber(controlName)
{
	//Find the option selected
	var optSelected = document.getElementById(controlName).options[document.getElementById(controlName).selectedIndex].value ;
	//Check , if Visa has been selected 
	switch(optSelected)
	{
	     case "1" : //Visa //Prefix 4 , length 13 or 16 
	     			regExp =  new RegExp(/^4(([\d]{12})|([\d]{15}))$/);
	     			break;

	     case "2" : //Master //Prefix 51-55 , length 16 
	     			regExp =  new RegExp(/^5[1-5]([\d]{14})$/);
	     			break;
	      
	     case "3" : //Amex //Prefix 34,37 , length 15
	     			regExp =  new RegExp(/^3(4|7)([\d]{13})$/);
	     			break;

	     case "4" :
	     case "5" : //Diners|Carte //Prefix 300-305 or 36, length 14
	     			regExp =  new RegExp(/((^30[0-5]([\d]{11})$)|(^36([\d]{12})$))/);
	     			break;

	     case "6" : //Discover //Prefix  6011 , length 16
	     			regExp =  new RegExp(/^6011([\d]{12})$/);
	     			break;
	   
	     case "7" : //JCB //(Prefix  2131,1800,length 15) OR  (Prefix 3,length 16)
	     			regExp =  new RegExp(/^6011([\d]{12})$/);
	     			break;
	}
	str = document.getElementById('CCNumber').value;
	if(!regExp.test(str)) 
	{
		alert("Sorry,This Card Number is not Valid");
		document.getElementById('CCNumber').focus();
		document.getElementById('CCNumber').select();
		return false;
	}	
	return true;	
}	

//Check for Expiry Date
function chkExpiryDate(cntrlExpiryYear , cntrlExpiryMon)
{
	//Find the current year
	var dtToday = new Date();
	//If the year selected 
	if(dtToday.getFullYear()== document.getElementById(cntrlExpiryYear).options[document.getElementById(cntrlExpiryYear).selectedIndex].value)
	{
		if(document.getElementById(cntrlExpiryMon).options[document.getElementById(cntrlExpiryMon).selectedIndex].value < (dtToday.getMonth()+1))
		{
			alert("Sorry, Expiry Date can not be less than current date");
			document.getElementById(cntrlExpiryMon).focus();		
			return false;
		}					
	}
	return true;		
}

function checkDateValidity(strDate)
{
   var validformat=/^[\d]{1,2}\-[\d]{1,2}\-[\d]{4}$/ //Basic check for format validity
   if (!validformat.test(strDate))
   {
      return "InvalidFormat";
   }
   else
   {
   		var monthfield= strDate.split("-")[0]
  	 	var dayfield = strDate.split("-")[1]
   		var yearfield= strDate.split("-")[2]
 
   		var dayobj = new Date(yearfield, monthfield-1, dayfield)
   		if ((dayobj.getMonth()+1!=monthfield)||(dayobj.getDate()!=dayfield)||(dayobj.getFullYear()!=yearfield))
   		{
			return "InvalidDate";
   		}
   		if(dayobj > (new Date()))
   		{	
   			return "InvalidBirthDate";
   		}	
  	}
}

function isDouble(str)
{
     reDouble = new RegExp(/(^\d{0,6}\.?\d{0,2}$)/);
     if (reDouble.test(str)) 
          return true;
     else
     	  return false;	     
}

function isDecimal(str)
{
     str=filterNum(str);
     reDecimal = new RegExp(/(^\d{0,8}\.?[\d]*$)/);
     if (reDecimal.test(str)) 
          return true;
     else
     	  return false;	     
}

function isWholeNumber(str)
{
     reDecimal = new RegExp(/(^[\d]*$)/);
     if (reDecimal.test(str)) 
          return true;
     else
     	  return false;	     
}

function roundDigits(cntrlValue,rndDigits)
{
	//Check if controlvalue is empty.
	if(cntrlValue == "" || cntrlValue == 0)
	{
		if(rndDigits==2) cntrlValue = "0.00";
		if(rndDigits==1) cntrlValue = "0.0";
		if(rndDigits==0) cntrlValue = "0";
	}
	else
	{
		//logic Round-off the number to two places of decimal
		if(rndDigits == 2)
			cntrlValue = cntrlValue * 100;
		else if(rndDigits == 1)
			cntrlValue = cntrlValue * 10;
		cntrlValue = Math.round(cntrlValue);
	} 
	if(cntrlValue!= 0 && rndDigits > 0 )
	{
	 	cntrlValue = "" + cntrlValue;
	 	len = cntrlValue.length;
	 	cntrlValue = cntrlValue.substring(0, len - rndDigits) + "." + cntrlValue.substring(len - rndDigits, len);
	}
	 return cntrlValue ;
	 
}

function filterNum(str) 
{
          re = /\$|,|@|#|~|`|\%|\*|\^|\&|\(|\)|\+|\=|\[|\-|\_|\]|\[|\}|\{|\;|\:|\'|\"|\<|\>|\?|\||\\|\!|\$|/g;
          // remove special characters like "$" and "," etc...
          return str.replace(re, "");
}

function addCommas(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}


function calculateInterest(intType,rate,time,principle)
{
	var interest = "0.00" ;
	switch(intType)
	{	
		case "Fixed" :	time = time * 12 ;
						interest = ((rate/1200)/(1- Math.pow((1/(1+(rate/1200))),time)))* principle   ;
						interest = roundDigits(interest , 2);
						break;
	}
	return interest ;	
}	

function calculate_payment(PV, IR, NP) 
{
	var PMT = (PV * IR) / (1 - Math.pow(1 + IR, -NP))
	return roundDigits(PMT, 2)
}
	
	
	
	function checkFutureDateValidity(strDate)
{
   var validformat=/^[\d]{1,2}\-[\d]{1,2}\-[\d]{4}$/ //Basic check for format validity
   if (!validformat.test(strDate))
   {
      return "InvalidFormat";
   }
   else
   {
   		var todaysDate = new Date();
   		var monthfield= strDate.split("-")[0]
  	 	var dayfield = strDate.split("-")[1]
   		var yearfield= strDate.split("-")[2]
 
   		var dayobj = new Date(yearfield, monthfield-1, dayfield , todaysDate.getHours(), todaysDate.getMinutes(), (todaysDate.getSeconds()+1))
   		if ((dayobj.getMonth()+1!= monthfield)||(dayobj.getDate()!=dayfield)||(dayobj.getFullYear()!=yearfield))
   		{
			return "InvalidDate";
   		}
   		if(dayobj < todaysDate)
   		{	
   			return "InvalidFutureDate";
   		}	
  	}
}