//** validates a UK Postcode **//
function validateUkPostcode(postcode, doAlert) {

    var blTest1, blTest2 = false;
    //remove whitespace and make lower case - easier for regluar expressions
    // var postcode = document.forms.frmBroadbandChecker.txtPostcode.value;

    //1. make lowercase and remove whitespace
     postcode = postcode.toLowerCase().replace("  ","").replace(" ", "");

    //2. before doing matches make sure postcode is correct length ( min=5 max= 7)
    var len = postcode.length;

    if (len < 5) {
        if(doAlert) alert("Postcode has too few characters (" + postcode + ")");
        return false; //exit here - failed validation before check
    }
    if (len > 7) {
        if (doAlert) alert("Postcode has too many characters (" + postcode + ")");
        return false; //exit here - failed validation before check
    }

    //3. seperate into 2 parts - each tested seperately
    var part1 = postcode.substring(0, postcode.length - 3);   //must match LN | LLN | LNN | LNL | LLNN | LLNL
    var part2 = postcode.substring(postcode.length - 3, postcode.length);  //must match NLL

    //4. validate part2 first. must match regular expression NLL
    var rePart2 = new RegExp("^([0-9])([a-z])([a-z])$");
    blTest2 = rePart2.test(part2);

    //5. validate part1.must match regular expression LN | LLN | LNN | LNL | LLNN | LLNL
    //different expression depending on length
    var rePart1;
    var lenPart1 = part1.length;
    if (lenPart1 == 2) {
        rePart1 = new RegExp("^([a-z])([0-9])$");
    }
    else if (lenPart1 == 3) {
        rePart1 = new RegExp("^([a-z])([0-9]|[a-z])([0-9]|[a-z])$");
    }
    else if (lenPart1 == 4) {
        rePart1 = new RegExp("^([a-z])([a-z])([0-9])([0-9]|[a-z])$");
    }
    blTest1 = rePart1.test(part1);

    if (!blTest1 || !blTest2) {
        if (doAlert) alert("Postcode has failed validation (" + postcode + "). There are 6 possible valid UK postcodes (where L = letter and N = Number). Possible values include:\nLN NLL, LLN NLL, LNN NLL, LNL NLL, LLNN NLL, LLNL NLL");
    }

    return (blTest1 && blTest2);
}
          