/**
 * Utility functions for forms
 *
 **/

// inline form validation reg expressions.
var emailRegExp = "^([\\da-zA-Z-_+][\\da-zA-Z-_+.\\w']*[\\da-zA-Z-_+]@[\\da-zA-Z]['-.\\w]*[\\da-zA-Z]\\.[a-zA-Z]{2,7})$";
var postcodeRegExp = "^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$";
var phoneRegExp = "^0[1237][\\d ]{5,18}$";
var dateOfBirthRegExp = "^\\d{2,}\/[01]\\d\/19\\d{2,}$";

// Add scroller function
jQuery.fn.extend({
    scrollTo : function(speed, easing) {
        return this.each(function() {
        var targetOffset = $(this).offset().top;
        $('html,body').animate({scrollTop: targetOffset}, speed, easing);
        });
    }
});

/**  URL encode / decode - http://www.webtoolkit.info/ **/
var Url = {
    // public method for url encoding
    encode : function (string) {
        return escape(this._utf8_encode(string));
    },

    // public method for url decoding
    decode : function (string) {
        return this._utf8_decode(unescape(string));
    },

    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {
            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            } else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            } else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }
        }
        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {
            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            } else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            } else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }
        }
        return string;
    }
} // end Url object definition

function decode(inputValue) {
    return Url.decode(inputValue);
} // end decode


//used to extract the query string variables from the url
function getQueryVariable(variable, defaultValue) {
    var query = window.location.search.substring(1);
    var vars = query.split("&");
    for (var i=0;i<vars.length;i++) {
        var pair = vars[i].split("=");
        if (pair[0] == variable) {
            if (pair[1] != "") {
                return decode(pair[1]);
            } else {
                return defaultValue;
            }
        }
    }
    return defaultValue;
} // end getQueryVariable

/**
 * Extend String object to allow Title Case function
 */
String.prototype.titleCase = function () {
    var str = "";
    var wrds = this.split(" ");
    for(keyvar in wrds) {
        str += ' ' + wrds[keyvar].substr(0,1).toUpperCase() + wrds[keyvar].substr(1,wrds[keyvar].length).toLowerCase();
    }
    return jQuery.trim(str);
}

/** return relative URL for advice services directory **/
function getASDPath(display) {
    var url = window.location.href;
    var vars = url.split("/");

    var base = "/" + vars[3] + "/" + vars[4] + "/";
    var country = vars[5] == undefined ? "" : vars[5] + "/";
    var region = vars[6] == undefined ? "" : vars[6] + "/";

    if (region.indexOf("?") != -1) {
        region = region.substring(0, region.indexOf("?"));
    }

    if (display == "country") {
        return "/get_advice/advice_services_directory";
    } else if (display == "region") {
        return base + country + region;
    }

    return;
} // end getASDPath

