function evaluateZipCode (regularExpression, zipCodeContainer, errorMessage)
{
	var match = regularExpression.test(zipCodeContainer.val().toUpperCase());
	
	if (zipCodeContainer.val() === '')
	{
		zipCodeContainer.siblings('[id=zipCodeErrorMessage]').remove();
		zipCodeContainer.after('<label id="zipCodeErrorMessage" class="error">' + errorMessage + '</label>');
		
		match = false;
	}
	else if (match)
	{
		zipCodeContainer.siblings('#zipCodeErrorMessage').remove();
	}
	else
	{
		zipCodeContainer.siblings('[id=zipCodeErrorMessage]').remove();
		zipCodeContainer.after('<label id="zipCodeErrorMessage" class="error">' + errorMessage + '</label>');
	}

	return match;
}

function validateZipCode (parentObject)
{
	var zipCodeContainer = parentObject.find('#tbZIPCODE'),
		countryCodeContainer = parentObject.find('#tbCOUNTRY'),
		americanZipCode = /^([0-9]{5}(?:-[0-9]{4})?)*$/,
		canadianPostalCode = /^[ABCEGHJ-NPRSTVXYabcdeghj-nprstvxy]{1}[0-9]{1}[ABCEGHJ-NPRSTV-Zabceghj-nprstv-z]{1}[ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Zabceghj-nprstv-z]{1}[0-9]{1}$/,
		canadianError = 'Please enter a valid 6 character Postal Code',
		americanError = 'Please enter a valid 5 digit Zip Code',
		passed;

	if (zipCodeContainer.hasClass('required'))
	{
		if (countryCodeContainer.val() === 'US')
		{
			passed = evaluateZipCode (americanZipCode, zipCodeContainer, americanError);
		}
		else if (countryCodeContainer.val() === 'CA')
		{
			passed = evaluateZipCode (canadianPostalCode, zipCodeContainer, canadianError);
		}
	}
	else
	{
		if (zipCodeContainer.val().trim() !== '' && countryCodeContainer === 'US')
		{
			passed = evaluateZipCode (americanZipCode, zipCodeContainer, americanError);				
		}
		else if (zipCodeContainer.val().trim() !== '' && countryCodeContainer === 'CA')
		{
			passed = evaluateZipCode (canadianPostalCode, zipCodeContainer, canadianError);
		}
	}
	
	return passed;
}

$.fn.validatePostalOrZip = function ()
{
	$.elements = 
	{
		currentElement: $(this[0]),
		americanZipCode: /^([0-9]{5}(?:-[0-9]{4})?)*$/,
		canadianPostalCode: /^[ABCEGHJ-NPRSTVXYabcdeghj-nprstvxy]{1}[0-9]{1}[ABCEGHJ-NPRSTV-Zabceghj-nprstv-z]{1}[ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Zabceghj-nprstv-z]{1}[0-9]{1}$/,
		passed: true
	}

		
	if ($.elements.currentElement.parent().children(':first').text() === 'Postal Code')
	{
		if (!$.elements.canadianPostalCode.test($.elements.currentElement.val().toUpperCase()))
		{
			$('#errorContainerforPostalCode').remove();
			$('#errorContainerForZipCode').remove();
			$.elements.currentElement.parent().append('<span class="error" id="errorContainerforPostalCode"><br />Please enter a valid 6 character Postal Code</span>');
			$.elements.passed = false;
		}
	}
	else if ($.elements.currentElement.parent().children(':first').text() === 'Zip Code')
	{
		if (!$.elements.americanZipCode.test($.elements.currentElement.val().toUpperCase()))
		{		
			$('#errorContainerforPostalCode').remove();
			$('#errorContainerForZipCode').remove();
			$.elements.currentElement.parent().append('<span class="error" id="errorContainerForZipCode"><br />Please enter a valid 5 digit Zip Code</span>');
			$.elements.passed = false;
		}
	}
	
	return $.elements.passed;
};
