t('User name'),
    'contenttype' => t('Content type name'),
    'term' => t('Term name'),
    'group' => t('Group name'),
  );
  drupal_add_js(array('subdomain' => array('sourceOptionText' => $data)), 'setting');
  return drupal_get_form('subdomain_admin_settings');
}
/**
 * Implementation of hook_admin_settings().
 */
function subdomain_admin_settings($form, &$form_state) {
  $modes['user'] = t('User subdomains');
  if (module_exists('views')) {
    // Content Type mode requires a view homepage, so ensure views module exists :-)
    $modes['contenttype'] = t('Content type subdomains');
  }
  if (module_exists('taxonomy')) {
    $modes['term'] = t('Taxonomy subdomains');
  }
  if (module_exists('og')) {
    $modes['group'] = t('Organic group subdomains');
  }
  $form['subdomain_mode'] = array(
    '#type' => 'select',
    '#title' => t('Mode'),
    '#options' => $modes,
    '#default_value' => variable_get('subdomain_mode', 'user'),
  );
  if (module_exists('taxonomy')) {
    $vocabs = taxonomy_get_vocabularies();
    $vocab_options = array();
    if (is_array($vocabs)) {
      foreach ($vocabs as $vid => $vocab) {
        $vocab_options[$vid] = $vocab->name;
      }
    }
    if (count($vocab_options)) {
      $form['subdomain_vocab'] = array(
        '#type' => 'select',
        '#title' => t('Select a vocabulary'),
        '#description' => t('Terms in the selected vocabulary will have their own subdomain.'),
        '#options' => $vocab_options,
        '#default_value' => variable_get('subdomain_vocab', NULL),
      );
    }
    else {
      $form['subdomain_vocab'] = array(
        '#type' => 'item',
        '#title' => t('Taxonomy vocabulary'),
        '#description' => t('No non-tag vocabularies found.
Create one before configuring taxonomy subdomains.'),
        '#prefix' => '
',
        '#suffix' => '
',
      );
    }
  }
  $form['subdomain_source'] = array(
    '#type' => 'select',
    '#title' => t('Source for subdomain text'),
    '#options' => array(
      'default' => t('Automatic'),
      'custom' => t('User can specify a custom subdomain'),
    ),
    '#default_value' => variable_get('subdomain_source', 'default'),
  );
  if (module_exists('views')) {
    $views = views_get_all_views();
    $view_options = array();
    foreach($views as $name => $view) {
      if (!isset($view->disabled) || !$view->disabled) {
        $view_options[$name] = $name;
      }
    }
    $form['subdomain_home'] = array(
      '#type' => 'select',
      '#title' => t('Subdomain homepages'),
      '#options' => array(
        'default' => t('Default'),
        'view' => t('Custom view'),
      ),
      '#default_value' => variable_get('subdomain_home', 'default'),
    );
    if (count($view_options)) {
      $form['subdomain_view'] = array(
        '#type' => 'select',
        '#title' => t('Select a view'),
        '#options' => $view_options,
        '#default_value' => variable_get('subdomain_view', ''),
      );
    }
    else {
      $form['subdomain_view'] = array(
        '#type' => 'item',
        '#title' => t('Homepage view'),
        '#description' => t('No enabled views found.
Create a view before selecting a "custom view" for your subdomain homepages.'),
        '#prefix' => '',
        '#suffix' => '
',
      );
    }
    
  }
  $base = subdomain_get_domain();
  $form['subdomain_prepend_www'] = array(
    '#type' => 'checkbox',
    '#title' => t("Prepend 'www' to non-subdomain URLs (i.e. use http://www.$base instead of http://$base)"),
    '#default_value' => variable_get('subdomain_prepend_www', TRUE),
  );
  $form['#submit'][] = 'subdomain_admin_settings_submit';
  // Ensure server is setup to properly handle subdomains
  _subdomain_validate_dns();
  _subdomain_validate_cookie_domain();
  _subdomain_validate_webserver_config();
  return system_settings_form($form);
}
function subdomain_admin_settings_validate($form, &$form_state) {
  // Extract form values into simple variables
  foreach(array('mode', 'vocab', 'source', 'home', 'view') as $val) {
    if (isset($form_state['values']['subdomain_'. $val])) {
      ${$val} = $form_state['values']['subdomain_'. $val];
    }
  }
  if ($mode == 'term' && empty($vocab)) {
    form_set_error('subdomain_mode', t('You must create at least one non-tag vocabulary before configuring taxonomy subdomains.'));
  }
  if (isset($home) && $home == 'view' && empty($view)) {
    form_set_error('subdomain_home', t('You must create or enable at least one view before selecting a "Custom view" for your subdomain homepages.'));
  }
  elseif (isset($home) && $home == 'view') {
    // Check for presence of appropriate argument
    $view = views_get_view($view);
    $args = $view->display['default']->display_options['arguments'];
    $first_arg = empty($args) ? NULL : array_shift(array_keys($args));
    if (empty($first_arg)) {
      form_set_error('subdomain_view', t('The selected view has no arguments. Add a uid/nid/tid argument to your view to filter your content for the active subdomain.'));
    }
    elseif ($mode == 'term' && $first_arg != 'tid'
    || $mode == 'group' && !in_array($first_arg, array('nid', 'group_nid'))
    || $mode == 'user' && $first_arg != 'uid') {
      drupal_set_message(t("The selected view's first argument was @arg. This may not work as expected.", array('@arg' => $first_arg)), 'warning');
    }
  }
}
function subdomain_admin_settings_submit($form, &$form_state) {
  // If mode has changed, wipe subdomain tables
  // TODO: need user to confirm this...
  if ($form_state['values']['subdomain_mode'] != $form['subdomain_mode']['#default_value']) {
    db_query("DELETE FROM {subdomain};");
    if ($form_state['values']['subdomain_mode'] != 'contenttype') {
      variable_del('subdomain_contenttypes');
    }
  }
  // _subdomain_clear_caches();
}
function subdomain_filters_form() {
  $form['subdomain_filter_contenttypes'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Exclude the following content types from subdomains'),
    '#description' => t('Nodes from the selected types will not be placed on subdomains.'),
    '#options' => node_type_get_names(),
    '#default_value' => variable_get('subdomain_filter_contenttypes', array()),
  );
  $form['subdomain_reserved'] = array(
    '#type' => 'textarea',
    '#title' => t('Disallow the following subdomains'),
    '#rows' => 5,
    '#description' => t('Enter 1 subdomain per line'),
    '#default_value' => variable_get('subdomain_reserved', '')
  );
  return system_settings_form($form);
}
function subdomain_tools() {
  return drupal_get_form('subdomain_tools_form');
}
function subdomain_tools_form($form, &$form_state) {
  static $bulk_generated = FALSE; // TODO : used b/c D7 seems to be executing this twice on form submit
  $op = isset($_POST['op']) ? $_POST['op'] : '';
  if ($op == t('Generate subdomains')) {
    if (!$bulk_generated) {
      $bulk_generated = TRUE;
      subdomain()->bulk_generate();
    }
  }
  $form['subdomain_bulk_generate'] = array(
    '#type' => 'fieldset',
    '#title' => t('Bulk generate missing subdomains'),
    '#description' => t('Normally you wouldn\'t use this. Useful for testing or for auto-generating subdomains for an existing site.'),
  );
  $form['subdomain_bulk_generate']['subdomain_bulk_generate_button'] = array(
    '#type' => 'button',
    '#value' => t('Generate subdomains'),
  );
  return $form;
}
// TODO: probably don't need
function _subdomain_clear_caches() {
  // Flush all caches; no need to re-implement this.
  module_load_include('inc', 'system', 'system.admin');
  $form = $form_state = array();
  system_clear_cache_submit($form, $form_state);
}
function _subdomain_validate_dns($display_error = TRUE) {
  $domain = trim(subdomain_get_domain(), '.');
  $subdomain = SUBDOMAIN_TEST_SUBDOMAIN .'.'. $domain;
  $domain_ip = gethostbyname($domain);
  $subdomain_ip = gethostbyname($subdomain);
  if ($domain_ip != $subdomain_ip && $display_error) {
    drupal_set_message(t("Subdomain error: @domain and @subdomain did not resolve to the same IP address. Your DNS may be improperly configured and subdomains will likely not work.", array('@domain' => $domain, '@subdomain' => $subdomain)), 'error');
  }
  return $subdomain_ip == $domain_ip;
}
function _subdomain_validate_webserver_config() {
  if (_subdomain_validate_dns(FALSE)) {
    $domain = trim(subdomain_get_domain(), '.');
    $subdomain = SUBDOMAIN_TEST_SUBDOMAIN .'.'. $domain;
    $url = "http://$subdomain/subdomain/test";
    if (drupal_http_request($url)->data != SUBDOMAIN_TEST_RESPONSE) {
      drupal_set_message(t("Subdomain error: @subdomain was not correctly routed to this site. Ensure your webserver is setup to correctly route wildcard subdomains to this site", array('@domain' => $domain, '@subdomain' => $subdomain)), 'error');
    }
  }
}
function _subdomain_validate_cookie_domain($display_error = TRUE) {
  $settings = file_get_contents('./'. conf_path() . '/settings.php');
  $settings = str_replace(chr(13) . chr(10), "\n", $settings);
  $settings = explode("\n", $settings);
  foreach ($settings as $setting) {
    if (strpos($setting, '$cookie_domain') !== FALSE) {
      eval($setting);
    }
  }
  if (!isset($cookie_domain) && $display_error) {
    drupal_set_message(t('Subdomain error: The $cookie_domain variable in settings.php must be set or subdomains will not work.'), 'error');
  }
  return isset($cookie_domain);
}
function _subdomain_test_request() {
  echo SUBDOMAIN_TEST_RESPONSE;
  exit;
}