
//cleaning the nuber string------------------------------------
function cleanString(str){

	var re;
	var num;
	
	re = /\-/g;
	num = str.replace(re,"");
			
	re = /\s/g;
	num = num.replace(re,"");
			
	re = /\_/g;
	num = num.replace(re,"");
				
	re=/\W/g;
	num = num.replace(re,"");
	
	return num;
			
}

function checkCardLaw(ccnum){

			//***check if ccnum is valid*******************************************
			var valid=false;
			var num=ccnum.length;
			
			
			if (num >7 && num <20 && !isNaN(ccnum)){
			
			
				if(num==8 || num==9){//checking isracart
					var valid=true;
						
			}
				var isAmex=false;
				switch(num){
					case(13): //visa
						
						if(ccnum.indexOf('4')==0)
							valid=true; //visa 
						
						break;
					case(14): //diners
						
						if(ccnum.indexOf('30')==0 || ccnum.indexOf('36')==0 || ccnum.indexOf('55')==0 || ccnum.indexOf('38')==0)
							valid=true; //diners
						break;
					
					case(15):
						
						if(ccnum.indexOf('30')==0 || ccnum.indexOf('36')==0 || ccnum.indexOf('55')==0 || ccnum.indexOf('6')==0)
							valid=true; //diners
						if(ccnum.indexOf('37')==0 || ccnum.indexOf('34')==0){
							valid=true; //amex
							isAmex=true;
							}
						break;
					case(16):
						if(ccnum.indexOf('30')==0 || ccnum.indexOf('36')==0 || ccnum.indexOf('55')==0 )
							valid=true; //diners
						if(ccnum.indexOf('5')==0)
							valid=true; //mc
							if(ccnum.indexOf('4')==0)
							valid=true; //visa 
							if(ccnum.indexOf('6')==0)
							valid=true; //solo 
							if(ccnum.indexOf('35')==0)
							valid=true; //jcb	
						break;
					case(17):
						if(ccnum.indexOf('6')==0)
							valid=true; //solo	
						break;
					case(18):
						if(ccnum.indexOf('6')==0)
							valid=true; //solo	
						break;
					case(19):
						if(ccnum.indexOf('6')==0)
							valid=true; //solo	
						break;
					default: break;
	
				}
			
			}
			
		//alert("law: "+valid);
				return valid;
					
		//return mod10(ccnum);
			
}

function mod10(ccnum){

	var len=ccnum.length;
	var number=new Array();
	var i;
	for ( i=0;i<len;i++){
		number[i]=ccnum.charAt(i);
		 
	}
	// Use Luhn Algorithm to validate
			var sum = 0;
			var counter=1;
			for ( i = len - 1; i >= 0; i--)
			{
				
				if (counter==2)
				{
					var n = number[i] * 2;
					switch (n){
						case (10): sum+=1;break;
						case (12): sum+=3; break;
						case (14): sum+=5; break;
						case (16): sum+=7; break;
						case (18): sum+=9; break;
						default: sum+=n; break;
					}
					counter--;
				}
				else{
					sum += number[i]*1;
					counter++;
					}
			}
//alert("sum mod10:" +sum);
			if ((sum % 10 == 0))
				return true;

	
//	alert("mod10- false");
	return false;
}



function mod11(CardNumber){
	var CardValid = false;
	var len = CardNumber.length;
		
			//checking mod11
			if(len==8)
			{
				var number1 = new Array(); 
				var num1=0;
				var num2=9;
				var sum1=0;
				CardNumber="0"+CardNumber;
				//alert("mod11 CardNumber 8:" +CardNumber);
				len=9;
			}
			
			if(len==9)
			{
			
				var number2 = new Array(); // number to validate
				var num3=0;
				var num4=9;
				var sum2=0;
				for ( k=0;k<CardNumber.Length;k++)
				{
					number2[num3]=CardNumber[k];
					number2[num3]*=num4;
					sum2+=number2[num3];
					num3++;
					num4--;
				}

				if ((sum2 % 11 == 0))
					return true; 
			}
	//alert("mod11- false");
	return false;
}

function validateCC(ccnum){
	//alert("yes");
	var cleanCC=cleanString(ccnum);
	//alert(cleanCC);
	var validCC=checkCardLaw(cleanCC);
	//alert("low: "+validCC);
	if (!validCC)
		return false;	
		
		var mod10CC=mod10(cleanCC);
	//	alert("mod 10:"+mod10CC);
		var mod11CC=mod11(cleanCC);
	//	alert("mod11: "+mod11CC);
		if (mod10CC==true || mod11CC==true)
			return true;
	
	return false;
}

