/* <JasobNoObfs> */
/***************************************************
 skycom_validation.js
 * v1.19 2007-01-02
 * Copyright 2007 Interkey Networks Ltd. All Rights Reserved.
 * Use is prohibited without licence from Interkey Networks.
 * http://www.artofcoding.co.uk
***************************************************/
/* </JasobNoObfs> */

String.prototype.keepNumeric = function(){return this.replace( /[^0-9]/g, "")};

var skyvalid_aTypes = [ 

{   sType : "num",                sFunction : "skyvalid_fNumeric"           },
{   sType : "alpha",              sFunction : "skyvalid_fAlpha"             },
{   sType : "alphanum",           sFunction : "skyvalid_fAlphaOrNumeric"    },
{   sType : "alphaandnum",        sFunction : "skyvalid_fAlphaAndNumeric"   },
{   sType : "alphanumpunct",      sFunction : "skyvalid_fAlphaNumericPunct" },

{   sType : "min",                sFunction : "skyvalid_fLengthMin"         },
{   sType : "max",                sFunction : "skyvalid_fLengthMax"         },

{   sType : "email",              sFunction : "skyvalid_fEmail"             },
{   sType : "emailconf",          sFunction : "skyvalid_fEmailConf"         },
{   sType : "postcode",           sFunction : "skyvalid_fPostCode"          },
{   sType : "viewcard",           sFunction : "skyvalid_fViewCard"          },
{   sType : "pcn",                sFunction : "skyvalid_fPcn"               },
{   sType : "dob",                sFunction : "skyvalid_fDob"               },
{   sType : "pob",                sFunction : "skyvalid_fPob"               },
{   sType : "fname",              sFunction : "skyvalid_fFirstname"         },
{   sType : "lname",              sFunction : "skyvalid_fSurname"           },
{   sType : "username",           sFunction : "skyvalid_fUsername3"         },
{   sType : "username2",          sFunction : "skyvalid_fUsername2"         },
{   sType : "username3",          sFunction : "skyvalid_fUsername3"         },
{   sType : "password",           sFunction : "skyvalid_fPassword"          },
{   sType : "passwordconf",       sFunction : "skyvalid_fPasswordConf"      },

{   sType : "securitya",          sFunction : "skyvalid_fSecurityAnswer"    },
{   sType : "betid",              sFunction : "skyvalid_fBetId"             },
{   sType : "betpin",             sFunction : "skyvalid_fBetPin"            },
{   sType : "maccode",            sFunction : "skyvalid_fMaccode"           },
{   sType : "offercode",          sFunction : "skyvalid_fOffercode"         },
{   sType : "creditcard",         sFunction : "skyvalid_fCreditCard"        },

{   sType : "accountnumber",      sFunction : "skyvalid_fAccountNumber"     },
{   sType : "issuenumber",        sFunction : "skyvalid_fIssueNumber"       },
{   sType : "securitycode",       sFunction : "skyvalid_fSecurityCode"      },
{   sType : "sortcode",           sFunction : "skyvalid_fSortCode"          },
{   sType : "startdate",          sFunction : "skyvalid_fStartDate"         },
{   sType : "expirydate",         sFunction : "skyvalid_fExpiryDate"        },

//{ sType : "telephone",          sFunction : "skyvalid_fTelephone"         },
{   sType : "telephone",          sFunction : "skyvalid_fTelephoneUK"       },
{   sType : "telephoneuk",        sFunction : "skyvalid_fTelephoneUK"       },
{   sType : "mobile",             sFunction : "skyvalid_fMobile"            },

{   sType : "pin",                sFunction : "skyvalid_fPin"               },
{   sType : "pinconf",            sFunction : "skyvalid_fPinConf"           },
{   sType : "payment",            sFunction : "skyvalid_fPayment"           },
{   sType : "cardholdername",     sFunction : "skyvalid_fCardHolder"        },
{   sType : "accountholdername",  sFunction : "skyvalid_fAccountHolder"     },
{   sType : "billingaccountname", sFunction : "skyvalid_fBillingAcctName"   },
{   sType : "viewcardname",       sFunction : "skyvalid_fViewCardName"      }

];                                                       


