data);
  }
  else {
    $packet = array(
      'agentnum'    => variable_get('freeside_agentnum',''),
      'promo_code'  => '',
      'reg_code'    => '',
      'keys'        => $keys,
    );
    $freeside = new FreesideSelfService(); 
    $freeside->clear_signup_cache();
    $info = $freeside->signup_info($packet);
    cache_set($cid, $info, 'cache', CACHE_TEMPORARY);
    return($info);
  }
}
function subextract($array, $key) {
  // map { $_->{$key} } (...)
  $out = array();
  foreach ($array as $i) {
    $out[] = $i[$key];
  }
  return $out;
}
function freeside_signup_form($form_state) {
  dkpr($form_state);
  $agentnum = variable_get('freeside_agentnum','');
  if( !$agentnum || !(variable_get('freeside_hostname','')) ) {
    drupal_set_message(t('Freeside self-service is not yet configured.'),'error');
    return array();
  }
  $freeside = new FreesideSelfService();
  $keys = array(
    // all the signup_info that we need
    'part_referral',
    'refnum',
    'emailinvoiceonly',
    'payby',
    'payby_longname',
    'part_pkg',
    'default_pkgpart',
    'signup_service',
  );
  $signup_info = signup_info($keys);
  dkpr($signup_info);
  $form = array();
  $refs = $signup_info['part_referral'];
  $form['refnum'] = count($refs) > 1 ?
    array(
      '#type'   => 'select',
      '#title'  => t('How did you hear about us?'),
      '#options'=> array_combine(
        subextract($refs, 'refnum'), 
        subextract($refs, 'referral')
      ),
      '#default_value'=>$signup_info['refnum'],
    ) : array (
      '#type'   => 'hidden',
      '#value'  => $refs[0]['refnum'],
    );
  $form['contact'] = array(
    '#type'   => 'fieldset',
    '#title'  => t('Contact Information'),
    'last'    => array( 
      '#prefix' => '
',
      '#type'   => 'textfield',
      '#title'  => t('Contact name (last, first)'),
      '#size'   => 20,
      '#required' => 1,
    ),
    'first'   => array( 
      '#type'   => 'textfield',
      '#size'   => 20,
      '#required' => 1,
      '#suffix' => '
',
    ),
    'company' => array(
      '#type'   => 'textfield',
      '#title'  => t('Company'),
      '#size'   => 20,
    ),
    'address1'=> array(
      '#type'   => 'textfield',
      '#title'  => t('Address'),
      '#size'   => 30,
      '#required'=>1,
    ),
    'address2'=> array(
      '#type'   => 'textfield',
      '#size'   => 30,
    ),
    'city'    => array(
      '#prefix' => '',
      '#type'   => 'textfield',
      '#title'  => t('City'),
      '#size'   => 15,
      '#required'=>1,
    ),
    'state'   => array(
      '#type'   => 'textfield',
      '#title'  => t('State'),
      '#size'   => 2,
      '#required'=>1,
      '#default_value'=>$info['statedefault'],
    ),
    'zip'     => array(
      '#type'   => 'textfield',
      '#title'  => t('Zip'),
      '#size'   => 10,
      '#required'=>1,
      '#suffix' => '
',
    ),
    'daytime' => array(
      '#type'   => 'textfield',
      '#title'  => t('Daytime Phone'),
      '#size'   => 18,
    ),
    'night'   => array(
      '#type'   => 'textfield',
      '#title'  => t('Night Phone'),
      '#size'   => 18,
    ),
  );
  $emailinvoiceonly = $signup_info['emailinvoiceonly'];
  $form['billing'] = array(
    'invoicing_list'  => array(
      '#type'   => 'textfield',
      '#title'  => t('Email invoice to'),
      '#size'   => '40',
      '#required'=>$emailinvoiceonly,
    ),
    '#type'   => 'fieldset',
    '#title'  => t('Billing Information'),
    'invoicing_list_POST' => array(
      '#type'   => $emailinvoiceonly ? 'hidden' : 'checkbox',
      '#title'  => t('Send a paper invoice'),
      '#default_value' => 0,
    ),
  );
  if( count($signup_info['payby']) > 1 ) {
    $form['billing']['payby'] = array(
      '#type'   => 'select',
      '#title'  => t('Payment method'),
      '#options'=> array_combine(
        $signup_info['payby'],
        $signup_info['payby_longname']
      ),
    );
  }
  else {
    $form['billing']['payby'] = array(
      '#type'   => 'hidden',
      '#value'  => $signup_info['payby'][0],
    );
  }
  $form['billing']['payby_CARD'] = array(
    '#type'   => 'fieldset',
    'cardnum' => array(
      '#prefix' => '',
      '#type'   => 'textfield',
      '#title'  => t('Credit card number'),
      '#size'   => 20,
      '#maxlength'=>20,
      '#required'=>1,
      '#suffix' => '
',
    ),
    'expmonth' => array(
      '#prefix' => '',
      '#type'   => 'textfield',
      '#title'  => t('Expiration date'),
      '#size'   => 2,
      '#required'=>1,
      '#maxlength' => 2,
    ),
    'expyear' => array(
      '#field_prefix' => '/',
      '#type'   => 'textfield',
      '#size'   => 2,
      '#maxlength' => 2,
      '#required'=>1,
      '#suffix' => '
',
    ),
    'paycvv'  => array(
      '#prefix' => '',
      '#type'   => 'textfield',
      '#title'  => 'CVV',
      '#size'   => 3,
      '#maxlength'  => 3,
      '#required'=>1,
      '#suffix' => '
',
    ),
    'cardname'=> array(
      '#prefix' => '',
      '#type'   => 'textfield',
      '#title'  => t('Exact name on card'),
      '#size'   => 40,
      '#maxlength'=>60,
      '#suffix' => '
',
    ),
  );
  $pkgs = $signup_info['part_pkg'];
  $form['package'] = array(
    '#type'   => 'fieldset',
    '#title'  => t('First Package'),
    'pkgpart' => (count($pkgs) > 1 ?
      array(
        '#type'   => 'select',
        '#title'  => '',
        '#options'=> array_combine(
          subextract($pkgs, 'pkgpart'),
          subextract($pkgs, 'pkg')
        ),
        '#default_value'=>$signup_info['default_pkgpart'],
      ) : array (
        '#type'   => 'hidden',
        '#value'  => $pkgs[0]['pkgpart'],
      )
    ),
  );
  switch($signup_info['signup_service']) {
  case 'svc_acct':
    $form['package'] += array(
      'username'=> array(
        '#type'   => 'textfield',
        '#title'  => t('Username'),
        '#size'   => 20,
        '#required'=>1,
      ),
      'password'=> array(
        '#type'   => 'password_confirm',
        '#size'   => 20,
        '#required'=>1,
        '#process'=> array('freeside_expand_password_confirm'),
      )
    );
    break;
  case 'svc_pbx':
    break; // nothing yet implemented
  }
  $form['package']['pkgpart']['#default_value'] = $signup_info['default_pkgpart'];
  $form['submit'] = array(
    '#type'   => 'submit',
    '#value'  => 'Sign me up!',
  );
  return $form;
}
/* workaround for silly Drupal behavior */
function freeside_expand_password_confirm($element) {
  $element = expand_password_confirm($element);
  $element['pass1']['#attributes']['value'] = $element['#value']['pass1'];
  $element['pass2']['#attributes']['value'] = $element['#value']['pass2'];
  return $element;
}
function freeside_signup_form_submit($form, &$form_state) {
  $freeside = new FreesideSelfService();
  $values = $form_state['values'];
  dkpr($values);
  $customer = array();
  $customer['agentnum'] = variable_get('freeside_agentnum','');
  foreach( array( 'first',
                 'last',
                 'address1',
                 'address2',
                 'city',
                 'state',
                 'zip',
                 'daytime',
                 'night',
                 'fax',
                 'payby',
                 'refnum',
                 'invoicing_list',
                 'pkgpart',
                 'username'
               ) 
    as $field ) {
    $customer[$field] = $values[$field];
    }
  if($values['invoicing_list_POST']) {
    $customer['invoicing_list'] = 
      implode(',', array($customer['invoicing_list'], 'POST'));
  }
  $customer['_password']  = $values['password'];
  $customer['country']    = 'US';
  if($customer['payby'] == 'CARD') {
    $customer['payinfo'] = preg_replace('/\D/','',$values['cardnum']);
    $customer['paydate'] = $values['expmonth'] . '/' . $values['expyear'];
    $customer['payname'] = isset($values['cardname']) ? 
      $values['cardname'] :
      ($values['first'] . ' ' . $values['last']);
    $customer['paycvv'] = $values['paycvv'];
  }
  /* other paybys not implemented */
  dkpr($customer);
  $response = $freeside->new_customer($customer);
  dkpr($response);
  error_log("[new_customer] received response from Freeside: $response");
  $error = $response['error'];
  if ( $error ) {
    drupal_set_message(t("Signup error: $error"), 'error');
    $form_state['redirect'] = FALSE;
  }
  else {
    drupal_set_message(t("Signup successful!"),'status');
    $form_state['redirect'] = array(
      variable_get('freeside_redirect_after_signup','/'),
      //query string would go here
      //'custnum='.$response['custnum'].'&svcnum='.$response['svcnum'],
    );
  }
}
?>