
function isFieldNumeric(strString){
    var strValidChars = "0123456789.-";
    var strChar;
    var blnResult = true;
    
    if (strString.length === 0) {
		return false;
	}
    //  test strString consists of valid characters listed above
    for (i = 0; i < strString.length && blnResult === true; i++) {
        strChar = strString.charAt(i);
        if (strValidChars.indexOf(strChar) == -1) {
            blnResult = false;
        }
    }
    return blnResult;
}

function GetCBSAddress(postcodelookupfield){
    var house_number = '';
    var post_code = '';
    var params;
    var xmlHttp = null;
    var browser = navigator.appName;
    
    if (browser == "Microsoft Internet Explorer") {
        /* Create the object using MSIE's method */
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        /* Create the object using other browser's method */
        xmlHttp = new XMLHttpRequest();
    }
    //if still cannot create HTTP REQUEST object:
    if (!xmlHttp) {
        document.getElementById("address_error").innerHTML = 'Sorry. We are experiencing problems checking postcode. Please try again or enter your details below.';
    }
    
    xmlHttp.onreadystatechange = function(){
        if (xmlHttp.readyState == 4) {
            var Response = xmlHttp.responseText;
			if (Response == "TOOMANYATTEMPTS") {
                document.getElementById("address_error").innerHTML = "Sorry. Can only look up 10 postcodes. Please enter your full details below.";
                return;
            } else if (Response == "NOTFOUND") {
                document.getElementById("address_error").innerHTML = "Sorry. Address not found. Please enter your full details below.";
                return;
            } else if (Response == "ERROR") {
                document.getElementById("address_error").innerHTML = "Sorry. We are experiencing problems looking up your postcode. Please enter your full details below.";
                return;
            } else {
                // Split the comma delimited response into an array
                results = Response.split(",");

                if (results[0] == 'OK') {
                    house_number = document.getElementById('txtHouseNameNumber').value;
                    if (isFieldNumeric(house_number) === true) {
						if (document.getElementById('txtBillingAddressLine1')) {
							document.getElementById('txtBillingAddressLine1').value = house_number + ' ' + results[1];
						}
						else if (document.getElementById('address1')) {
								if (document.getElementById('txtHouseNameNumber')) {
									document.getElementById('address1').value = results[1];
								} else {
									document.getElementById('address1').value = house_number + ' ' + results[1];
								}
							}
							else if (document.getElementById('txtDeliveryAddressLine1')) {
									document.getElementById('txtDeliveryAddressLine1').value = house_number + ' ' + results[1];
								}
								else if (document.getElementById('deladdress1')) {
									if (document.getElementById('txtHouseNameNumber')) {
										document.getElementById('deladdress1').value = results[1];
									} else {
										document.getElementById('deladdress1').value = house_number + ' ' + results[1];
									}
								}
					
                        if (document.getElementById('txtBillingAddressLine2')) {
						
							document.getElementById('txtBillingAddressLine2').value = results[2];
						}
						else if (document.getElementById('address2')) { 
								if (document.getElementById('address1').value == '') {
									document.getElementById('address1').value = results[2];
								}
								else {
									document.getElementById('address2').value = results[2];
								}
							}
							else if (document.getElementById('txtDeliveryAddressLine2')) {
									document.getElementById('txtDeliveryAddressLine2').value = results[2];
								}
								else if (document.getElementById('deladdress2')) {
										if(document.getElementById('deladdress1').value == ''){
											document.getElementById('deladdress1').value = results[2];
										}
										else{
											document.getElementById('deladdress2').value = results[2];	
										}
									}
                        
                        if (document.getElementById('txtBillingAddressLine3')) {
							document.getElementById('txtBillingAddressLine3').value = results[3];
						}
						else if (document.getElementById('address3')) {
								document.getElementById('address3').value = results[3];
							}
							else if (document.getElementById('txtDeliveryAddressLine3')) {
									document.getElementById('txtDeliveryAddressLine3').value = results[3];
								}
							else if (document.getElementById('deladdress3')) {
									document.getElementById('deladdress3').value = results[3];
								}
                    } else {
						if (document.getElementById('txtBillingAddressLine1')) {
							document.getElementById('txtBillingAddressLine1').value = house_number + ' ' + results[1];
						}
						else if (document.getElementById('address1')) {
								if (document.getElementById('txtHouseNameNumber')) {
									document.getElementById('address1').value = results[1];
								} else {
									document.getElementById('address1').value = house_number + ' ' + results[1];
								}
						}
						else if (document.getElementById('txtDeliveryAddressLine1')) {
									document.getElementById('txtDeliveryAddressLine1').value = house_number + ' ' + results[1];
						}
						else if (document.getElementById('deladdress1')) {
								if (document.getElementById('txtHouseNameNumber')) {
									document.getElementById('deladdress1').value = results[1];
								} else {
									document.getElementById('deladdress1').value = house_number + ' ' + results[1];
								}
						}

                        if (document.getElementById('txtBillingAddressLine2')) {
							document.getElementById('txtBillingAddressLine2').value = results[2];
						}
						else if (document.getElementById('address2')) {
								if (document.getElementById('address1').value == '') {
									document.getElementById('address1').value = results[2];
								}
								else{
									document.getElementById('address2').value = results[2];
								}
							}
							else if (document.getElementById('txtDeliveryAddressLine2')) {
									document.getElementById('txtDeliveryAddressLine2').value = results[1];
								}
								else if (document.getElementById('deladdress2')) {
										if (document.getElementById('deladdress1').value == '') {
											document.getElementById('deladdress1').value = results[2];
										}
										else {
											document.getElementById('deladdress2').value = results[2];
										}	
								}
                        
                        if (document.getElementById('txtBillingAddressLine3')) {
							document.getElementById('txtBillingAddressLine3').value = results[3];
						}
						else if (document.getElementById('address3')) {
								document.getElementById('address3').value = results[3];
							}
							else if (document.getElementById('txtDeliveryAddressLine3')) {
									document.getElementById('txtDeliveryAddressLine3').value = results[3];
								}
								else if (document.getElementById('deladdress3')) {
										document.getElementById('deladdress3').value = results[3];
								}
                        
                    }
                    if (document.getElementById('txtTown')) {
						document.getElementById('txtTown').value = results[5];
					}
					else if (document.getElementById('txtBillingTown')) {
							document.getElementById('txtBillingTown').value = results[5];
						}
						else if (document.getElementById('txtDeliveryTown')) {
								document.getElementById('txtDeliveryTown').value = results[5];
							}
							else if (document.getElementById('towncity')) {
									document.getElementById('towncity').value = results[5];
								}
								else if (document.getElementById('deltowncity')) {
										document.getElementById('deltowncity').value = results[5];
									}
                    
                    if (document.getElementById('txtPostcode')) {
						document.getElementById('txtPostcode').value = results[6];
					}
					else if (document.getElementById('txtBillingPostcode')) {
							document.getElementById('txtBillingPostcode').value = results[6];
						}
						else if (document.getElementById('txtDeliveryPostcode')) {
								document.getElementById('txtDeliveryPostcode').value = results[6];
							}
							else if (document.getElementById('postcode')) {
									document.getElementById('postcode').value = results[6];
								}
								else if (document.getElementById('delpostcode')) {
										document.getElementById('delpostcode').value = results[6];
								}
                    
                    document.getElementById("address_error").innerHTML = 'Please check address details below before proceeding.';
                }
            }
        }
    };
    document.getElementById("address_error").innerHTML = '';
    
    if (document.getElementById('txtBillingAddressLine1')) {
		document.getElementById('txtBillingAddressLine1').value = '';
	}
	else if (document.getElementById('txtBillingAddressLine1')) {
			document.getElementById('txtBillingAddressLine1').value = '';
		}
		else if (document.getElementById('address1')) {
				document.getElementById('address1').value = '';
			}
			else if (document.getElementById('deladdress1')) {
					document.getElementById('deladdress1').value = '';
			}
    
    if (document.getElementById('txtBillingAddressLine2')) {
		document.getElementById('txtBillingAddressLine2').value = '';
	}
	else if (document.getElementById('txtBillingAddressLine2')) {
			document.getElementById('txtDeliveryAddressLine2').value = '';
		}
		else if (document.getElementById('address2')) {
				document.getElementById('address2').value = '';
			}
			else if (document.getElementById('deladdress2')) {
					document.getElementById('deladdress2').value = '';
			}
    
    if (document.getElementById('txtBillingAddressLine3')) {
		document.getElementById('txtBillingAddressLine3').value = '';
	}	
	else if (document.getElementById('txtBillingAddressLine3')) {
		document.getElementById('txtDeliveryAddressLine3').value = '';
	}
	else if (document.getElementById('address3')) {
		document.getElementById('address3').value = '';
	}
	else if (document.getElementById('deladdress3')) {
		document.getElementById('deladdress3').value = '';
	}
    
    if (document.getElementById('txtTown')) {
		document.getElementById('txtTown').value = '';
	}
	else if (document.getElementById('txtBillingTown')) {
		document.getElementById('txtBillingTown').value = '';
	}
	else if (document.getElementById('txtDeliveryTown')) {
		document.getElementById('txtDeliveryTown').value = '';
	}
	else if (document.getElementById('towncity')) {
		document.getElementById('towncity').value = '';
	}
	else if (document.getElementById('deltowncity')) {
		document.getElementById('deltowncity').value = '';
	}
    
//add the code back here
post_code = document.getElementById(postcodelookupfield).value;
    if (post_code === '') {
        document.getElementById("address_error").innerHTML = "Please fill in postcode";
    } else {
        // Perform AJAX Post
        params = 'post_code=' + escape(post_code) + '&mode=proxy';
        xmlHttp.open("POST", "action.php?cdd=cbspostcodes", true);
        xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xmlHttp.send(params);
    }
}