function skyvalid_fValidateElement( eElement )
{
	var aValidTypes = skyvalid_aTypes;
	var nValidTypes = aValidTypes.length;
    var xValid = /^valid\[(.*)\]$/;
	
	var sClasses = eElement.className;
	var aClasses = sClasses.trim().split( " " );
	var nClasses = aClasses.length;
	var sClass, aMatches, sTypes, aTypes, nTypes, j, k, sType, aType, sTypeMajor, oValidType, fValid; 
	for ( var i=0; i<nClasses; i++ )
	{
		sClass = aClasses[ i ];
		aMatches = sClass.match( xValid );
		if( aMatches != null )
		{
			sTypes = aMatches[ 1 ];
			if( sTypes )
			{
				aTypes = sTypes.split( "_" );
				nTypes = aTypes.length;
				for ( j=0; j<nTypes; j++ )
				{
					sType = aTypes[ j ];
					aType = sType.split( "-" )
					sTypeMajor = aType[ 0 ];
					for ( var k=0; k<nValidTypes; k++ )
					{
						oValidType = aValidTypes[ k ];
						if( oValidType.sType == sTypeMajor )
						{
							fValid = window[ oValidType.sFunction ]
							if( fValid != null )
							{
								if( !fValid( eElement, aType[ 1 ] ) )
								{
									eElement.sValidType = sTypeMajor;
									return false;
								}
							}
						}
					}
				}
				break;
			}
		}
	}
	return true;
}

function skyvalid_fProcessValue( eElement, sValue, fValueValidate )
{
	if( sValue )
	{
        if( fValueValidate( sValue, eElement ) )
		{
			eElement.value = sValue;
			eElement.value = eElement.value.replace( "C/O", "c/o" );
			return true;	
		}
	}
	return false;
}

function skyvalid_fGetContainer( eElement, sClass )
{
	sClass = sClass.replace( /([\[\]])/g, "\\$1" );
	return sky_fGetParentByClassName( eElement, sClass, null, true );
}

function skyvalid_fGetSubInputs( eParent, aSubTypes )
{
	var aElements = new Array();
	var aSelects = eParent.getElementsByTagName( "select" );
    var aInputs = eParent.getElementsByTagName( "input" );
	var nSelects = aSelects.length;
    for( var i=0; i<nSelects; i++ )
	{
		aElements[ i ] = aSelects[ i ];
	}
    var nInputs = aInputs.length;
    for( var j=aElements.length,i=0; i<nInputs; i++,j++ )
	{
		aElements[ j ] = aInputs[ i ];
	}
    var nElements = aElements.length;
    var aSubInputs = new Array();
	var aSubValues = new Array();
    var nSubTypes = aSubTypes.length;
	var sSubType, eElement, j;
    for( i=0; i<nSubTypes; i++ )
	{
		sSubType = aSubTypes[ i ];
		for( var j=0; j<nElements; j++ )
		{
			eElement = aElements[ j ];
			if( sky_fHasClassName( eElement, sSubType ) )
			{
				aSubInputs.push( eElement );
				aSubValues.push( eElement.value.trim() );  
			}
		}
	}
	return ( ( aSubInputs.length == nSubTypes ) ? [ aSubInputs, aSubValues ] : null );
}


var skyvalid_aEmailComExceptions     = [ "museum" ];	 //must be lowercase
function skyvalid_fEmail( eElement )
{
	return ( ( sEmail = eElement.value.trim() ) ? skyvalid_fEmailValue( sEmail ) : false );
}

// confirms email field previous to this one in HTML flow
function skyvalid_fEmailConf( eElement )
{
	return skyvalid_fProcessValue( eElement, eElement.value.trim(), skyvalid_fEmailConfValue );
}

function skyvalid_fEmailConfValue( sEmailConf, eEmailConf )
{
	if( skyvalid_fEmailValue( sEmailConf ) )
	{
		return skyvalid_fConfirm( eEmailConf, sEmailConf, "valid[email]" );
	}
	return false;
}