function validateCVV(ccnum, cvv){
	var num=ccnum.length;
	
	if (!isNaN(cvv))
	{
			var cleanCC=cleanString(ccnum);
			var cleanCVV=cleanString(cvv);
			var ccLen=cleanCC.length;
			var cvvLen=cleanCVV.length;
		if(!validateCC(ccnum)){
			if(cvvLen==3 || cvvLen==4)
				return true;
		
		}
		else{	
				if(num==8 || num==9){//checking isracart
					if(cvvLen==3 || cvvLen==4)
						return true;
						
				}
				switch(num){
					case(13): //visa
						
						if(ccnum.indexOf('4')==0){
							if(cvvLen==3)
								return true; 
							
							}
						
						break;
					case(14): //diners
						
						if(ccnum.indexOf('30')==0 || ccnum.indexOf('36')==0 || ccnum.indexOf('55')==0 || ccnum.indexOf('38')==0)
							{
								if(cvvLen==3 )
									return true;
							}
						break;
					
					case(15):
						
						if(ccnum.indexOf('30')==0 || ccnum.indexOf('36')==0 || ccnum.indexOf('55')==0 || ccnum.indexOf('6')==0)
							{
							if(cvvLen==3)
								return true;
							}
							
						if(ccnum.indexOf('37')==0 || ccnum.indexOf('34')==0){
							if(cvvLen==3 || cvvLen==4)
								return true;
							}
						break;
					case(16):
						if(ccnum.indexOf('30')==0 || ccnum.indexOf('36')==0 || ccnum.indexOf('55')==0 )
							{
								if(cvvLen==3)
									return true;
							}
						if(ccnum.indexOf('5')==0)
							{
								if(cvvLen==3)
									return true;
							}
							if(ccnum.indexOf('4')==0)
							{
								if(cvvLen==3)
									return true;
							} 
							if(ccnum.indexOf('6')==0)
							{
								if(cvvLen==3)
									return true;
							} 
							if(ccnum.indexOf('35')==0)
							{
								if(cvvLen==4)
									return true;
							}
						break;
					case(17):
						if(ccnum.indexOf('6')==0)
							{
								if(cvvLen==3)
									return true;
							} 
						break;
					case(18):
						if(ccnum.indexOf('6')==0)
						{
								if(cvvLen==3)
									return true;
							} 
						break;
					case(19):
						if(ccnum.indexOf('6')==0)
							{
								if(cvvLen==3)
									return true;
							} 
						break;
					default: break;
	
				}
			
			
			
			}
		}
		
			return false;
	}




function vlidateDate(month,year){
	var now = new Date();
	//alert(now);
	var nowyear = now.getYear();
    var nowmonth = now.getMonth()+1;
    year="20"+year;
 //  alert(nowmonth+"  "+month);
 //   alert(nowyear+"  "+year);
	if ( year*1>nowyear*1)
		return true;
	
	if((month*1>=nowmonth*1)){
		if ( year*1==nowyear*1)
		return true;
		}
 
	return false;

}

function validateHolder(Holder){
	var len=Holder.length;
	if ((len != 0) && (/^[A-Za-z ]*$/.test(Holder)))
		return true;
	return false;
			
}

function validateCountry(selectedCountryIndex){
	
	if (selectedCountryIndex >0)
		return true;
	return false;

}

function ffvalidate(ccnum){
	if (!validateCC(ccnum))
		return false;
	return true;
}

function ffvalidate(ccnum, cvv){

	if (!validateCC(ccnum))
		return false;
	if(!validateCVV(ccnum, cvv))
		return false;
	return true;
}

function ffvalidate(ccnum, cvv,month,year){
//alert("lsdfksdfghj");
	if (!validateCC(ccnum))
		return false;
	if(!validateCVV(ccnum, cvv))
		return false;
	if(!vlidateDate(month,year))
		return false;
	
	return true;
		
}

function ffvalidate(ccnum, cvv,month,year,holder){
	if (!validateCC(ccnum))
		return false;
	if(!validateCVV(ccnum, cvv))
		return false;
	if(!vlidateDate(month,year))
		return false;
	if(!validateHolder(holder))
		return false;
	
	return true;
		
}

function ffvalidate(ccnum, cvv,month,year,holder,selectedCountryIndex){
	if (!validateCC(ccnum))
		return false;
	if(!validateCVV(ccnum, cvv))
		return false;
	if(!vlidateDate(month,year))
		return false;
	if(!validateHolder(holder))
		return false;
	if(!validateCountry(selectedCountryIndex))
		return false;
	return true;
		
}

function ffvalidateGetString(ccnum, cvv,month,year,holder,selectedCountryIndex){

	var err="USAGC SAY: \n";
	
	if (!validateCC(ccnum))
		err+="Credit card number is invalid!\n"
		//alert(err);
	if(!validateCVV(ccnum, cvv))
		err+="The security code you wrote is invalid (MUST BE 3 DIGITS!!!)\n";
		//alert(err);
	if(!vlidateDate(month,year))
		err += "ERROR! The credit card Expiration date is over due!\n";
		//alert(err);
	if(!validateHolder(holder))
		err += "You didnt Write the credit card holder's First name\n";
	//	alert(err);
	if(!validateCountry(selectedCountryIndex))
		err += "You didnt choose your Billing Country\n";
	//	alert(err);
	
	if (err!="USAGC SAY: \n")
		return err;
	else
		return "";


		return "";
}

function ffvalidateGetArr(ccnum, cvv,month,year,holder,selectedCountryIndex){
	var arr=new Array();
	var i=0;
	///////////////////////////////////////
	var cleanCC=cleanString(ccnum);
	//alert(cleanCC);
	var validCC=checkCardLaw(cleanCC);
	//alert("low: "+validCC);
	if (!validCC){
		arr[i]=false;
		i++;	
		}
	else{
		arr[i]=true;
			i++;
	}
		var mod10CC=mod10(cleanCC);
	//	alert("mod 10:"+mod10CC);
		var mod11CC=mod11(cleanCC);
	//	alert("mod11: "+mod11CC);
		if (mod10CC==true || mod11CC==true){
			arr[i]=true;
			i++;
	}

	//////////////////////////////////////////
	else{
		arr[i]=false;
		i++;
	}
	if(!validateCVV(ccnum, cvv)){
		arr[i]=false;
		i++;
	}
	else{
		arr[i]=true;
		i++;
	}
	if(!vlidateDate(month,year)){
		arr[i]=false;
		i++;
	}
	else{
		arr[i]=true;
		i++;
	}
	if(!validateHolder(holder)){
		arr[i]=false;
		i++;
	}
	else{
		arr[i]=true;
		i++;
	}
	if(!validateCountry(selectedCountryIndex)){
		arr[i]=false;
		i++;
	}
	else{
		arr[i]=true;
		i++;
	}
	return arr;
		
}