function postcodeLoc(jData) {
  if (jData == null) {
    // There was a problem parsing search results
    return;
  }
  gotoLocation(Math.round(jData.e/1000), Math.round(jData.n/1000), 1);

}

function find() {
  var where = $('where').value;
  var aObj;
  var request;
  if(where.length > 0) {
    // Only supports 6 fig grid references for now
    if(where.toUpperCase().match(/^([HNOST]\w\d{6})$/)) {
      var osref = getOSRefFromSixFigureReference(where.toUpperCase());
      var easting = Math.round(osref.easting/1000);
      var northing = Math.round(osref.northing/1000);
      if(typeof urchinTracker == 'function') urchinTracker('/ngrSearch');
      gotoLocation(easting,northing,1);
    }
    else if(where.toUpperCase().match(/^([A-Z]+\d+[A-Z]?)\s*(\d[A-Z][A-Z])?$/)) {
      request = "/cgi/geocoder.fcgi?postcode=" + encodeURIComponent(where) + "&callback=postcodeLoc&format=js";
      if(typeof urchinTracker == 'function') urchinTracker('/postcodeSearch');

    }
    else if(where.match(/^([45]\d\.?\d*)[\s,]+(\-?\d+\.?\d*)$/)) {
      // 0 is whole string, 1 is 1st bracket, 2 is 2nd bracket
      ll = where.match(/^([45]\d\.?\d*)[\s,]+(\-?\d+\.?\d*)$/);
      if(typeof urchinTracker == 'function') urchinTracker('/latlongSearch');
      gotoLatLong(ll[1],ll[2],1);
    }
    else {
      request = 'http://ws5.geonames.org/searchJSON?name=' + encodeURIComponent(where) + '&callback=getLocation&country=GB&fclass=P&fclass=T&style=SHORT';
      if(typeof urchinTracker == 'function') urchinTracker('/nameSearch');
    }
    aObj = new JSONscriptRequest(request);
    // Build the script tag
    aObj.buildScriptTag();
    // Execute (add) the script tag
    aObj.addScriptTag();
  }
  return false;
}
// this function will be called by our JSON callback
function getLocation(jData) {
  if (jData == null) {
    // There was a problem parsing search results
    return;
  }

  var geonames = jData.geonames;
  if (geonames.length > 0) {
    if (geonames.length == 1) {
      var name = geonames[0];
      gotoLatLong(name.lat, name.lng, 1);
    } else {
      var popup = showGeonamesPopup();
      for(var i=0; i<geonames.length; i=i+1) {
        appendLink($('geonames_results'), geonames[i]);
      }
    }
    $('where').value = '';
    if (typeof urchinTracker == 'function') urchinTracker('/sucessfulSearch');
  }
  else {
    alert("Sorry, can't find that location"); 
  }
}

function hideGeonamesPopup() {
 var popup = $('geonames_results_window'); 
 popup.style.display = 'none';
}

function showGeonamesPopup() {
 var popup = $('geonames_results_window'); 
 popup.style.display = 'block';
 $('geonames_results').innerHTML = '';
 
}

function appendLink(popup, loc) {
 var link = document.createElement("A");
 link.onclick = function () { gotoLatLong(loc.lat, loc.lng, 1); hideGeonamesPopup(); return false; };
 link.href = '#';
 link.innerHTML = loc.name ;
 popup.appendChild(link);
 var span = document.createElement("SPAN");
 span.className = "loc";
 formatLatLong(span, loc.lat, loc.lng);
 popup.appendChild(span);
 popup.appendChild(document.createElement("BR"));
}

function formatLatLong(parent, lat, lng) {
  var text = " N " + formatDeg(lat) + " " ;
  if (lng < 0) { text += "W ";} else { text += "E ";}
  text += formatDeg(Math.abs(lng));
  parent.appendChild(document.createTextNode(text));
}

function formatDeg(num) {
  return (Math.floor(num * 10)/10) + "\u00B0 ";
}

function gotoLatLong(lat, lng, zoom) {
    var ll = new LatLng(lat,lng);
    ll.WGS84ToOSGB36();
    var en = ll.toOSRef();
    var easting = Math.round(en.easting/1000);
    var northing = Math.round(en.northing/1000);
    gotoLocation(easting, northing, zoom);
}