function skyvalid_fEmailValue( sEmail )
{
	if( sEmail.length > 100 )
	{
		return false;
	}
	var xEmail = /^(.+)@(.+)$/;
	var sSpecialChars = "\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
	var sValidUser = "\[^\\s" + sSpecialChars + "\]+";
	var sQuotedUser = "(\"[^\"]*\")";
    
	var sUserWord= "(" + sValidUser + "|" + sQuotedUser + ")";
	var xUserName = new RegExp("^" + sUserWord + "(\\." + sUserWord + ")*$");
	var xDomain   = new RegExp("^" + sValidUser + "(\\." + sValidUser +")*$");
	var aMatches = sEmail.match(xEmail);
	if( aMatches == null )
	{
		return false;
	}
	var sUserName = aMatches[ 1 ];
	var sDomain = aMatches[ 2 ];
	if( !xUserName.test( sUserName ) )
	{
		return false;
	}
	
	if( ( /^[\d\.]+$/ ).test( sDomain ) )
	{
		var aIP = sDomain.split( "." );
		var nIP = aIP.length;
		if( nIP	!= 4 )
		{
			return false;
		}
		for( var i=0; i<=3; i++ )
		{
			if( Number( aIP[ i ] ) > 255 )
			{
				return false;
			}
		}
		return true;
	}
	if( !xDomain.test( sDomain ) )
	{
		return false;
	}
	var xValid = new RegExp( sValidUser, "g" );
	var aDomain = sDomain.match( xValid );
	var nDomain = aDomain.length;
	if( nDomain < 2 )
	{
		return false;
	}
	var sCom = aDomain[ nDomain - 1 ];
	var nCom = sCom.length;
	if( nCom < 2 || ( nCom > 4 && ( !skyvalid_aEmailComExceptions.contains( sCom ) ) ) )
	{
		return false;
	}
	return true;
}


var skyvalid_aPostCodeExceptions     = [ "GIR0AA" ];	 //must be uppercase no spaces
var skyvalid_sPostCodeClassWrapper = "valid[postcode]";
var skyvalid_aPostCodeSubClasses   = [ "valid[postcode-1]", "valid[postcode-2]" ];

function skyvalid_fPostCode( eElement, sType )
{									
	if( sType )
	{
		var eParent = skyvalid_fGetContainer( eElement, skyvalid_sPostCodeClassWrapper ); 
		if( eParent )
		{
			var aSubInputs = skyvalid_fGetSubInputs( eParent, skyvalid_aPostCodeSubClasses );
			if( aSubInputs )
			{
				
				var aElements = aSubInputs[ 0 ];
				aElements[ 0 ].value = aElements[ 0 ].value.noSpaces().toUpperCase();
				aElements[ 1 ].value = aElements[ 1 ].value.noSpaces().toUpperCase();
				return skyvalid_fPostCodeValue( aSubInputs[ 1 ].join( "" ).noSpaces().toUpperCase() );
			}
		}
	}
	else
	{
		return skyvalid_fProcessValue( eElement, eElement.value.noSpaces().toUpperCase(), skyvalid_fPostCodeValue );
	}
	return false;
}

function skyvalid_fPostCodeValue( sCode )
{
	if( skyvalid_aPostCodeExceptions.contains( sCode ) ) { return true };
	var xLast3, sFirst, nCode;
    if( (/^BFPO\s*[1-9]\d{0,2}$/).test( sCode ) ) { return true };
//    if( (/^BFPO\s*[1-9]\d{0,3}$/).test( sCode ) ) { return true };
//    if( (/^BFPO\s*C\/O\s*[1-9]\d{0,2}$/).test( sCode ) ) { return true };
	if(
	   ( ( nCode = sCode.length ) < 5 ) ||
       ( nCode > 7 ) ||
	   !( ( xLast3 = /\d[A-Z]{2}$/ ).test( sCode.slice( -3 ) ) ) ||
	   !( ( /^[^CIKMOV]{2}$/ ).test( sCode.slice( -2 ) ) ) ||
	   !( ( /(^[A-Z]{1,2}\d{1,2}$)|(^[A-Z]{1,2}\d[A-Z]$)/ ).test( sFirst = sCode.replace( xLast3, "" ) ) ) ||
	   !( ( /^[^QVX][^IJZ]($|[^IL-RVX-Z])($|[^CDFGI-LOQS-UZ])/ ).test( sFirst ) )
	) { return false };
	return true;
}


