// String functions & methods
// ------------------------------------------------------------------
// Validation Functions - EACH MUST RETURN A BOOLEAN

/*
- canadianPostalCodePattern
- emailPattern
- datePattern
- dateTimePattern
- timePattern
- luhnPattern
- stringPattern
- integerPattern
- floatPattern
*/


function canadianPostalCodePattern()
{
	var validFormat = false;
	var validCharacters = false;
	
	var postalCode = new String(this.value);
	var re = /^[a-zA-Z]\d[a-zA-Z] ?\d[a-zA-Z]\d$/;			// don't store characters to be tested yet

	validFormat = re.test(postalCode);

	if(!validFormat)
		return false;
	else
	{
		var re = /^([a-zA-Z])\d([a-zA-Z]) ?\d([a-zA-Z])\d$/gi;	// store characters to be tested
		var test1 = new RegExp("^[^WZDFIOQU]$", "gi");							// illegal characters on first letter
		var test2 = new RegExp("^[^DFIOQU]$", "gi");							// illegal characters on the 2nd letter
		var test3 = new RegExp("^[^DFIOQU]$", "gi");							// illegal characters on the 3rd letter
		var testLetters = new Array();
		
		re.exec(postalCode);
		testLetters[0] = new String(RegExp.$1);
		testLetters[1] = new String(RegExp.$2);
		testLetters[2] = new String(RegExp.$3);

		if(test1.test(testLetters[0]) && test2.test(testLetters[1]) && test3.test(testLetters[2]))
			return true;
		else
			return false;
	}
}

function datePattern()
{
	//--------------------------------------------------------
	// currently only tests for YYYY[/]MM[/]DD formats
	// valid separators are "/"
	//--------------------------------------------------------
 
	var val   = new String(this.value);
	var results;
	
	results = val.split("/");

	if(results.length == 3)
	{
		var yearPart = parseInt(results[0]);
		var monthPart = (results[1].charAt(0) != "0")?parseInt(results[1]):(results[1].length > 1)?parseInt(results[1].charAt(1)):parseInt(results[1]);
		var dayPart = (results[2].charAt(0) != "0")?parseInt(results[2]):(results[2].length > 1)?parseInt(results[2].charAt(1)):parseInt(results[2]);
		
		if(yearPart && monthPart && dayPart)
		{
			if(monthPart >= 1 && monthPart <= 12)
			{
				var testDate = new Date(yearPart,monthPart-1,1);
				var lastDayOfMonth = testDate.daysInMonth();
	   
				if(dayPart > lastDayOfMonth)
					return false;
	   
				return true;
			}
			else
			{
				return false;
			}
		}
		else
		{
			return false;
		}
	}

	return false;
}

function emailPattern()
{
	//var pat		= /^(\w|[^_]\.[^_]|[\-])+(([^_])(\@){1}([^_]))(([a-zA-Z]|[\d]|[_]|[\-])+|([^_]\.[^_])*)+\.[a-zA-Z]{2,3}$/gi;
	var pat			= new RegExp("^[\\w-_\.]*[\\w-_\.]\@[\\w]\.+[\\w]+[\\w]$", "gi");
	var val			= new String(this.value);
	return pat.test(val);
}

function dateTimePattern()
{
	alert("\"dateTimePattern\" not implimented");
}

function timePattern()
{
	alert("\"timePattern\" not implimented");
}

function luhnPattern()
{
	var cardNum			= new String(this.value);
	var sum				= 0;
	var	tmp;
	
	if(cardNum.integerPattern())
	{
		return false;
	}
	
	for(var i=cardNum.length-1, ctr=1; i >= 0; i--, ctr++)
	{
		if((ctr % 2) == 0)
		{
			tmp = parseInt(cardNum.charAt(i)) * 2;
			if(tmp > 9)
			{
				sum += 1;
				sum += tmp % 10;
			}
			else
				sum += tmp;
		}
		else
		{
			sum += parseInt(cardNum.charAt(i));
		}
	}
	return ((sum % 10) == 0);
}

function stringPattern()
{
	return (this.value).length > 0;
}

function integerPattern()
{
	var intp		= /^[\d]{1,}$/gi;
	var val			= new String(this.value);
	
	return intp.test(val);
}

function floatPattern()
{
	var floatp		= /^[\d]{1,}\.?[\d]{1,}$/gi;
	var val			= new String(this.value);
	
	return floatp.test(val);
}

String.prototype.canadianPostalCodePattern	= canadianPostalCodePattern;
String.prototype.emailPattern				= emailPattern;
String.prototype.stringPattern				= stringPattern;
String.prototype.integerPattern				= integerPattern;
String.prototype.floatPattern				= floatPattern;
String.prototype.luhnPattern				= luhnPattern;
String.prototype.datePattern				= datePattern;
String.prototype.dateTimePattern			= dateTimePattern;
String.prototype.timePattern				= timePattern;

