function validateSync(request) {
  validateSync(request, undefined);
}

function validateSync(request, target) {
  // evaluate response
  var responseText = request.responseText;
  
  validateSyncResponse(responseText, target);
}

function validateSyncResponse(responseText, target) {

  var $j = jQuery.noConflict();

  // clear spinner
  $j('.notification').empty();

  // clear notifications
  $j('.notification').html('');      

  // evaluate response
  var response = eval('(' + responseText + ')');

  if (response.success == "true") {
    $j('.popup').dialog('close');
    if (target != undefined && target != '') {
      window.location = target;
    }
  }
  else {
    var message = response.message;
    $j('.notification').html(message);      
  }
}

function validateNewAccount(request) {
  var response = prepareResponse(request);

  if (response.success == "true") {
    window.location = response.target;
  }
  else {
    displayResponse(response, 'red');    
  }
}

function validateExistingAccount(request) {
  var response = prepareResponse(request);
    
  var message = response.message;

  if (response.success == "true") {
    if (response.target != undefined) {
      window.location = response.target;
    }
    else {
      if (message == undefined) {
      	$j('.notification').html('Your account has been updated');
  	  }
  	  else {
        $j('.notification').html(message);
  	  }
	  }
  }
  else {
    displayResponse(response, 'red');
    enableOK();
  }
}

function validateLogin(request) {
  var response = prepareResponse(request);
  if (response.success == "true") {
  	window.location = '/upgrade/choose_plan';
  }
  else {
    displayResponse(response, 'gray');    
  }
}

function validateSendLink(request) {
  var response = prepareResponse(request);
  if (response.success == "true") {
  	window.location = 'view_email';
  }
  else {
    displayResponse(response, 'gray');    
  }
}

function validatePinReset(request) {
  var response = prepareResponse(request);
  if (response.success == "true") {
  	window.location = 'complete';
  }
  else {
    displayResponse(response, 'gray');    
  }
}

function validateBillingAccount(request) {
  var response = prepareResponse(request);
  var message = response.message;
  if (response.success == "true") {
    if (response.target != undefined) {
      window.location = response.target;
    }
    else {
      if (message == undefined) {
      	$j('.notification').html('Your billing info has been updated');
  	  }
  	  else {
        $j('.notification').html(message);
  	  }      
    }
  }
  else {
    var errors = response.errors;
    if (errors != undefined && errors.length > 0) {
      response.errors = mapCreditCardErrors(errors);
    }

    displayResponse(response, 'red');
    
    enableContinue();
  }  
}


function validateBillingChoosePlan(request) {
  var response = prepareResponse(request);
  if (response.success == "true") {
    window.location = response.target;
  }
  else {
    var errors = response.errors;
    if (errors != undefined && errors.length > 0) {
      response.errors = mapCreditCardErrors(errors);
    }

    displayResponse(response, 'red');
    
    enableContinue();
  }  
}

function mapCreditCardErrors(errors) {
  // map city and state errors to city_state
  // map expmonth and expyear to expdate
  // map number to cc_number
  for (var i = 0; i < errors.length; i++) {
    var errorData = errors[i];
    if (errorData.field == 'cc_city' || errorData.field == 'cc_state') {
      errorData.field = 'cc_city_state';
    }
    if (errorData.field == 'cc_expmonth' || errorData.field == 'cc_expyear') {
      errorData.field = 'cc_expdate';
    }
    if (errorData.field == 'number') {
      errorData.field = 'cc_number';
      errorData.message = 'That is not a valid credit card number';
    }
  }
  return errors;
}

function prepareResponse(request) {
  // clear spinner
  $j('.notification').empty();

  // reset errors
  $j('.validated').removeClass('error');
  $j('.errorMsg').remove();

  // evaluate response
  var response = eval('(' + request.responseText + ')');

  return response;
}

function displayResponse(response, msgColor) {
  var message = response.message;
  // check for generic message (for catastrophic error ... server down, major bug, etc.)
  if (message == undefined) {
    // insert errors for each field
    var errors = response.errors;

    // set error notification message
    $j('.notification').html('Please correct the errors noted above');

    for (var i = 0; i < errors.length; i++) {
      var errorData = errors[i];

      // get input field for this error
      var inputField = $j('#input_'+errorData.field);

      // check if there is an error already attached to this field
      if (inputField.children('.errorMsg').length == 0) {
        // if not, add error message
        inputField.addClass('error').append('<p class="errorMsg">' + errorData.message + '</p>');
      }
    }
  }
  else {
    // generic message must be set
    $j('.notification').html(message);      
    $j('.notification').css('color', msgColor);            
  }
}