var inlineFormValidate = {
    // standard regexp
    textBoxRegExp: "^.{1,300}$",
    textAreaRegExp: "^.{1,3000}",
    emailRegExp: "^([\\da-zA-Z-_+][\\da-zA-Z-_+.\\w']*[\\da-zA-Z-_+]@[\\da-zA-Z]['-.\\w]*[\\da-zA-Z]\\.[a-zA-Z]{2,7})$",
    postcodeRegExp:"^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$",
    phoneRegExp:"^0[1237][\\d ]{5,18}$",
    dateOfBirthRegExp:"^\\d{2,}\/[01]\\d\/19\\d{2,}$",
    amountRegExp:"^\\d{1,10}\\.?\\d{0,2}$",

    /**
     * Checks for valid input based on reg expression
     *
     * field - The id of the field
     * regExCheck - regular expression to check against
     * message - message to display if it doesn't pass a check
     * required - 1/0 Whether the field is required, ie if you can have a blank value in it
     */
    checkField: function (field, regExCheck, message, required) {
        var regExLine = new RegExp(regExCheck, "i");
        var fieldID = "#" + field;
        var fieldVal = jQuery.trim($(fieldID).val());

        if (regExLine.test(fieldVal)) {
            if (fieldVal != "" || (fieldVal == "" && required == 1)) {
                $(fieldID).parent().removeClass("requiredError").addClass("requiredOkay");
            } else {
                $(fieldID).parent().removeClass("requiredError requiredOkay");
            }
            if ($(fieldID + "_reqMsg").length > 0) {
                $(fieldID + "_reqMsg").hide();
            }
        } else {
            if (fieldVal != "" || (fieldVal == "" && required == 1)) {
                $(fieldID).parent().removeClass("requiredOkay").addClass("requiredError");
                if ($(fieldID + "_reqMsg").length > 0) {
                    $(fieldID + "_reqMsg").show();
                } else {
                    $(fieldID).after("<div id=\"" +  field + "_reqMsg\" class=\"requiredMsg\">" + message + "</div>")
                }
            } else {
                $(fieldID).parent().removeClass("requiredError requiredOkay");
                $(fieldID + "_reqMsg").hide();
            }
        }

        // replace value with whitespace trimmed version
        $(fieldID).val(fieldVal);
    }, // checkField

    /** 
     * Check for a valid selection in a drop down
     * field - dropdown box select id
     * emptyValue - value to check against
     * message - message to display if it doesn't pass a check
     * required - 1/0 Whether the field is required, ie if you can have a blank value in it
     */
    checkDropDown: function (field, emptyValue, message, required) {
        var fieldID = "#" + field;
        var fieldVal = $(fieldID + " option:selected").val();

        if (fieldVal != emptyValue) {
            if (fieldVal != "" || (fieldVal == "" && required == 1)) {
                $(fieldID).parent().removeClass("requiredError").addClass("requiredOkay");
            } else {
                $(fieldID).parent().removeClass("requiredError requiredOkay");
            }
            if ($(fieldID + "_reqMsg").length > 0) {
                $(fieldID + "_reqMsg").hide();
            }
        } else {
            if (fieldVal != "" || (fieldVal == "" && required == 1)) {
                $(fieldID).parent().removeClass("requiredOkay");
                $(fieldID).parent().addClass("requiredError");
                if ($(fieldID + "_reqMsg").length > 0) {
                    $(fieldID + "_reqMsg").show();
                } else {
                    $(fieldID).after("<div id=\"" +  field + "_reqMsg\" class=\"requiredMsg\">" + message + "</div>")
                }
            }
        }
    }, // end checkDropDown

    /**
     * Check that at least one radio has been selected
     **/
    checkRadioSelect: function(fieldID, message) {
        var groupFieldID = fieldID.substr(0, fieldID.lastIndexOf("_"));
        var fieldName = groupFieldID.replace("_", ":");
        var field = $("#" + fieldID + "");

        var radioField = $("[name='" + fieldName + "']:checked");
        var errorMsg = $("#" + groupFieldID + "_reqMsg");

        if (radioField.length > 0) {
            field.parent().parent().removeClass("requiredError").addClass("requiredOkay");
            if (errorMsg.length > 0) {
                errorMsg.hide();
            }
        } else {
            field.parent().parent().removeClass("requiredOkay").addClass("requiredError");
            if (errorMsg.length > 0) {
                errorMsg.show();
            } else {
                field.parent().parent().after("<div id=\"" + groupFieldID + "_reqMsg\" class=\"requiredMsg\">" + message + "</div>")
            }
        }
    }, // end checkRadioSelect

    checkExpiryDateField: function (monthField, yearField, regExCheckMonth, regExCheckYear, message, required) {
        var regExLineMonth = new RegExp(regExCheckMonth, "i");
        var regExLineYear = new RegExp(regExCheckYear, "i");

        var fieldID = "#" + yearField;
        var monthFieldVal = jQuery.trim($("#" + monthField).val());
        var yearFieldVal = jQuery.trim($("#" + yearField).val());

        if (regExLineMonth.test(monthFieldVal) && regExLineYear.test(yearFieldVal)) {
            if ((monthFieldVal != "" && yearFieldVal != "") || (monthFieldVal == "" && yearFieldVal == "" && required == 1)) {
                $(fieldID).parent().removeClass("requiredError").addClass("requiredOkay");
            } else {
                $(fieldID).parent().removeClass("requiredError requiredOkay");
            }
            if ($(fieldID + "_reqMsg").length > 0) {
                $(fieldID + "_reqMsg").hide();
            }
        } else {
            if ((monthFieldVal != "" || yearFieldVal != "") || (monthFieldVal == ""  && yearFieldVal == "" && required == 1)) {
                $(fieldID).parent().removeClass("requiredOkay").addClass("requiredError");
                if ($(fieldID + "_reqMsg").length > 0) {
                    $(fieldID + "_reqMsg").show();
                } else {
                    $(fieldID).after("<div id=\"" +  yearField + "_reqMsg\" class=\"requiredMsg\">" + message + "</div>")
                }
            }
        }
    }, // checkExpiryDateField

    /**
     * Basic credit card number check using Luhn algorithm 
     * Strips out the white space and letters
     * Does not do a check for proper issuers prefix
     **/
    checkCardNumberField: function (field, message, required) {
        var fieldID = "#" + field;
        var fieldVal = jQuery.trim($(fieldID).val());

        // Strip any non-digits (useful for credit card numbers with spaces and hyphens)
        fieldVal = fieldVal.replace(/\D/g, '');

        if (fieldVal.length <= 19) {
            // Set the string length and parity
            var number_length = fieldVal.length;
            var parity = number_length % 2;

            // Loop through each digit and do the maths
            var total=0;
            for (i=0; i < number_length; i++) {
                var digit = fieldVal.charAt(i);
                // Multiply alternate digits by two
                if (i % 2 == parity) {
                    digit=digit * 2;
                    // If the sum is two digits, add them together (in effect)
                    if (digit > 9) {
                        digit=digit - 9;
                    }
                }
                // Total up the digits
                total = total + parseInt(digit);
            }
        }

        // If the total mod 10 equals 0, the number is valid
        if (total % 10 == 0 && fieldVal.length >= 12 && fieldVal.length <= 19) {
            if (fieldVal != "" || (fieldVal == "" && required == 0)) {
                $(fieldID).parent().removeClass("requiredError").addClass("requiredOkay");
            } else {
                $(fieldID).parent().removeClass("requiredError requiredOkay");
            }
            if ($(fieldID + "_reqMsg").length > 0) {
                $(fieldID + "_reqMsg").hide();
            }
        } else {
            if (fieldVal != "" || (fieldVal == "" && required == 1)) {
                $(fieldID).parent().removeClass("requiredOkay");
                $(fieldID).parent().addClass("requiredError");
                if ($(fieldID + "_reqMsg").length > 0) {
                    $(fieldID + "_reqMsg").show();
                } else {
                    $(fieldID).after("<div id=\"" +  field + "_reqMsg\" class=\"requiredMsg\">" + message + "</div>")
                }
            }
        }

        // replace value with whitespace trimmed version
        $(fieldID).val(fieldVal);
    }, // end checkCardNumberField

    /*
     * Check for valid DOB when using 3 drop downs, optional over 18 check
     * day, month, year - ids of the fields
     * over18 - true/false
     */
    checkDOB:function (day, month, year, over18, required) {
        var selectedDay = $(day + " option:selected").text();
        var selectedMonth = $(month + " option:selected").text();
        var selectedYear = $(year + " option:selected").text();

        var thisYear = new Date().getFullYear();

        var today = new Date().getTime();
        var DOB = new Date(selectedYear, $(month + " option:selected").val() - 1, selectedDay).getTime();
        var yearsToDate = (today - DOB)/(1000*60*60*24*365);

        wrapperID = year;

        if ((selectedDay == "" || selectedMonth == "" || selectedYear == "")) {
            if ((selectedDay != "" || selectedMonth != "" || selectedYear != "")|| (selectedDay == "" && selectedMonth == "" && selectedYear == "" && required)) {
                $(wrapperID).parent().removeClass("requiredOkay").addClass("requiredError");
                if ($("#dob_reqMsg").length > 0) {
                    $("#dob_reqMsg").show();
                } else {
                    $(wrapperID).after("<div id=\"dob_reqMsg\" class=\"requiredMsg\">Please enter a valid date of birth</div>");
                }
            } else {
                if ($("#dob_reqMsg").length > 0) {
                    $(wrapperID).parent().removeClass("requiredError");
                    if (selectedDay != "" || selectedMonth != "" || selectedYear != "") {
                        $(wrapperID).parent().addClass("requiredOkay");
                    } else {
                        $(wrapperID).parent().removeClass("requiredOkay");
                    }
                    $("#dob_reqMsg").hide();
                }
            }
        } else {
            if ((yearsToDate < 18) && over18 == true) {
                $(wrapperID).parent().removeClass("requiredOkay").addClass("requiredError");
                if ($("#dob_youngMsg").length > 0) {
                    $("#dob_youngMsg").show();
                } else {
                    $(wrapperID).after("<div id=\"dob_youngMsg\" class=\"requiredMsg\">You must be 18 or over</div>");
                }
                $("#dob_reqMsg").hide();
            } else {
                if (yearsToDate >= 18) {
                    $(wrapperID).parent().addClass("requiredOkay");
                } else {
                    $(wrapperID).parent().removeClass("requiredOkay");
                }
                $(wrapperID).parent().removeClass("requiredError");
                $("#dob_youngMsg, #dob_reqMsg").hide();
            }
        }
    }, // checkDOB

    /*
     * Generic version with min  age pass in - 0 means no checking
     */
    checkDOBGeneric:function (day, month, year, minAge, required) {
        var selectedDay = $(day + " option:selected").text();
        var selectedMonth = $(month + " option:selected").text();
        var selectedYear = $(year + " option:selected").text();

        var thisYear = new Date().getFullYear();

        var today = new Date().getTime();
        var DOB = new Date(selectedYear, $(month + " option:selected").val() - 1, selectedDay).getTime();
        var yearsToDate = (today - DOB)/(1000*60*60*24*365);

        wrapperID = year;

        if ((selectedDay == "" || selectedMonth == "" || selectedYear == "")) {
            if ((selectedDay != "" || selectedMonth != "" || selectedYear != "")|| (selectedDay == "" && selectedMonth == "" && selectedYear == "" && required)) {
                $(wrapperID).parent().removeClass("requiredOkay").addClass("requiredError");
                if ($("#dob_reqMsg").length > 0) {
                    $("#dob_reqMsg").show();
                } else {
                    $(wrapperID).after("<div id=\"dob_reqMsg\" class=\"requiredMsg\">Please enter a valid date of birth</div>");
                }
            } else {
                if ($("#dob_reqMsg").length > 0) {
                    $(wrapperID).parent().removeClass("requiredError");
                    if (selectedDay != "" || selectedMonth != "" || selectedYear != "") {
                        $(wrapperID).parent().addClass("requiredOkay");
                    } else {
                        $(wrapperID).parent().removeClass("requiredOkay");
                    }
                    $("#dob_reqMsg").hide();
                }
            }
        } else {
            if (typeof minAge == "number" && minAge != 0 && (yearsToDate < minAge)) {
                $(wrapperID).parent().removeClass("requiredOkay").addClass("requiredError");
                if ($("#dob_youngMsg").length > 0) {
                    $("#dob_youngMsg").show();
                } else {
                    $(wrapperID).after("<div id=\"dob_youngMsg\" class=\"requiredMsg\">You must be " + minAge +" or over</div>");
                }
                $("#dob_reqMsg").hide();
            } else {
                if (yearsToDate >= minAge) {
                    $(wrapperID).parent().addClass("requiredOkay");
                } else {
                    $(wrapperID).parent().removeClass("requiredOkay");
                }
                $(wrapperID).parent().removeClass("requiredError");
                $("#dob_youngMsg").hide();
                $("#dob_reqMsg").hide();
            }
        }
    }, // checkDOBGeneric

    /*
     * Check that title has been selected, show/hide 'other' textbox as required
     * title, titleOther - ids of the fields
     * Other field value should be "Other"
     * Please select option field should be " "
     */
    checkTitle: function(title, titleOther) {
        var titleField = $("#" + title);
        var titleOtherField = $("#" + titleOther);
        var titleErrorMsg = $("#" + title + "_reqMsg");
        var titleOtherErrorMsg = $("#" + titleOther + "_reqMsg");

        if (titleField.val() != " ") {
            titleField.parent().addClass("requiredOkay").removeClass("requiredError");
            titleErrorMsg.hide();

            if (titleField.val() == "Other") {
                titleOtherField.attr("disabled", "");
                if (titleOtherField.val() == "") {
                    titleOtherField.focus();
                }
            } else {
                titleOtherField.parent().removeClass("requiredOkay requiredError");
                titleOtherField.val("");
                titleOtherField.attr("disabled", "disabled");
                titleOtherErrorMsg.hide();
            }
            $(titleField + "_reqMsg").hide();
        } else {
            if (titleErrorMsg.length > 0) {
                titleErrorMsg.show();
            } else {
                titleField.after("<div id=\"" + title + "_reqMsg\" class=\"requiredMsg\">Please select a title</div>")
            }
            titleField.parent().removeClass("requiredOkay").addClass("requiredError");
        }
    }, // end checkTitle

    /**
     * Check that the emails match
     **/
    checkEmailConfirm: function(email1, email2) {
        var emailField = $("#" + email1);
        var emailConfirmField = $("#" + email2);
        var emailConfirmErrorMsg = $("#" + email2 + "_emailMsg");

        if (emailField.val() != emailConfirmField.val()) {
            emailConfirmField.parent().removeClass("requiredOkay");
            emailConfirmField.parent().addClass("requiredError");

            if (emailConfirmErrorMsg.length > 0) {
                emailConfirmErrorMsg.show();
            } else {
                emailConfirmField.after("<div id=\"" + email2 + "_emailMsg\" class=\"requiredMsg\">Your email addresses don't match</div>")
            }
        } else {
            emailConfirmErrorMsg.hide();
        }
    },

    /**
     * Check that a check box has been checked
     **/
    checkCheckConfirm: function (fieldID, message) {
        var checkBoxField =  $("#" + fieldID);
        var errorMsg = $("#" + fieldID + "_reqMsg");

        if (checkBoxField.attr("checked") == "" || checkBoxField.attr("checked") == undefined) {
            $(checkBoxField).parent().addClass("requiredError").removeClass("requiredOkay");
            if (errorMsg.length > 0) {
                errorMsg.show();
            } else {
                checkBoxField.parent().append("<div id=\"" + fieldID + "_reqMsg\" class=\"requiredMsg\">" + message + "</div>")
            }
            return false;
        } else {
            $(checkBoxField).parent().removeClass("requiredError").addClass("requiredOkay");
            if (errorMsg.length > 0) {
                errorMsg.hide();
            }
            return true;
        }
    }, // end checkCheckConfirm

    checkRadio: function(fieldID, message) {
        var radioField = $("input[name='" + fieldID + "']");
        var radioFieldLength = $("input[name='" + fieldID + "']:checked").length;
        var errorMsg = $("#" + fieldID.replace(":", "\\:") + "_reqMsg");

        if (radioFieldLength == 0) {
            radioField.eq(1).parent().addClass("requiredError").removeClass("requiredOkay");
            if (errorMsg.length > 0) {
                errorMsg.show();
            } else {
                radioField.eq(1).parent().append("<div id=\"" + fieldID + "_reqMsg\" class=\"requiredMsg\">" + message + "</div>");
            }
        } else {
            radioField.eq(1).parent().removeClass("requiredError").addClass("requiredOkay");
            if (errorMsg.length > 0) {
                errorMsg.hide();
            }
        }
    } // end checkRadio

} // end inlineFomValidate object