// numbers only - no spaces
function skyvalid_fNumeric( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fNumericValue );
}

function skyvalid_fNumericValue( sNumber )
{
	var xNumber = /^[0-9]+$/;
	return xNumber.test( sNumber );	
}



// letters only - no spaces
function skyvalid_fAlpha( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fAlphaValue );
}

function skyvalid_fAlphaValue( sAlpha )
{
	var xAlpha = /^[A-Z]+$/i;
	return xAlpha.test( sAlpha );	
}



// letters OR numbers with no spaces"
function skyvalid_fAlphaOrNumeric( eElement )
{					 
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fAlphaOrNumericValue );
}

function skyvalid_fAlphaOrNumericValue( sValue )
{
	var xAlphaNumber = /^[A-Z0-9]+$/i;
	return xAlphaNumber.test( sValue );
}


// both letters AND numbers with no spaces
function skyvalid_fAlphaAndNumeric( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fAlphaAndNumericValue );
}

function skyvalid_fAlphaAndNumericValue( sValue )
{
	if( skyvalid_fAlphaOrNumericValue( sValue ) )
	{
	    var xAlpha = /[A-Z]+/i;
		if( xAlpha.test( sValue ) )
		{
			var xNumber = /[0-9]+/;
			return xNumber.test( sValue );
		}
	}
	return false;
}

// letters or numbers and  full stops, commas, apostrophes and hyphens
function skyvalid_fAlphaNumericPunct( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fAlphaNumericPunctValue );
}

function skyvalid_fAlphaNumericPunctValue( sValue )
{
	var xAlphaNumberPunct = /^[A-Z0-9\.,'`-]+$/i;
	return xAlphaNumberPunct.test( sValue );
}



// minimum length
function skyvalid_fLengthMin( eElement, nMin )
{
	return ( ( sValue = eElement.value.trim() ) ? skyvalid_fLengthMinValue( sValue, nMin ) : false );
}

// minimum length
function skyvalid_fLengthMinValue( sValue, nMin )
{
	return ( sValue.length >= nMin );
}


// maximum length
function skyvalid_fLengthMax( eElement, nMax )
{
	return ( ( sValue = eElement.value.trim() ) ? skyvalid_fLengthMaxValue( sValue, nMax ) : false );
}

function skyvalid_fLengthMaxValue( sValue, nMax )
{
	return ( sValue.length <= nMax );
}
// viewing card between 2 and 12 numbers
function skyvalid_fViewCard( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fViewCardValue );
}

function skyvalid_fViewCardValue( sView )
{
	if( skyvalid_fNumericValue( sView ) )
	{
		var nView = sView.length;
		return !( ( nView < 2 ) || ( nView > 12 ) );
	}
	return false;
}

// viewing card between 2 and 12 numbers
function skyvalid_fPcn( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fPcnValue );
}

function skyvalid_fPcnValue( sPcn )
{
	var xPcn = /^\d{4}$/;
	return xPcn.test( sPcn );
}

var skyvalid_dDobStart = new Date( 1906, 0, 1 );   // Jan 1, 1906
var skyvalid_dDobEnd = new Date(); // today
var skyvalid_sDobClassWrapper = "valid[dob]";
var skyvalid_aDobSubClasses   = [ "valid[dob-day]", "valid[dob-month]", "valid[dob-year]" ];

function skyvalid_fDob( eSelect, sType )
{
	var eParent = skyvalid_fGetContainer( eSelect, skyvalid_sDobClassWrapper ); 
	if( eParent )
	{
		var aSubInputs = skyvalid_fGetSubInputs( eParent, skyvalid_aDobSubClasses );
		if( aSubInputs )
		{
			var aElements = aSubInputs[ 0 ];
			var dDate = skyvalid_fGetDate( aElements );
			if( dDate )
			{
				return ( ( dDate >= skyvalid_dDobStart ) && ( dDate < skyvalid_dDobEnd ) );
			}
		}
	}
	return false;
}

