/**
  * Load self::$personFields, self::$companyFields, self::$fieldStatus if not loaded yet
  * @throws waException
  * @return
  */
 protected static function ensureStaticVars()
 {
     if (self::$personFields !== null) {
         return;
     }
     // Temporary storage for field objects; id => waContactField
     $fields = array();
     // Load system fields
     self::$fieldStatus = array();
     foreach (include wa()->getConfig()->getPath('system', 'contact/data/fields') as $f) {
         /**
          * @var waContactField $f
          */
         if (!$f instanceof waContactField) {
             throw new waException("Invalid contact field " . print_r($f, TRUE));
         }
         $id = $f->getId();
         self::$fieldStatus[$id] = true;
         $fields[$id] = $f;
     }
     // Load custom fields
     $file = wa()->getConfig()->getConfigPath('custom_fields.php', true, 'contacts');
     if (is_readable($file)) {
         $cfg = (include $file);
         if (empty($cfg) || !is_array($cfg)) {
             $cfg = array();
         }
         foreach ($cfg as $f) {
             /**
              * @var waContactField $f
              */
             if (!$f instanceof waContactField) {
                 throw new waException("Invalid contact field " . print_r($f, TRUE));
             }
             $id = $f->getId();
             self::$fieldStatus[$id] = false;
             $fields[$id] = $f;
         }
     }
     // Person field order
     $file = wa()->getConfig()->getConfigPath('person_fields_order.php', true, 'contacts');
     if (!is_readable($file)) {
         $file = wa()->getConfig()->getPath('system', 'contact/data/person_fields_default');
     }
     $contactOrder = (include $file);
     // Company field order
     $file = wa()->getConfig()->getConfigPath('company_fields_order.php', true, 'contacts');
     if (!is_readable($file)) {
         $file = wa()->getConfig()->getPath('system', 'contact/data/company_fields_default');
     }
     $companyOrder = (include $file);
     // Load fields into self::$companyFields in correct order, and the rest into self::$companyDisabled
     self::$companyFields = array();
     foreach ($companyOrder as $id => $param) {
         if (!isset($fields[$id])) {
             throw new waException('Unknown field ' . $id . ' in company field order.');
         }
         self::$companyFields[$id] = clone $fields[$id];
         self::$companyFields[$id]->setParameters($param);
     }
     self::$companyDisabled = array_diff_key($fields, self::$companyFields);
     // same for self::$personFields and self::$personDisabled
     self::$personFields = array();
     foreach ($contactOrder as $id => $param) {
         if (!isset($fields[$id])) {
             throw new waException('Unknown field ' . $id . ' in person field order.');
         }
         if (isset(self::$companyDisabled[$id])) {
             self::$personFields[$id] = clone $fields[$id];
         } else {
             // don't have to clone since this object is used nowhere else
             self::$personFields[$id] = $fields[$id];
             unset($fields[$id]);
             // being paranoid
         }
         self::$personFields[$id]->setParameters($param);
     }
     self::$personDisabled = array_diff_key($fields, self::$personFields);
 }