/** 
   ****************************
     Postal Code Validation
     Language Jobs Ltd
     Devis Lucato 2008
   ****************************
*/

function valid_postcode_4N(entered_postcode,op_mode) {
	if ( op_mode == 'suggest' ) {
		return 'NNNN';
	}
	// Array holds the regular expressions for the valid postcodes
	var pcexp = new Array()
	// Expression for postcodes: NNNNN
	pcexp[0] = new RegExp ("^([0-9]{4})$","i")
	var valid = false
	// Check the string against the types of post codes
	for ( var i=0; i<pcexp.length; i++) {
		if (pcexp[i].test(entered_postcode)) {
			valid = true
			break;
		}
	}
	return valid
}
function valid_postcode_5N(entered_postcode,op_mode) {
	if ( op_mode == 'suggest' ) {
		return 'NNNNN';
	}
	// Array holds the regular expressions for the valid postcodes
	var pcexp = new Array()
	// Expression for postcodes: NNNNN
	pcexp[0] = new RegExp ("^([0-9]{5})$","i")
	// Expression for postcodes: NN NNN
	pcexp[1] = new RegExp ("^([0-9]{2})(\\s*)([0-9]{3})$","i")
	// Expression for postcodes: NNN NN
	pcexp[2] = new RegExp ("^([0-9]{3})(\\s*)([0-9]{2})$","i")
	var valid = false
	// Check the string against the types of post codes
	for ( var i=0; i<pcexp.length; i++) {
		if (pcexp[i].test(entered_postcode)) {
			valid = true
			break;
		}
	}
	return valid
}
function valid_postcode_6N(entered_postcode,op_mode) {
	if ( op_mode == 'suggest' ) {
		return 'NNNNNN';
	}
	// Array holds the regular expressions for the valid postcodes
	var pcexp = new Array()
	// Expression for postcodes: NNNNNNN
	pcexp[0] = new RegExp ("^([0-9]{6})$","i")
	var valid = false
	// Check the string against the types of post codes
	for ( var i=0; i<pcexp.length; i++) {
		if (pcexp[i].test(entered_postcode)) {
			valid = true
			break;
		}
	}
	return valid
}
function valid_postcode_GB(entered_postcode,op_mode) {
	if ( op_mode == 'suggest' ) {
		return '';
	}
	// Permitted letters depend upon their position in the postcode.
	var alpha1 = "[abcdefghijklmnoprstuwyz]"
	var alpha2 = "[abcdefghklmnopqrstuvwxy]"
	var alpha3 = "[abcdefghjkstuw]"
	var alpha4 = "[abehmnprvwxy]"
	var alpha5 = "[abdefghjlnpqrstuwxyz]"
	// Array holds the regular expressions for the valid postcodes
	var pcexp = new Array()
	// Expression for postcodes: AN NAA, ANN NAA, AAN NAA, and AANN NAA
	pcexp[0] = new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1,2})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i")
	// Expression for postcodes: ANA NAA
	pcexp[1] = new RegExp ("^(" + alpha1 + "{1}[0-9]{1}" + alpha3 + "{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i")
	// Expression for postcodes: AANA  NAA
	pcexp[2] = new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1}" + alpha4 +"{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i")
	// Exception for the special postcode GIR 0AA
	pcexp[3] = /^(GIR)(\s*)(0AA)$/i
	// Standard BFPO numbers
	pcexp[4] = /^(bfpo)(\s*)([0-9]{1,4})$/i
	// c/o BFPO numbers
	pcexp[5] = /^(bfpo)(\s*)(c\/o\s*[0-9]{1,3})$/i
	// Overseas Territories
	pcexp[6] = /^([A-Z]{4})(\s*)(1ZZ)$/i
	
	var valid = false
	// Check the string against the types of post codes
	for ( var i=0; i<pcexp.length; i++) {
		if (pcexp[i].test(entered_postcode)) {
			valid = true
			break;
		}
	}
	return valid
}
function valid_postcode_CA(entered_postcode,op_mode) {
	if ( op_mode == 'suggest' ) {
		return 'ANA NAN / AN AN AN';
	}
	var alpha1 = "[abceghjklmnprstvwxyz]"
	// Array holds the regular expressions for the valid postcodes
	var pcexp = new Array()
	// Expression for postcodes: ANA NAN
	pcexp[0] = new RegExp ("^(" + alpha1 + "{1}[0-9]{1}" + alpha1 + "{1})(\\s*)([0-9]{1}" + alpha1 + "{1}[0-9]{1})$","i")
	// Expression for postcodes: AN AN AN
	pcexp[1] = new RegExp ("^(" + alpha1 + "{1}[0-9])(\\s*)(" + alpha1 + "{1}[0-9])(\\s*)(" + alpha1 + "{1}[0-9])$","i")
	var valid = false
	// Check the string against the types of post codes
	for ( var i=0; i<pcexp.length; i++) {
		if (pcexp[i].test(entered_postcode)) {
			valid = true
			break;
		}
	}
	return valid
}
function valid_postcode_US(entered_postcode,op_mode) {
	if ( op_mode == 'suggest' ) {
		return 'NNNNN / NNNNN-AAAA';
	}
	var alpha1 = "[abcdefghijklmnopqrstuvwxyz]"
	// Array holds the regular expressions for the valid postcodes
	var pcexp = new Array()
	// Expression for postcodes: NNNNN
	pcexp[0] = new RegExp ("^([0-9]{5})$","i")
	// Expression for postcodes: NNNNN-AAAA
	pcexp[1] = new RegExp ("^([0-9]{5})-("+alpha1+"{4})$","i")
	var valid = false
	// Check the string against the types of post codes
	for ( var i=0; i<pcexp.length; i++) {
		if (pcexp[i].test(entered_postcode)) {
			valid = true
			break;
		}
	}
	return valid
}
function valid_postcode_DK(entered_postcode,op_mode) {
	if ( op_mode == 'suggest' ) {
		return '(DK)NNN / (DK)NNNN';
	}
	// Array holds the regular expressions for the valid postcodes
	var pcexp = new Array()
	// Expression for postcodes: NNN ,NNNN
	pcexp[0] = new RegExp ("^([0-9]{3,4})$","i")
	// Expression for postcodes: DK-NNN,DK-NNNN
	pcexp[1] = new RegExp ("^DK-([0-9]{3,4})$","i")
	// Expression for postcodes: DKNNN,DKNNNN
	pcexp[2] = new RegExp ("^DK([0-9]{3,4})$","i")
	var valid = false
	// Check the string against the types of post codes
	for ( var i=0; i<pcexp.length; i++) {
		if (pcexp[i].test(entered_postcode)) {
			valid = true
			break;
		}
	}
	return valid
}
function valid_postcode_FR(entered_postcode,op_mode) {
	if ( op_mode == 'suggest' ) {
		return 'NNNNN / NANNN';
	}
	// Array holds the regular expressions for the valid postcodes
	var pcexp = new Array()
	// Expression for postcodes: NNNNN
	pcexp[0] = new RegExp ("^([0-9]{5})$","i")
	// Expression for postcodes: 2ANNN, 2BNNN
	pcexp[1] = new RegExp ("^2[ab]([0-9]{3})$","i")
	var valid = false
	// Check the string against the types of post codes
	for ( var i=0; i<pcexp.length; i++) {
		if (pcexp[i].test(entered_postcode)) {
			valid = true
			break;
		}
	}
	return valid
}
function valid_postcode_LT(entered_postcode,op_mode) {
	if ( op_mode == 'suggest' ) {
		return 'LT-NNNNN';
	}
	// Array holds the regular expressions for the valid postcodes
	var pcexp = new Array()
	// Expression for postcodes: LT-NNNNN
	pcexp[0] = new RegExp ("^LT-([0-9]{5})$","i")
	var valid = false
	// Check the string against the types of post codes
	for ( var i=0; i<pcexp.length; i++) {
		if (pcexp[i].test(entered_postcode)) {
			valid = true
			break;
		}
	}
	return valid
}
function valid_postcode_NL(entered_postcode,op_mode) {
	if ( op_mode == 'suggest' ) {
		return 'NNNN AA / NNNN AA NN';
	}
	var alpha1 = "[abcdefghijklmnopqrstuvwxyz]"
	// Array holds the regular expressions for the valid postcodes
	var pcexp = new Array()
	// Expression for postcodes: NNNN AA
	pcexp[0] = new RegExp ("^([0-9]{4})(\\s*)(" + alpha1 + "{2})$","i")
	// Expression for postcodes: NNNN AA NN
	pcexp[1] = new RegExp ("^([0-9]{4})(\\s*)(" + alpha1 + "{2})(\\s*)([0-9]{2})$","i")
	var valid = false
	// Check the string against the types of post codes
	for ( var i=0; i<pcexp.length; i++) {
		if (pcexp[i].test(entered_postcode)) {
			valid = true
			break;
		}
	}
	return valid
}
function valid_postcode_PL(entered_postcode,op_mode) {
	if ( op_mode == 'suggest' ) {
		return 'NNNNN / NN-NNN';
	}
	// Array holds the regular expressions for the valid postcodes
	var pcexp = new Array()
	// Expression for postcodes: NNNNN
	pcexp[0] = new RegExp ("^([0-9]{5})$","i")
	// Expression for postcodes: NN-NNN
	pcexp[1] = new RegExp ("^([0-9]{2})-([0-9]{3})$","i")
	var valid = false
	// Check the string against the types of post codes
	for ( var i=0; i<pcexp.length; i++) {
		if (pcexp[i].test(entered_postcode)) {
			valid = true
			break;
		}
	}
	return valid
}