function skyvalid_fGetDate( aElements )
{
	var vDay = aElements[ 0 ];
	if( typeof vDay == "number" )
	{
		var nDay = vDay;
	}
	else
	{
		var eDay = vDay;
		if( eDay.tagName.toLowerCase() == "input" )
		{
            var sDay = ( "0" + eDay.value.noSpaces() ).slice( -2 );
			eDay.value = sDay;
			var nDay = Number( sDay );
		}
		else
		{
			var nDay = Number( eDay.options[ eDay.selectedIndex ].text );
		}
	}
	if( isNaN( nDay ) )
	{
		return null;
	}
	
	var vMonth = aElements[ 1 ];
	if( typeof vMonth == "number" )
	{
		var nMonth = vMonth;
	}
	else
	{
		var eMonth = vMonth;
		if( eMonth.tagName.toLowerCase() == "input" )
		{
			var sMonth = ( "0" + eMonth.value.noSpaces() ).slice( -2 );
			eMonth.value = sMonth;
			var nMonth = ( Number( sMonth ) - 1 );
		}
		else
		{
			var nMonth = ( ( 12 - eMonth.options.length) + eMonth.selectedIndex );
		}
	}
    if( ( isNaN( nMonth ) ) || ( nMonth < 0 ) )
	{
		return null;	
	}
	
	var vYear = aElements[ 2 ];
	if( typeof vYear == "number" )
	{
		var nYear = vYear;
	}
	else
	{
		var eYear = vYear;
		if( eYear.tagName.toLowerCase() == "input" )
		{
			var sYear = eYear.value.noSpaces();
			if( sYear.length < 2 )
			{
				eYear.value = sYear;
				return null;
			}
			if( sYear.length == 2 )
			{
				var sNow = ( new Date() ).getFullYear().toString();
				var sCurCent = sNow.substr( 0, 2 );
                var sCurYear = sNow.slice( 2 );
				sYear = ( ( sYear <= sCurYear ) ? sCurCent : ( sCurCent - 1 ) ) + sYear;
			}
			eYear.value = sYear;
			var nYear = Number( sYear );
		}
		else
		{
			var nYear = Number( eYear.options[ eYear.selectedIndex ].text );
		}
	}
	if( isNaN( nYear ) )
	{
		return null;
	}
	var dDate = new Date( nYear, nMonth, nDay );
	if( dDate.getMonth() != nMonth )
	{
		return null;
	}
	return dDate;
}

// SAM3 username
function skyvalid_fUsername3( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fUsernameValue3 );
}

function skyvalid_fUsernameValue3( sUsername )
{
	var nLength = sUsername.length;
	if( !( ( nLength < 3 ) || ( nLength > 32 ) ) )
	{
		var xUsername = /^[A-Z0-9]([\.\-_]?[A-Z0-9]+)*$/i;
		return xUsername.test( sUsername );
	}
	return false;
}


// SAM2 username
function skyvalid_fUsername2( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fUsernameValue2 );
}

function skyvalid_fUsernameValue2( sUsername )
{
	if( skyvalid_fAlphaOrNumericValue( sUsername ) )
	{
		var nUsername = sUsername.length;
		return !( ( nUsername < 6 ) || ( nUsername > 32 ) );
	}
	return false;
}


// bet id between 6 and 12 chars
function skyvalid_fBetId( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fBetIdValue );
}

function skyvalid_fBetIdValue( sBetid )
{
	if( skyvalid_fAlphaOrNumericValue( sBetid ) )
	{
		var nBetid = sBetid.length;
		return !( ( nBetid < 6 ) || ( nBetid > 12 ) );
	}
	return false;
}

// bet pin between 1 and 12 chars
function skyvalid_fBetPin( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fBetPinValue );
}

function skyvalid_fBetPinValue( sBetpin )
{
	var xBetPin = /^\d{4,6}$/;
	return xBetPin.test( sBetpin );
}

// username between 7 and 25 chars
function skyvalid_fPassword( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fPasswordValue );
}

function skyvalid_fPasswordValue( sPassword )
{
	if( skyvalid_fAlphaAndNumericValue( sPassword ) )
	{
		if( sPassword.toLowerCase().indexOf( "password" ) == -1 )
		{
			var nPassword = sPassword.length;
			return !( ( nPassword < 7 ) || ( nPassword > 25 ) );
		}
	}
	return false;
}


