$(function () {
  
  if ($.cookie('visitor_valid_zipcode') == 'true') {
    $('div.listview-add').show();
  }

  $('.prod-listview input.txt').focus(function() {
    this.select();
  });
  
  $('.prod-listview .add-to-cart-btn').live('click', function(e) { // add to cart
    $(this).spin();

    $(this).parents('.add-to-cart-form').submit(); 
     
    return false;
  });  
  
  $('#find-zipcode a').click(function() {
    $("#find-zipcode-form").ajaxSubmit({  
      beforeSubmit: ZipCode.beforeSubmit('#find-zipcode-form'),
      success: ZipCode.redirect,
      error: ZipCode.error_redirect
    });
    return false;
  });

  $("#zipcode-entry :input[name='zipcode']").focus(function () {
    $("#zipcode-entry :input[name='zipcode']").val(''); // clear zipcode box when focus obtained
  });

  $('#zipcode-entry').keypress(function(e) {
    if (e.keyCode == 13) { // handle enter key
      $('#find-zipcode a').spin();
      $("#find-zipcode-form").ajaxSubmit({  
        beforeSubmit: ZipCode.beforeSubmit('#find-zipcode-form'),
        success: ZipCode.redirect,
        error: ZipCode.error_redirect
    });
    return false;          
    }
  });

});


var ZipCode = function() {
  var _successMessage = 'Congrats! We deliver there. Just add one or more of the items below to your cart and check out! You’ll be prompted to enter recipient address & notes during checkout.';
  var _invalidMessage = 'Sorry Charlie, that isn\'t a real zipcode.';
  var _formId = null;

  return {

    // This regular expression will validate a US zip code, which can be either 5 numbers. 
    // Or 5 numbers, plus a dash, then 4 more numbers. 
    isValid: function(value) {
      var expression = /^\d{5}([\-]\d{4})?$/;
      return (expression.test(value));
    },

    // Zipcode message dependent on path
    displayMessage: function(valid, formId) {
      if (valid) {
        $(formId + ' .message').html(_successMessage);  
      } else {
        $(formId + ' .message').html(_invalidMessage);
      }
      $('.spinner').hide();
    },

    // validates proper zipcode before submitting 
    beforeSubmit: function(formId) {
      _formId = formId;
      var zipcode = $(formId + ' :input[name="zipcode"]').val();
  
      if (!ZipCode.isValid(zipcode)) {
        ZipCode.displayMessage(null, formId);
        $.cookie('visitor_valid_zipcode') == 'false';
        return false;
      }
      $('div.listview-add').hide();
      $(formId + ' .message').slideUp();
      $(formId + ' a.get-started').spin();
    },

    // redirect the page depending on the returned path value
    redirect: function(responseText, statusText) {
      var redirectTo = null;
      try {
        zipcode = JSON.parse(responseText); 
      } catch(e) {
        ZipCode.displayMessage(null, _formId);
      }
      if (zipcode && zipcode.valid) {
        ZipCode.displayMessage(zipcode.valid, _formId);
        $('div.listview-add').show();
      } else {
        ZipCode.displayMessage(false, _formId);
        $('div.listview-add').hide();
      }
      $(_formId + ' .message').slideDown();
    },

    // error catch for ajax request errors
    error_redirect: function(XMLHttprequest, textStatus, errorThorwn) {
      $('div.listview-add').hide();
      $(_formId + '.message').html('Ajax request error:' + errorThown);
    }

  };
}();

