function verifyInfo() {
  var formError = '';
  if (formError=='') formError = testField('cust_name', 'customer name', 'text', 3);
  if (formError=='') formError = testField('cust_company', 'company name', 'text', 0);
  if (formError=='') formError = testField('cust_address', 'billing address', 'text', 5);
  if (formError=='') formError = testField('cust_city', 'city name', 'text', 2);
  if (formError=='') formError = testField('cust_state', 'state', 'option', 2);
  if (formError=='') formError = testField('cust_zip', 'ZIP code', 'text', 5);
  if (formError=='') formError = testField('cust_email', 'email address', 'text', 7);
  if (formError=='') formError = testField('cust_phone', 'phone number', 'text', 10);
  if (formError=='') formError = testField('cust_shipping', 'shipping method', 'option', 2);
  if (formError=='') formError = testField('cust_tos', 'Terms of Service (below)', 'checkbox', 1);
  if (formError!='') { infoStatus(formError, 'bad'); } else { infoStatus('Click <u>Next</u> to proceed.', 'good'); }
}

function testField(id, desc, type, minlength) {
  if (type=='text') {
    $(id).value = $(id).value.clean();
    if ($(id).value.length < minlength) {
      return ('You must enter a valid '+desc+' to continue.');
    }
  }
  if (type=='option') {
    if ($(id)) {
      if ($(id).options.selectedIndex==0) {
        return ('You must select a valid '+desc+' to continue.');
      }
    } else {
      return ('You must click <u>Get Options</u> to continue.');
    }
  }
  if (type=='checkbox') {
    if ($(id).checked==false) {
      return ('You must read and agree to the '+desc+' to continue.');
    }
  }
  return '';
}

function infoStatus(msg, status) {
  var btn = '';
  if (status=='bad') {
    btn = '<input type="button" value="Refresh" onClick="verifyInfo();">';
    $('cust_status_container').removeClass('status_bg_good');
    $('cust_status_container').addClass('status_bg_bad');
    $('cust_status').removeClass('status_good');
    $('cust_status').addClass('status_bad');
    $('cust_status').innerHTML = msg + btn;
  } else {
    btn = '<input type="submit" value="Next &raquo;">';
    $('cust_status_container').removeClass('status_bg_bad');
    $('cust_status_container').addClass('status_bg_good');
    $('cust_status').removeClass('status_bad');
    $('cust_status').addClass('status_good');
    $('cust_status').innerHTML = msg + btn;
  }
}

function updateCart() {
  var url = "/cart/cart_ajax.php?action=update_cart";
  new Ajax(url, {
    method: 'post',
    data: $('cart_form'),
    update: $('cart_display'),
    onRequest: function() {
      cartStatusLoading(true);
      resetShipping();
    },
    onComplete: function() {
      cartStatusLoading(false);
    },
    onFailure: function() {
      cartStatusError('updateCart()');
    }
  }).request();
}

function deleteItem(id) {
  var url = "/cart/cart_ajax.php?action=delete_item";
  new Ajax(url, {
    method: 'post',
    data: 'id='+id,
    update: $('cart_display'),
    onRequest: function() {
      cartStatusLoading(true);
      resetShipping();
    },
    onComplete: function() {
      cartStatusLoading(false);
    },
    onFailure: function() {
      cartStatusError('deleteItem('+id+')');
    }
  }).request();
}

function getShippingOptions() {
  // Pass the state and ZIP code
  var url = "/cart/cart_ajax.php?action=shipping_options";
  var state = $('cust_state').options[$('cust_state').selectedIndex].text;
  var zip = $('cust_zip').value;
  new Ajax(url, {
    method: 'post',
    data: 'state='+state+'&zip='+zip,
    update: $('cart_status'),
    evalScripts: true,
    onRequest: function() {
      cartStatusLoading(true);
    },
    onComplete: function() {
      $('cart_status').removeClass('ajax_loading');
      bgFader($('cart_status'), '#ccffcc', '#f5f5f5');
      verifyInfo();
    },
    onFailure: function() {
      cartStatusError('getShippingOptions()');
    }
  }).request();
}

function customerSearch() {
  // Look up the customer, given the client identifier
  var url = "/cart/cart_ajax.php?action=customer_search";
  var search = $('cust_search').value;
  new Ajax(url, {
    method: 'post',
    data: 'search='+search,
    update: $('cart_status'),
    evalScripts: true,
    onRequest: function() {
      cartStatusLoading(true);
    },
    onComplete: function() {
      $('cart_status').removeClass('ajax_loading');
      bgFader($('cart_status'), '#ccffcc', '#f5f5f5');
      verifyInfo();
    },
    onFailure: function() {
      cartStatusError('customerSearch()');
    }
  }).request();
}

function resetShipping() {
  $('shipping_options').innerHTML = '<input id="shipping_button" type="button" value="Get Options" onClick="javascript:getShippingOptions();">';
  verifyInfo();
}

function cartStatusLoading(val) {
  if (val) {
    $('cart_status').innerHTML = '&nbsp;';
    $('cart_status').addClass('ajax_loading');
  } else {
    $('cart_status').innerHTML = 'Updated.';
    $('cart_status').removeClass('ajax_loading');
    bgFader($('cart_status'), '#ccffcc', '#f5f5f5');
  }
}

function cartStatusError(retryFunction) {
  $('cart_status').removeClass('ajax_loading');
  $('cart_status').innerHTML = 'Please wait a moment and <a href=\'javascript:'+retryFunction+';\'>try your request again</a> to update the page.';
  bgFader($('cart_status'), '#ffcccc', '#f5f5f5');
}

function bgFader(obj, start, finish) {
  var fx = new Fx.Style(obj, 'background-color', {
    duration: 1250,
    transition: Fx.Transitions.Quad.easeOut
  }).start(start, finish);
}

// Initialization
window.addEvent('domready', function(){
  verifyInfo();
  resetShipping();

  var shipTip = new Tips($$('.shipTip'), {
    initialize:function(){
      this.fx = new Fx.Style(this.toolTip, 'opacity', {duration: 250, wait: false}).set(0);
    },
    onShow: function(toolTip) {
      this.fx.start(1);
    },
    onHide: function(toolTip) {
      this.fx.start(0);
    }
  });

});