// confirms password field previous to this one in HTML flow
function skyvalid_fPasswordConf( eElement )
{
	return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fPasswordConfValue );
}

function skyvalid_fPasswordConfValue( sPasswordConf, ePasswordConf )
{
	if( skyvalid_fPasswordValue( sPasswordConf ) )
	{
		return skyvalid_fConfirm( ePasswordConf, sPasswordConf, "valid[password]" );
	}
	return false;
}

function skyvalid_fConfirm( eConfElement, sConfValue, sOriginalClass )
{
	var eForm = eConfElement.form;
	if( eForm )
	{
		var aElements = eForm.elements;
		var nElements = ( aElements.length - 1 );
		var eElement, eOriginal, bFound = false;
		for( var i=nElements; i>=0; i-- )
		{
			eElement = aElements[ i ];
			if( !bFound && ( eElement == eConfElement ) )
			{
				bFound = true;
				continue;
			}
			if( bFound && ( sky_fHasClassName( eElement, sOriginalClass ) ) )
			{
				eOriginal = eElement;
				break;
			}
		}
		if( eOriginal )
		{
			if( eOriginal.value == sConfValue )
			{
				return true;
			}
		}
	}
	return false;
}

function skyvalid_fNameValue( sValue, nMax )
{	
	var nLength = sValue.length; 
	if( !( ( nLength < 1 ) || ( nLength > nMax ) ) )
	{
		var xName = /^[A-Z]([\- ]?[A-Z]+)*$/i;
		return xName.test( sValue );
	}
	return false;
}



//  first name <= 50 letters, spaces and hyphens
function skyvalid_fFirstname( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.trim(), skyvalid_fFirstnameValue );
}

function skyvalid_fFirstnameValue( sFirstname )
{
	return skyvalid_fNameValue( sFirstname, 50 );
}

//  surname <= 50 letters, spaces and hyphens
function skyvalid_fSurname( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.trim(), skyvalid_fSurnameValue );
}

function skyvalid_fSurnameValue( sSurname )
{
	return skyvalid_fNameValue( sSurname, 50 );
}

//  security answer <= 100 chars
function skyvalid_fSecurityAnswer( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.trim(), skyvalid_fSecurityAnswerValue );
}
 
function skyvalid_fSecurityAnswerValue( sAnswer )
{
	var xAnswer = /^.{1,100}$/;
	return xAnswer.test( sAnswer );
}


//  place of birth <= 35 chars
function skyvalid_fPob( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.trim(), skyvalid_fPobValue );
}
 
function skyvalid_fPobValue( sPlace )
{				   
	var xPlace = /^.{1,35}$/;
	return xPlace.test( sPlace );
	
}



//  mobile - numeric
function skyvalid_fMobile( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fMobileValue );
}
 
function skyvalid_fMobileValue( sMobile )
{				   
	var xMobile = /^0?((7\d{9})|(8\d{8}))$/;
	return xMobile.test( sMobile );
}

//  telephone - numeric
function skyvalid_fTelephone( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fTelephoneValue );
}
 
function skyvalid_fTelephoneValue( sPhone )
{				   
	return skyvalid_fNumericValue( sPhone );
}





function skyvalid_fTelephoneUK( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.keepNumeric(), skyvalid_fTelephoneUKValue );
}
 
function skyvalid_fTelephoneUKValue( sPhoneUK, eElement )
{				   
	eElement.value = sPhoneUK;
	var xPhoneUK = /^0[1-3,5]\d{8,9}$/;
	return xPhoneUK.test( sPhoneUK );
}

















































function skyvalid_fMaccode( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces().toUpperCase(), skyvalid_fMaccodeValue );
}
 
function skyvalid_fMaccodeValue( sMaccode )
{		  
	var xMaccode1 = /^(BBIP|BBDS)\d{8}\/[A-Z0-9]{5}$/;
	var xMaccode2 = /^FTIP\d{9}\/[A-Z0-9]{5}$/;
	var xMaccode3 = /^L[A-Z0-9]{10}\/[A-Z0-9]{5}$/;
	return ( xMaccode1.test( sMaccode ) || xMaccode2.test( sMaccode ) || xMaccode3.test( sMaccode ) );
}

