/* + [EXTERNAL] DealerSearch constructor
 */
function DealerSearch() {
  this._timeoutID = -1;
  this._count = 0;
  this._recent = '';
  this._inputElements = Array();
  this._resultsCallbackArray = Array();
  this._loadingCallbackArray = Array();
}

/* + [EXTERNAL] Add Search Input
 */
DealerSearch.prototype.addSearchInput = function(inputElement, searchType) {
  var dealerSearch = this;
  dealerSearch._inputElements.push(inputElement);
  $(inputElement).keyup(function(e) {
    if( $(this).val() != dealerSearch._recent && $(this).val().length > 0 ) {
      dealerSearch._recent = $(this).val();
      dealerSearch._resetInputs();
      $(this).val(dealerSearch._recent);
      dealerSearch._updateDealerList(searchType, dealerSearch._recent);
    }
  });
}

/* + [EXTERNAL] Add Results Callback
 */
DealerSearch.prototype.addResultsCallback = function(callbackFunction) {
  this._resultsCallbackArray.push(callbackFunction);
}

/* + [EXTERNAL] Add Loading Callback
 */
DealerSearch.prototype.addLoadingCallback = function(callbackFunction) {
  this._loadingCallbackArray.push(callbackFunction);
}

/* - [INTERNAL] Reset Inputs
 */
DealerSearch.prototype._resetInputs = function() {
  var dealerSearch = this;
  $(dealerSearch._inputElements).each(function(i,n) {
    $(n).val('');
  });
}

/* - [INTERNAL] Update Dealer List
 */
DealerSearch.prototype._updateDealerList = function(paramString, paramValue) {
  var dealerSearch = this;
  clearTimeout(dealerSearch._timeoutID);
  dealerSearch._hideResults();
  dealerSearch._hideLoading();
  if(paramValue.length < 4) {
    //dealerSearch._processResults(null);
    dealerSearch._count++;
    return;
  }
  dealerSearch._timeoutID = setTimeout(function() {
    dealerSearch._showLoading();
    dealerSearch._count++;
    $.ajax({
      url: '/toyota/main/actions/getDealerDetails',
      data: paramString + '=' + paramValue,
      dataType: 'json',
      async: true,
      error: function() { },
      success: dealerSearch._detailsCallback,
      searchID: dealerSearch._count,
      dealerSearchObject: dealerSearch,
      success: function(data, textStatus) {
        var dealerSearch = this.dealerSearchObject;
        if(this.searchID != dealerSearch._count) return;
        dealerSearch._hideLoading();
        dealerSearch._processResults(data);
      }
    });
  }, 1000);
}

/* - [INTERNAL] Hide Results
 */
DealerSearch.prototype._hideResults = function() {
  var dealerSearch = this;
  $(dealerSearch._resultsCallbackArray).each(function(i,n) {
    n(false);
  });
}
/* - [INTERNAL] Show Results
 */
DealerSearch.prototype._processResults = function(results) {
  var dealerSearch = this;
  $(dealerSearch._resultsCallbackArray).each(function(i,n) {
    n(results);
  });
}
/* - [INTERNAL] Hide Loading
 */
DealerSearch.prototype._hideLoading = function() {
  var dealerSearch = this;
  $(dealerSearch._loadingCallbackArray).each(function(i,n) {
    n(false);
  });
}
/* - [INTERNAL] Show Loading
 */
DealerSearch.prototype._showLoading = function() {
  var dealerSearch = this;
  $(dealerSearch._loadingCallbackArray).each(function(i,n) {
    n(true);
  });
}