/** 
 * Look for address that match house number / name
 *
 * Usage: Add a bind to the lookup button 
 *      e.g. addressLookUp.lookUp(e, "#lookup_house_no_id", "#lookup_postcode_id");
 *
 * Override callback updating this parameter with the function name to call - addressLookUp.callback
 **/
var addressLookUp = {
    addressLines: null,
    addresses: null,
    objectToAppendTo: null,
    lookupValue: "",
    messageID: "addressLookUpMsg",
    callback: "this.finishedLookUp",
    noAddressMsg: "Sorry no addresses found, please try again or enter your address below",

    // update the address labels
    updateAddressLabels: function() {
        $("label[for='" + this.addressLines[0] + "']").html("Address");
        $("label[for='" + this.addressLines[1] + "'], label[for='"+ this.addressLines[2] + "']").hide();
    },

    displayMessage: function(message) {
        if ($("#" + this.messageID + " span").length > 0) {
            $("#" + this.messageID + " span").html(message);
        } else {
            message = "<div id=\"" + this.messageID + "\"><span>" + message + "</span></div>";
            $(this.objectToAppendTo).parent().append(message);
        }
    }, // end displayMessage

    clearAddressErrors: function() {
        for (line in this.addressLines) {
            $("#" + this.addressLines[line]).parent().removeClass("requiredError");
            $("#" + this.addressLines[line] + "_reqMsg").hide();
        }

        this.displayMessage("");
    }, // end clearAddressErrors

    lookUp: function(e, inputHouseNoID, inputPostcodeID) {
        var inputHouseNo = jQuery.trim($(inputHouseNoID).val());
        var inputPostcode = jQuery.trim($(inputPostcodeID).val());
        
        this.objectToAppendTo = inputPostcodeID;
        this.lookupValue = Url.encode(inputHouseNo + "," + inputPostcode);

        if (inputHouseNo != "" && inputPostcode != "") {
            $("#addressesHolder").remove();
            $(inputPostcodeID).addClass("ac_loading");
    
            var onSuccess = function(json) {
                $(inputPostcodeID).removeClass("ac_loading");
                addressLookUp.addresses = json.addresses;
                addressLookUp.displayList();
            };
            var onFail = function() {
                $(inputPostcodeID).removeClass("ac_loading");
                addressLookUp.displayMessage(addressLookUp.noAddressMsg);
            };
            
            $.ajax({
                type: "GET",
                url: "/postcode/check.php?address=" + this.lookupValue,
                dataType: "json",
                success: onSuccess,
                error: onFail
            });
        } else {
            this.displayMessage("Please enter your house number and postcode to search.");
        }
    }, // end lookUp

    displayList: function() {
        if (this.addresses != null && this.addresses.length) {
            if (this.addresses.length > 1) { // generate a list 
                var addressList = "";

                for (var i=0, l=this.addresses.length; i < l ; i++) {
                    addressList += "<li>" + this.addresses[i] + "</li>\n";
                }
                addressListHTML = "<div id=\"addressesHolder\">\n";
                addressListHTML += "<div id=\"intro\">Please select an address</div><div id=\"close\"><a href=\"#\">Close</a></div>";
                addressListHTML += "<ul id=\"addressLookUpList\">\n" + addressList + "</ul>\n";
                addressListHTML += "</div>\n";

                $("#" + this.messageID).remove();

                // display the item
                $(this.objectToAppendTo).parent().after(addressListHTML);
                
                $("ul#addressLookUpList li").click(function(e) { // bind the click actions
                    e.preventDefault();
                    if (e.stopPropagation) e.stopPropagation();
                    addressLookUp.insertAddress($(this).html());
                    $("#addressesHolder").hide();
                });
                
                $("#close a").click(function() {
                    $("#addressesHolder").hide();
                    return false;
                });
            } else { // only 1 address so insert straight away
                var noMatchesRegExp = /w No matches/;
                if (!noMatchesRegExp.test(this.addresses[0])) {
                    this.insertAddress(this.addresses[0]);
                    this.displayMessage("Please check the address found");
                } else {
                    this.displayMessage(this.noAddressMsg);
                }
                this.doCallback();
            }
        } else { // no addresses found
            this.displayMessage(this.noAddressMsg);
            this.doCallback();
        }
    }, // end displayList

    insertAddress: function(value) {
        var parts = value.split(",");

        // populate address fields if address found
        addressParts = parts.length;
        if (addressParts > 0 && this.addressLines != null) {
            // clear the current address
            for (x in this.addressLines) {
                $("#" + this.addressLines[x]).val("");
            }

            // break up the final field
            pcCityParts = jQuery.trim(parts[addressParts -1]).split(" ");

            pc = pcCityParts[pcCityParts.length - 2] + " " + pcCityParts[pcCityParts.length - 1];
            city = pcCityParts[0].titleCase();

            if (pcCityParts.length > 2) {
                for (i = 1; i < pcCityParts.length - 2; i++) {
                    city += " " + pcCityParts[i].titleCase();
                }
            }

            // populate according to the number of elements
            $("#" + this.addressLines[0]).val(jQuery.trim(parts[0])); // add 1
            if (parts[1] != undefined && addressParts >= 3) {
                $("#" + this.addressLines[1]).val(jQuery.trim(parts[1])); // add 2
            }
            if (parts[2] != undefined && addressParts >= 4) {
                $("#" + this.addressLines[2]).val(jQuery.trim(parts[2].titleCase())); // add 3
            }
            if (parts[3] != undefined && addressParts == 5) {
                $("#" + this.addressLines[3]).val(jQuery.trim(parts[3].titleCase())); // city
                $("#" + this.addressLines[4]).val(city); // county
            } else if (addressParts > 1) {
                $("#" + this.addressLines[3]).val(city); // city
            }
            $("#" + this.addressLines[5]).val(pc); // postcode

            this.doCallback();
        }
    }, // end insertAddress
    
    doCallback: function() {
        if (this.callback != null) {
            eval("" + this.callback + "()");
        }
    }, // end doCallback

    // callback - things to do when an address has been selected / when all actions have been performed
    finishedLookUp: function() {
        $("#enterAddressLink").hide();
        $("#addressFields").slideDown(500);
    } // end finishedLookup

} // end addressLookup object