function skyvalid_fOffercode( eElement )
{									
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces().toUpperCase(), skyvalid_fOffercodeValue );
}
 
function skyvalid_fOffercodeValue( sOffercode )
{			
	var xOffer = /^[A-Z0-9]{20}$/;
	return xOffer.test( sOffercode );
}

function skyvalid_fIssueNumber( eElement )
{									
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fIssueNumberValue );
}
 
function skyvalid_fIssueNumberValue( sIssueNumber )
{			
	var xIssueNumber = /^\d{1,2}$/;
	return xIssueNumber.test( sIssueNumber );
}

function skyvalid_fSecurityCode( eElement )
{									
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fSecurityCodeValue );
}
 
function skyvalid_fSecurityCodeValue( sSecurityCode )
{				   
	var xSecurityCode = /^\d{3,6}$/;
	return xSecurityCode.test( sSecurityCode );
}

var skyvalid_sSortCodeClassWrapper = "valid[sortcode]";
var skyvalid_aSortCodeSubClasses   = [ "valid[sortcode-1]", "valid[sortcode-2]", "valid[sortcode-3]" ];

function skyvalid_fSortCode( eElement, sType )
{									
	if( sType )
	{
		var eParent = skyvalid_fGetContainer( eElement, skyvalid_sSortCodeClassWrapper ); 
		if( eParent )
		{
			var aSubInputs = skyvalid_fGetSubInputs( eParent, skyvalid_aSortCodeSubClasses );
			if( aSubInputs )
			{
				return skyvalid_fSortCodeValue( aSubInputs[ 1 ].join( "" ) );
			}
		}
	}
	else
	{
		var bValid = skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fSortCodeValue );
		if( bValid )
		{
			eElement.value = eElement.value.replace( /\-/g, "" );	
		}
		return bValid;
	}
	return false;
}
 
function skyvalid_fSortCodeValue( sSortCode )
{				   
	var xSortCode = /^((\d{6})|(\d\d\-\d\d\-\d\d))$/;
	if( parseInt( sSortCode ) == 0 )
	{
		return false;
	}
	return xSortCode.test( sSortCode );
}


var skyvalid_sStartDateClassWrapper = "valid[startdate]";
var skyvalid_aStartDateSubClasses   = [ "valid[startdate-month]", "valid[startdate-year]" ];

function skyvalid_fStartDate( eInput, sType )
{			 	
	var eParent = skyvalid_fGetContainer( eInput, skyvalid_sStartDateClassWrapper ); 
	if( eParent )
	{ 
        var aSubInputs = skyvalid_fGetSubInputs( eParent, skyvalid_aStartDateSubClasses );
		if( aSubInputs )
		{
			aSubInputs[ 0 ].unshift( 1 );
			var dDate = skyvalid_fGetDate( aSubInputs[ 0 ] );
			if( dDate )
			{
				return ( dDate <= new Date() );
			}
		}
	}
	return false;
}


var skyvalid_sExpiryDateClassWrapper = "valid[expirydate]";
var skyvalid_aExpiryDateSubClasses   = [ "valid[expirydate-month]", "valid[expirydate-year]" ];

function skyvalid_fExpiryDate( eInput, sType )
{			 			
	var eParent = skyvalid_fGetContainer( eInput, skyvalid_sExpiryDateClassWrapper ); 
	if( eParent )
	{ 
		var aSubInputs = skyvalid_fGetSubInputs( eParent, skyvalid_aExpiryDateSubClasses );
		if( aSubInputs )
		{
			aSubInputs[ 0 ].unshift( 1 );
			var dDate = skyvalid_fGetDate( aSubInputs[ 0 ] );
			if( dDate )
			{
				var nMonth = dDate.getMonth();
				var dTemp = new Date( dDate );
				var nMax = 31;
                do
				{
					nMax--;
					dTemp.setMonth( nMonth );
					dTemp.setDate( dDate.getDate() + nMax );	
				}
				while ( dTemp.getMonth() != nMonth )
				return ( dTemp >= new Date() );
			}
		}
	}
	return false;
}