function valid_postcode_PT(entered_postcode,op_mode) {
	if ( op_mode == 'suggest' ) {
		return 'NNNN / NNNN-NNN';
	}
	var alpha1 = "[abcdefghijklmnopqrstuvwxyz]"
	// Array holds the regular expressions for the valid postcodes
	var pcexp = new Array()
	// Expression for postcodes: NNNN
	pcexp[0] = new RegExp ("^([0-9]{4})$","i")
	// Expression for postcodes: NNNN-NNN
	pcexp[1] = new RegExp ("^([0-9]{4})-([0-9]{3})$","i")
	// Expression for postcodes: NNNN-NNN AAAAAAAAAAAAAAAAAAAAAAAAA
	pcexp[2] = new RegExp ("^([0-9]{4})-([0-9]{3})(\\s*)(" + alpha1 + "{1,25})$","i")
	// Expression for postcodes: NNNN-NNN AAAAAAAAAAAAAAAAAAAAAAAAA AAA
	pcexp[3] = new RegExp ("^([0-9]{4})-([0-9]{3})(\\s*)(" + alpha1 + "{1,25})(\\s*)(" + alpha1 + "{3})$","i")
	var valid = false
	// Check the string against the types of post codes
	for ( var i=0; i<pcexp.length; i++) {
		if (pcexp[i].test(entered_postcode)) {
			valid = true
			break;
		}
	}
	return valid
}
function valid_postcode_ES(entered_postcode,op_mode) {
	if ( op_mode == 'suggest' ) {
		return 'NNNNN';
	}
	// Array holds the regular expressions for the valid postcodes
	var pcexp = new Array()
	// Expression for postcodes: NNNNN
	pcexp[0] = new RegExp ("^([0-5]{1}[0-9]{4})$","i")
	var valid = false
	// Check the string against the types of post codes
	for ( var i=0; i<pcexp.length; i++) {
		if (pcexp[i].test(entered_postcode)) {
			valid = true
			break;
		}
	}
	return valid
}
function valid_postcode_JP(entered_postcode,op_mode) {
	if ( op_mode == 'suggest' ) {
		return 'NNNNNNN / NNN-NNNN';
	}
	// Array holds the regular expressions for the valid postcodes
	var pcexp = new Array()
	// Expression for postcodes: NNNNNNN
	pcexp[0] = new RegExp ("^([0-9]{7})$","i")
	// Expression for postcodes: NNN-NNNN
	pcexp[1] = new RegExp ("^([0-9]{3})-([0-9]{4})$","i")
	var valid = false
	// Check the string against the types of post codes
	for ( var i=0; i<pcexp.length; i++) {
		if (pcexp[i].test(entered_postcode)) {
			valid = true
			break;
		}
	}
	return valid
}

