
var StringValidation = function()
{
	var resWhitespace = /^\s+$/
	var recWhitespace = /^\s$/
	var reLetter = /^[a-zA-Z]$/
	var reAlphabetic = /^[a-zA-Z]+$/
	var reAlphanumeric = /^[a-zA-Z0-9]+$/
	var reDigit = /^\d/
	var reLetterOrDigit = /^([a-zA-Z]|\d)$/
	var reInteger = /^\d+$/
	var reSignedInteger = /^(\+|\-)?\d+$/
	var reFloat = /^((\d+(\.\d*)?)|((\d*\.)?\d+))$/
	var reSignedFloat = /^(((\+|\-)?\d+(\.\d*)?)|((\+|\-)?(\d*\.)?\d+))$/
	var reEmail = /^.+\@.+\..+$/
	var reUrl = /(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/

	return 	{
		minimumPasswordLength:6,
		minimumUsernameLength:4,
		
		isEmpty:function(s)
		{
			return ((s == null) || (s.length == 0));
		},
		
		isWhitespace:function(s)
		{
			return (this.isEmpty(s) || resWhitespace.test(s));
		},
		
		isWhiteChar:function(c)
		{
			return recWhitespace.test(c);	
		},
		
		stripCharsInBag:function(s, bag)
		{
			var i;
			var returnString = "";
			
			for (i = 0; i < s.length; i++)
			{   
				var c = s.charAt(i);
				if (bag.indexOf(c) == -1) returnString += c;
			}
			
			return returnString;
		},
		
		keepCharsInBag:function(s, bag)
		{
			var i;
			var returnString = "";
			
			for (i = 0; i < s.length; i++)
			{   
				var c = s.charAt(i);
				if (bag.indexOf(c) != -1) returnString += c;
			}
			
			return returnString;
		},
		
		containsWhiteSpace:function(s)
		{
			var i;
			for (i=0; i<s.length; i++)	
				if (this.isWhiteChar(s.charAt(i)))
					return true;
			return false;
		},
		
		isStrongPassword:function(s)
		{
			
		},
		
		isWeakPassword:function(s)
		{
			
		},
		
		isSufficientPassword:function(s)
		{
			return !this.isEmpty(s) && s.length >= this.minimumPasswordLength;
		},

		isSufficientUsername:function(s)
		{
			return !this.isEmpty(s) && s.length >= this.minimumUsernameLength;
		},

		isContiguousUsername:function(s)
		{
			return !this.containsWhiteSpace(s);
		},
		
		isLetter:function(c)
		{
			return reLetter.test(c);
		},
		
		isDigit:function(c)
		{
			return reDigit.test(c);
		},
		
		isLetterOrDigit:function(c)
		{
			return reLetterOrDigit.test(c);
		},
		
		isInteger:function(s)
		{
			return reInteger.test(s);
		},
		
		isSignedInteger:function(s)
		{
			return reSignedInteger.test(s);
		},
		
		isPositiveInteger:function(s)
		{
			return this.isSignedInteger(s) && (parseInt(s,10) > 0);
		},
		
		isNonnegativeInteger:function(s)
		{
			return this.isSignedInteger(s) && (parseInt(s,10) >= 0);
		},
		
		isNegativeInteger:function(s)
		{
			return this.isSignedInteger(s) && (parseInt(s,10) < 0);
		},
		
		isNonpositiveInteger:function(s)
		{
			return this.isSignedInteger(s) && (parseInt(s,10) <= 0);
		},
		
		isFloat:function(s)
		{
			return reFloat.test(s);
		},
		
		isSignedFloat:function(s)
		{
			return reSignedFloat.test(s);
		},
		
		isAlphabetic:function(s)
		{
			return reAlphabetic.test(s);
		},
		
		isAlphanumeric:function(s)
		{
			return reAlphanumeric.test(s);
		},
		
		isEmail:function(s)
		{
			return reEmail.test(s);
		},
		
		isUrl:function(s)
		{
			return reUrl.test(s);
		},
		
		isUSPhoneNumber:function(s)
		{
			s = this.stripCharsInBag(s, "()- ");
			return this.isInteger(s) && s.length==10;
		},
		
		isInternationalPhoneNumber:function(s)
		{
			s = this.stripCharsInBag(s, "()- ");
			return this.isPositiveInteger(s);
		},
		
		
		isCreditCard:function(st) 
		{
			// Encoding only works on cards with less than 19 digits
			if (st.length > 19)
				return false;
			
			var sum = 0; 
			var mul = 1; 
			var l = st.length;
			for (i = 0; i < l; i++) 
			{
				var digit = st.substring(l-i-1,l-i);
				var tproduct = parseInt(digit ,10)*mul;
				sum += (tproduct >= 10 ? (tproduct%10)+1 : tproduct);
				mul += (mul==1 ? 1 : -1);
			}
			return ((sum % 10) == 0);
		},
		
		
		isVisa:function(cc)
		{
			cc = this.stripCharsInBag(cc," ");
			return (((cc.length == 16) || (cc.length == 13)) && (cc.substring(0,1) == 4)) && this.isCreditCard(cc);
		},  
		
		
		isMasterCard:function(cc)
		{
			cc = this.stripCharsInBag(cc," ");
			var firstdig = cc.substring(0,1);
			var seconddig = cc.substring(1,2);
			return ((cc.length == 16) && (firstdig == 5) && ((seconddig >= 1) && (seconddig <= 5))) && this.isCreditCard(cc);
		},
		
		isAmericanExpress:function(cc)
		{
			cc = this.stripCharsInBag(cc," ");
			var firstdig = cc.substring(0,1);
			var seconddig = cc.substring(1,2);
			return ((cc.length == 15) && (firstdig == 3) && ((seconddig == 4) || (seconddig == 7))) && this.isCreditCard(cc);
		}, 
		
		isDiscover:function(cc)
		{
			cc = this.stripCharsInBag(cc," ");
			var first4digs = cc.substring(0,4);
			return ((cc.length == 16) && (first4digs == "6011")) && this.isCreditCard(cc);
		},
		
		
		isAnyCreditCard:function(cc)
		{
			return this.isVisa(cc) || this.isMasterCard(cc) || this.isAmericanExpress(cc) || this.isDiscover(cc);
		},
		
		isValidExpiry:function(expiry)
		{
			return StringValidation.isPositiveInteger(expiry.month) && 
		       StringValidation.isPositiveInteger(expiry.year) &&	
		       expiry.month.length==2 && expiry.year.length==2;
		}	
	};
}();	
		