function skyvalid_fAccountNumber( eElement )
{									
	var sValue = eElement.value.replace( /[\/\- ]/g, "" );
	return skyvalid_fProcessValue( eElement, sValue, skyvalid_fAccountNumberValue );
}
 
function skyvalid_fAccountNumberValue( sAccount )
{			
	var xAccount = /^[0-9]{1,15}$/;
	return xAccount.test( sAccount );
}

function skyvalid_fCreditCard( eElement )
{									
	return skyvalid_fProcessValue( eElement, eElement.value.keepNumeric(), skyvalid_fCreditCardValue );
}
 
function skyvalid_fCreditCardValue( sCard, eElement )
{			
	// VISA : initial digit(s) = 4; length(s) = 13,16
	// MC   : initial digit(s) = 51-55; length(s) = 13,16  [ only 16 ??? ]
	// AMEX : initial digit(s) = 34,37; length(s) = 15
	// SWITCH : initial digit(s) = 67; length(s) = 16, 18, 19
	eElement.value = sCard;
	var xLength = /^[3-6][0-9]{12,18}$/;
	if( xLength.test( sCard ) )
	{
		return skyvalid_fCreditCardLuhnTest( sCard ) 
	}
	return false;
}

function skyvalid_fCreditCardLuhnTest( sCard )
{
	var aCard = sCard.split( "" ).reverse();
	var nCard = aCard.length;
	var nDigit, nTotal = 0;
    for( var i=0,j=1; i<nCard; i++ )
	{
        nDigit = Number( aCard[ i ] );
		if( i==j )
		{
			if( ( nDigit *= 2 ) > 9 ) { nDigit -= 9 };
            j+=2;
		}
		nTotal += nDigit;
	}
	return (( nTotal % 10 ) == 0 );
}


/*******************************************************

VALIDATION Account Management

********************************************************/


function skyvalid_fPayment( eElement )
{
	
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fPaymentValue );
}


function skyvalid_fPaymentValue( sPayment, eElement )
{			
	var nPayment = parseFloat( sPayment );
	if( !isNaN( nPayment ) )
	{
		var nMinimum = 1.5;
		var nMaximum = 200;
		if( ( nPayment >= nMinimum ) && ( nPayment <= nMaximum ) )
		{
			eElement.value = nPayment.toFixed( 2 );
			return true;
		}
	}
	return false;	
}

function skyvalid_fCardHolder( sName )
{
	
}

//  first name <= 50 letters, fullstops, apostrophes and hyphens
function skyvalid_fCardHolder( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.trim(), skyvalid_fCardHolderValue );
}

function skyvalid_fCardHolderValue( sName )
{
	return skyvalid_fNameValue( sName, 80 );
}

function skyvalid_fAccountHolder( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.trim(), skyvalid_fAccountHolderValue );
}

function skyvalid_fAccountHolderValue( sName )
{
	return skyvalid_fNameValue( sName, 50 );
}

function skyvalid_fPin( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fPinValue );
}

function skyvalid_fPinValue( sPin )
{
	var xPin = /^\d{4}$/;
	return xPin.test( sPin );
}

// confirms pin field previous to this one in HTML flow
function skyvalid_fPinConf( eElement )
{
	return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fPinConfValue );
}
function skyvalid_fPinConfValue( sPinConf, ePinConf )
{
	if( skyvalid_fPinValue( sPinConf ) )
	{
		return skyvalid_fConfirm( ePinConf, sPinConf, "valid[pin]" );
	}
	return false;
}

function skyvalid_fViewCardName( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fViewCardNameValue );
}


function skyvalid_fViewCardNameValue( sName )
{
	var xName = /^[A-Z0-9 _]{3,22}$/i;
	return xName.test( sName );
}


function skyvalid_fBillingAcctName( eElement )
{
    return skyvalid_fProcessValue( eElement, eElement.value.noSpaces(), skyvalid_fBillingAcctNameValue );
}


function skyvalid_fBillingAcctNameValue( sName )
{
	var xName = /^[A-Z0-9 _]{3,22}$/i;
	return xName.test( sName );
}