function lj_postcode_validation(entered_country,entered_postcode,op_mode) {
	if ( entered_country == 'GB' ) {
		return valid_postcode_GB(entered_postcode,op_mode)
	} else if ( entered_country == 'US' ) {
		return valid_postcode_US(entered_postcode,op_mode)
	} else if ( entered_country == 'CA' ) {
		return valid_postcode_CA(entered_postcode,op_mode)
	} else if ( 
		entered_country == 'AT' 
		|| entered_country == 'AU'
		|| entered_country == 'BE' 
		|| entered_country == 'BG' 
		|| entered_country == 'CH' 
		|| entered_country == 'CY' 
		|| entered_country == 'HU' 
		|| entered_country == 'LI' 
		|| entered_country == 'NO' 
		|| entered_country == 'NZ' 
		|| entered_country == 'ZA' 
	) {
		return valid_postcode_4N(entered_postcode,op_mode)
	} else if ( 
		entered_country == 'CZ' 
		|| entered_country == 'DE' 
		|| entered_country == 'DZ' 
		|| entered_country == 'GR' 
		|| entered_country == 'FI' 
		|| entered_country == 'IT'
		|| entered_country == 'MX'
		|| entered_country == 'SE' 
		|| entered_country == 'SK' 
		|| entered_country == 'SM' 
		|| entered_country == 'TR'
		|| entered_country == 'VA'
	) {
		return valid_postcode_5N(entered_postcode,op_mode)
	} else if ( entered_country == 'RO' || entered_country == 'RU' || entered_country == 'CN' || entered_country == 'IN' ) {
		return valid_postcode_6N(entered_postcode,op_mode)
	} else if ( entered_country == 'DK' ) {
		return valid_postcode_DK(entered_postcode,op_mode)
	} else if ( entered_country == 'FR' ) {
		return valid_postcode_FR(entered_postcode,op_mode)
	} else if ( entered_country == 'LT' ) {
		return valid_postcode_LT(entered_postcode,op_mode)
	} else if ( entered_country == 'NL' ) {
		return valid_postcode_NL(entered_postcode,op_mode)
	} else if ( entered_country == 'PL' ) {
		return valid_postcode_PL(entered_postcode,op_mode)
	} else if ( entered_country == 'PT' ) {
		return valid_postcode_PT(entered_postcode,op_mode)
	} else if ( entered_country == 'ES' ) {
		return valid_postcode_ES(entered_postcode,op_mode)
	} else if ( entered_country == 'JP' ) {
		return valid_postcode_JP(entered_postcode,op_mode)
	} else {
		if ( op_mode == 'suggest' ) {
			return ''
		} else {
			return true
		}
	}
}

function lj_postcode_format(entered_country) {
	return lj_postcode_validation(entered_country,'','suggest')
}