
function JSearchInterface( strAction, zipcodeval, citystateval, searchradiusval )
{
  var m_action = strAction || "";
  var m_zipcodedefault = zipcodeval || "";
  var m_citystatedefault = citystateval || "";
  var m_searchradiusdefault = searchradiusval || 0;
  var m_form;
  var m_zipcodebox;
  var m_citystatebox;
  var m_radiusbox;
  var m_searchon;
  var m_hiddenLatitude;
  var m_hiddenLongitude;
  var m_zipcodebutton;
  var m_citystatebutton;
  var m_searchonValues = { zipcode: "zipcode", citystate: "citystate", latlong: "latlong" };
  var m_focused = { zipcode: false, citystate: false };
  var m_validationErrorMsg = "";
  
  //Closures
  this.m_form = m_form;
  this.m_zipcodebox = m_zipcodebox;
  this.m_citystatebox = m_citystatebox;
  this.m_radiusbox = m_radiusbox;
  this.m_searchon = m_searchon;
  this.m_searchonValues = m_searchonValues;
  this.m_zipcodebutton = m_zipcodebutton;
  this.m_citystatebutton = m_citystatebutton;
  this.m_focused = m_focused;
  this.m_validationErrorMsg = m_validationErrorMsg;
  
  //DOM connections
  this.m_form = document.userinput;
  this.m_zipcodebox = this.m_form.zipcode;
  this.m_citystatebox = this.m_form.citystate;
  this.m_radiusbox = this.m_form.searchradius;
  this.m_hiddenLatitude = this.m_form.latitude;
  this.m_hiddenLongitude = this.m_form.longitude;
  this.m_searchon = this.m_form.searchon;
  this.m_zipcodebutton = document.getElementById("zipcodebutton");
  this.m_citystatebutton = document.getElementById("citystatebutton");
  
  this.m_form.action = m_action;
  this.m_zipcodebox.value = m_zipcodedefault;
  this.m_citystatebox.value = m_citystatedefault;
  var select = this.m_radiusbox;
  var bDefaulted = false;
  for ( var i = 0; i < select.length; i++)
  {
    if ( select.options[i].value == m_searchradiusdefault )
    {
      select.selectedIndex = i;
      bDefaulted = true;
      break;
    }
  }
  if ((!bDefaulted) && (select.length > 0))
    select.selectedIndex = this.GetDefaultSearchRadiusIndex();
    
  this.SetZipCodeFocus();
  
  var _this = this;
  this.m_form.onsubmit = function()
    { return _this.Validate.apply( _this, arguments ); }
  this.m_zipcodebox.onfocus = function()
    { _this.SetZipCodeFocus.call( _this ); }
  this.m_citystatebox.onfocus = function()
    { _this.SetCityStateFocus.call( _this ); }
  this.m_zipcodebutton.onmouseup = function()
    { _this.SetZipCodeFocus.call( _this ); }
  this.m_citystatebutton.onmouseup = function()
    { _this.SetCityStateFocus.call( _this ); }  
}

JSearchInterface.prototype.Reset = function()
{
  this.m_zipcodebox.value = "";
  this.m_citystatebox.value = "";
  this.m_radiusbox.selectedIndex = this.GetDefaultSearchRadiusIndex();
  this.SetZipCodeFocus();
}

JSearchInterface.prototype.GetDefaultSearchRadiusIndex = function()
{
  var select = this.m_radiusbox;
  for ( var i = 0; i < select.length; i++)
  {
    if ( select.options[i].defaultSelected )
      return i;
  }
  return 0;
}

JSearchInterface.prototype.Validate = function()
{
  var valid = true;
  this.m_validationErrorMsg = "";
  if ( this.m_focused.zipcode )
    valid &= this.ValidZipCode();
  if ( this.m_focused.citystate )
    valid &= this.ValidCityState();
  if (!valid)
  {
    alert( this.m_validationErrorMsg );
    return false;
  }
  
  return true;
}

JSearchInterface.prototype.ValidZipCode = function()
{
  var val = this.m_zipcodebox.value;
  var valid = (this.ValidUSZipCode( val ) || this.ValidCanadaZipCode( val ));
  if (!valid)
    this.m_validationErrorMsg = "Please enter a valid zip code.";
  return valid;
}

JSearchInterface.prototype.ValidUSZipCode = function( val )
{
  return /^[0-9]{5}$/.test( val );
}

JSearchInterface.prototype.ValidCanadaZipCode = function( val )
{
  return /^[a-zA-Z]\d[a-zA-Z](\s)?\d[a-zA-Z]\d$/.test( val );
}

JSearchInterface.prototype.ValidCityState = function()
{
  var val = this.m_citystatebox.value;
  var citystate = parseCityStatePair( val );
  var city = citystate[0];
  var state = citystate[1];
  if ( state.length < 2 )
  {
    this.m_validationErrorMsg = "Please enter a city and a valid state.";
    return false;
  }
  return true;  
}

JSearchInterface.prototype.SetZipCodeFocus = function()
{
  this.m_focused.zipcode = true;
  this.m_focused.citystate = false;
  this.m_searchon.value = this.m_searchonValues.zipcode;
}

JSearchInterface.prototype.SetCityStateFocus = function()
{
  this.m_focused.zipcode = false;
  this.m_focused.citystate = true;
  this.m_searchon.value = this.m_searchonValues.citystate;
}

JSearchInterface.prototype.SearchByPoint = function( point )
{
  this.m_searchon.value = this.m_searchonValues.latlong;
  this.m_hiddenLatitude.value = point.latitude;
  this.m_hiddenLongitude.value = point.longitude;
  this.m_form.submit();
}