function validPostCode(suffix){
	if(typeof suffix == "undefined"){
		var suffix = '';
	}
	
	var myPostCode = document.getElementById('postcode' + suffix).value;
	
	if (checkPostCode(myPostCode)) {
		document.getElementById('postcode' + suffix).value = checkPostCode(myPostCode);
		return true;
	}
	else {
		alert("Please enter a valid UK Postcode");
		return false;
	};
}

function checkPostCode(toCheck) {

  // Permitted letters depend upon their position in the postcode.
  var alpha1 = "[abcdefghijklmnoprstuwyz]";                       // Char 1
  var alpha2 = "[abcdefghklmnopqrstuvwxy]";                       // Char 2
  var alpha3 = "[abcdefghjkstuw]";                                // Char 3
  var alpha4 = "[abehmnprvwxy]";                                  // Charr 4
  var alpha5 = "[abdefghjlnpqrstuwxyz]";                          // Charr 5
  
  // 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.push (new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1,2})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));
  
  // Expression for postcodes: ANA NAA
  pcexp.push (new RegExp ("^(" + alpha1 + "{1}[0-9]{1}" + alpha3 + "{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));

  // Expression for postcodes: AANA  NAA
  pcexp.push (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.push (/^(GIR)(\s*)(0AA)$/i);

  // Load up the string to check
  var postCode = toCheck;

  // Assume we're not going to find a valid postcode
  var valid = false;
  
  // Check the string against the types of post codes
  for ( var i=0; i<pcexp.length; i++) {
    if (pcexp[i].test(postCode)) {
    
      // The post code is valid - split the post code into component parts
      pcexp[i].exec(postCode);
      
      // Copy it back into the original string, converting it to uppercase and
      // inserting a space between the inward and outward codes
      postCode = RegExp.$1.toUpperCase() + " " + RegExp.$3.toUpperCase();
      
      // If it is a BFPO c/o type postcode, tidy up the "c/o" part
      postCode = postCode.replace (/C\/O\s*/,"c/o ");
      
      // Load new postcode back into the form element
      valid = true;
      
      // Remember that we have found that the code is valid and break from loop
      break;
    }
  }
  
  // Return with either the reformatted valid postcode or the original invalid 
  // postcode
  if (valid) {return postCode;} else return false;
}

