]> Kevux Git Server - koopa/commitdiff
Progress: more path management changes, imrpove languages support, and other fixes
authorKevin Day <thekevinday@gmail.com>
Wed, 26 Apr 2017 03:25:00 +0000 (22:25 -0500)
committerKevin Day <thekevinday@gmail.com>
Wed, 26 Apr 2017 03:27:02 +0000 (22:27 -0500)
Continue developing path handling functionality.
I've decided to implement language handling as sub-classes, using japanese as the first language to test with.
Other bugfixes and tweaks.

22 files changed:
common/base/classes/base_http.php
common/base/classes/base_languages.php
common/base/classes/base_path.php
common/base/classes/base_rfc_string.php
database/sql/reservation/reservation-users.sql
program/reservation/index.php
program/reservation/internal/access_denied.php
program/reservation/internal/bad_method.php
program/reservation/internal/ja/access_denied.php [new file with mode: 0644]
program/reservation/internal/ja/bad_method.php [new file with mode: 0644]
program/reservation/internal/ja/not_found.php [new file with mode: 0644]
program/reservation/internal/ja/server_error.php [new file with mode: 0644]
program/reservation/internal/not_found.php
program/reservation/internal/server_error.php [new file with mode: 0644]
program/reservation/paths/u/dashboard.php
program/reservation/paths/u/login.php
program/reservation/paths/u/logout.php
program/reservation/reservation_build.php [new file with mode: 0644]
program/reservation/reservation_database.php
program/reservation/reservation_paths.php
program/reservation/reservation_redirects.php
program/reservation/reservation_session.php

index 4beffbd571719c31eb3a76726ee604806918e19f..a510ef5efd7845f842715d1ca555118a5494500f 100644 (file)
@@ -827,6 +827,54 @@ class c_base_http extends c_base_rfc_string {
   }
 
   /**
+   * Chooses a language based on available languages and the requested languages.
+   *
+   * Because multiple languages may be returned, this does not explicitly define the langugae headers.
+   *
+   * @param array $supported_languages
+   *   An array of supported languages as defined in i_base_language.
+   *
+   * @return c_base_return_int
+   *   An integer representing the language code as defined in i_base_language.
+   *   0 with the error bit set is returned on error.
+   *   An integer representing the language code as defined in i_base_language with the error bit set is returned on error.
+   */
+  public function select_language($supported_languages) {
+    if (!is_array($supported_languages) || empty($supported_languages)) {
+      $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'supported_languages', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
+      return c_base_return_error::s_value(0, 'c_base_return_int', $error);
+    }
+
+    // specify a failsafe in case decision making has trouble.
+    $language_chosen = reset($supported_languages);
+
+    if (isset($this->request[self::REQUEST_ACCEPT_LANGUAGE]['data']) && is_array($this->request[self::REQUEST_ACCEPT_LANGUAGE]['data'])) {
+      if (isset($this->request[self::REQUEST_ACCEPT_LANGUAGE]['invalid']) && $this->request[self::REQUEST_ACCEPT_LANGUAGE]['invalid']) {;
+        $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'supported_languages', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
+        return c_base_return_error::s_value($language_chosen, 'c_base_return_int', $error);
+      }
+
+      if (isset($this->request[self::REQUEST_ACCEPT_LANGUAGE]['data']['weight']) && is_array($this->request[self::REQUEST_ACCEPT_LANGUAGE]['data']['weight'])) {
+        foreach ($this->request[self::REQUEST_ACCEPT_LANGUAGE]['data']['weight'] as $weight => $aliases) {
+          $alias = end($aliases);
+          $language_code = c_base_defaults_global::s_get_languages()::s_get_id_by_alias($alias)->get_value_exact();
+          unset($alias);
+
+          if (array_key_exists($language_code, $supported_languages)) {
+            $language_chosen = $language_code;
+            break;
+          }
+        }
+        unset($weight);
+        unset($aliases);
+        unset($language_code);
+      }
+    }
+
+    return c_base_return_int::s_new($language_chosen);
+  }
+
+  /**
    * Assign HTTP response header: access-control-allow-origin.
    *
    * Note on multiple urls: The standard appears to only support one url.
@@ -2468,8 +2516,9 @@ class c_base_http extends c_base_rfc_string {
    *
    * Use self::SCHEME_LOCAL for a local filesystem link.
    *
-   * @param string $uri
-   *   The URI to assign to the specified header.
+   * @param stringarray $uri
+   *   When a string, the URI to assign to the specified header.
+   *   When an array, an array of the destination url parts to assign to the specified header.
    *
    * @return c_base_return_status
    *   TRUE on success, FALSE otherwise.
@@ -2478,13 +2527,27 @@ class c_base_http extends c_base_rfc_string {
    * @see: https://tools.ietf.org/html/rfc3986
    */
   public function set_response_location($uri) {
-    if (!is_string($uri)) {
+    if (!is_string($uri) && !is_array($uri)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'uri', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
       return c_base_return_error::s_false($error);
     }
 
+    if (is_array($uri)) {
+      $uri_string = $this->pr_rfc_string_combine_uri_array($uri);
+      if ($combined === FALSE) {
+        unset($parts);
+        unset($combined);
 
-    $text = $this->pr_rfc_string_prepare($uri);
+        $error = c_base_error::s_log(NULL, array('arguments' => array(':format_name' => 'URI or URL', ':expected_format' => 'URI or URL', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_FORMAT);
+        return c_base_return_error::s_false($error);
+      }
+      unset($combined);
+    }
+    else {
+      $uri_string = $uri;
+    }
+
+    $text = $this->pr_rfc_string_prepare($$uri_string);
     if ($text['invalid']) {
       unset($text);
 
@@ -2502,7 +2565,6 @@ class c_base_http extends c_base_rfc_string {
     }
     unset($parsed['invalid']);
 
-
     $this->response[self::RESPONSE_LOCATION] = $parsed;
     unset($parsed);
 
@@ -8735,10 +8797,11 @@ class c_base_http extends c_base_rfc_string {
       $language_array = $this->languages->s_get_aliases_by_id($language);
       if ($language_array instanceof c_base_return_array) {
         $language_array = $language_array->get_value_exact();
-
-        if (!empty($language_array[0])) {
-          $output .= ', ' . $language_array[0];
+        $alias = end($language_array);
+        if (!empty($alias)) {
+          $output .= ', ' . $alias;
         }
+        unset($alias);
       }
       unset($language_array);
     }
@@ -8920,7 +8983,13 @@ class c_base_http extends c_base_rfc_string {
       return;
     }
 
-    // @todo
+    $header_output[self::RESPONSE_LOCATION] = $header_name . self::SEPARATOR_HEADER_NAME;
+
+    $combined = self::pr_rfc_string_combine_uri_array($this->response[self::RESPONSE_LOCATION]);
+    if (is_string($combined)) {
+      $header_output[self::RESPONSE_LOCATION] .= $combined;
+    }
+    unset($combined);
   }
 
   /**
index b893f9824deb1e9e4a673dd667dceaa86bead6e8..e394a67e9964cd7c36530f563f8371579acec77d 100644 (file)
@@ -12,6 +12,7 @@
  * @see: http://www.loc.gov/standards/iso639-2/php/code_list.php
  */
 interface i_base_language {
+  const NONE                    = 0;
   const AFAR                    = 1;   // aar, aa
   const ABKHAZIAN               = 2;   // abk, ab
   const ACHINESE                = 3;   // ace
@@ -508,23 +509,23 @@ interface i_base_language {
    * @param int $id
    *   The id of the names to return.
    *
-   * @return c_base_return_status|c_base_return_array
-   *   An array of names or FALSE on error.
-   *   FALSE without the error flag means that there are no names associated with the given id.
+   * @return c_base_return_array
+   *   An array of names.
+   *   An empty array with the error bit set is returned on error.
    */
-  static function s_get_names_by_id($id);
+  public static function s_get_names_by_id($id);
 
   /**
    * Get the language names associated with the alias.
    *
    * @param string $alias
-   *   The id of the names to return.
+   *   The alias of the names to return.
    *
-   * @return c_base_return_status|c_base_return_array
-   *   An array of names or FALSE on error.
-   *   FALSE without the error flag means that there are no names associated with the given alias.
+   * @return c_base_return_array
+   *   An array of names.
+   *   An empty array with the error bit set is returned on error.
    */
-  static function s_get_names_by_alias($alias);
+  public static function s_get_names_by_alias($alias);
 
   /**
    * Get the id associated with the language name.
@@ -532,11 +533,11 @@ interface i_base_language {
    * @param string $name
    *   The string associated with the id
    *
-   * @return c_base_return_status|c_base_return_int
-   *   The numeric id or FALSE on error.
-   *   FALSE without the error flag means that there are no ids associated with the given name.
+   * @return c_base_return_int
+   *   The numeric id.
+   *   0 with the error bit set is returned on error.
    */
-  static function s_get_id_by_name($name);
+  public static function s_get_id_by_name($name);
 
   /**
    * Get the id associated with the language name.
@@ -544,11 +545,11 @@ interface i_base_language {
    * @param string $name
    *   The string associated with the id
    *
-   * @return c_base_return_status|c_base_return_int
-   *   The numeric id or FALSE on error.
-   *   FALSE without the error flag means that there are no ids associated with the given name.
+   * @return c_base_return_int
+   *   The numeric id.
+   *   0 with the error bit set is returned on error.
    */
-  static function s_get_id_by_alias($alias);
+  public static function s_get_id_by_alias($alias);
 
   /**
    * Get the language aliases associated with the id.
@@ -556,11 +557,11 @@ interface i_base_language {
    * @param int $id
    *   The id of the aliases to return.
    *
-   * @return c_base_return_status|c_base_return_array
-   *   An array of aliases or FALSE on error.
-   *   FALSE without the error flag means that there are no aliases associated with the given id.
+   * @return c_base_return_array
+   *   An array of aliases.
+   *   An empty array with the error bit set is returned on error.
    */
-  static function s_get_aliases_by_id($id);
+  public static function s_get_aliases_by_id($id);
 
   /**
    * Get the language aliases associated with the name.
@@ -568,29 +569,57 @@ interface i_base_language {
    * @param string $name
    *   The language name of the aliases to return.
    *
-   * @return c_base_return_status|c_base_return_array
-   *   An array of aliases or FALSE on error.
-   *   FALSE without the error flag means that there are no aliases associated with the given name.
+   * @return c_base_return_array
+   *   An array of aliases.
+   *   An empty array with the error bit set is returned on error.
    */
-  static function s_get_aliases_by_name($name);
+  public static function s_get_aliases_by_name($name);
 
   /**
    * Get the id of the language considered to be default by the implementing class.
    *
-   * @return c_base_return_status|c_base_return_int
+   * @return c_base_return_int
    *   An integer representing the default language.
-   *   FALSE without the error flag means that there are no languages assigned as default.
+   *   0 without the error bit set is returned if there is no default language.
+   *   0 with the error bit set is returned on error.
    */
-  static function s_get_default_id();
+  public static function s_get_default_id();
 
   /**
    * Get the name of the language considered to be default by the implementing class.
    *
-   * @return c_base_return_status|c_base_return_string
+   * @return c_base_return_string
    *   A string representing the default language.
-   *   FALSE without the error flag means that there are no languages assigned as default.
+   *   An empty string with the error bit set is returned on error.
+   */
+  public static function s_get_default_name();
+
+  /**
+   * Get an array of all ids associated with this class.
+   *
+   * @return c_base_return_array
+   *   An array of ids, keyed by the unique ids.
+   *   An empty array with the error bit set is returned on error.
+   */
+  public static function s_get_ids();
+
+  /**
+   * Get an array of all aliases associated with this class.
+   *
+   * @return c_base_return_array
+   *   An array of aliases, keyed by the unique ids.
+   *   An empty array with error bit set is returned on error.
    */
-  static function s_get_default_name();
+  public static function s_get_aliases();
+
+  /**
+   * Get an array of all names associated with this class.
+   *
+   * @return c_base_return_array
+   *   An array of names, keyed by the unique ids.
+   *   An empty array with error bit set is returned on error.
+   */
+  public static function s_get_names();
 }
 
 /**
@@ -624,164 +653,142 @@ final class c_base_language_us_only implements i_base_language {
 
 
   /**
-   * Get the language names associated with the id.
-   *
-   * @param int $id
-   *   The id of the names to return.
-   *
-   * @return c_base_return_status|c_base_return_array
-   *   An array of names or FALSE on error.
-   *   FALSE without the error flag means that there are no names associated with the given id.
+   * Implementation of s_get_names_by_id().
    */
-  static function s_get_names_by_id($id) {
+  public static function s_get_names_by_id($id) {
     if (!is_int($id) && !is_numeric($id)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'id', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(array(), 'c_base_return_array', $error);
     }
 
     if (array_key_exists($id, self::$s_names)) {
       return c_base_return_array::s_new(self::$s_names[$id]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_array();
   }
 
   /**
-   * Get the language names associated with the alias.
-   *
-   * @param string $alias
-   *   The id of the names to return.
-   *
-   * @return c_base_return_status|c_base_return_array
-   *   An array of names or FALSE on error.
-   *   FALSE without the error flag means that there are no names associated with the given alias.
+   * Implementation of s_get_names_by_alias().
    */
-  static function s_get_names_by_alias($alias) {
-    if (!is_int($id) && !is_numeric($id)) {
-      $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'id', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+  public static function s_get_names_by_alias($alias) {
+    if (!is_string($alias)) {
+      $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'alias', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
+      return c_base_return_error::s_value(array(), 'c_base_return_array', $error);
     }
 
-    if (array_key_exists($id, self::$s_aliases)) {
-      return c_base_return_array::s_new(self::$s_aliases[$id]);
+    if (array_key_exists($alias, self::$s_ids) && array_key_exists(self::$s_ids[$alias], self::$s_names)) {
+      return c_base_return_array::s_new(self::$s_names[$self::$s_ids[$alias]]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_array();
   }
 
   /**
-   * Get the id associated with the language name.
-   *
-   * @param string $name
-   *   The string associated with the id
-   *
-   * @return c_base_return_status|c_base_return_int
-   *   The numeric id or FALSE on error.
-   *   FALSE without the error flag means that there are no ids associated with the given name.
+   * Implementation of s_get_id_by_name().
    */
-  static function s_get_id_by_name($name) {
+  public static function s_get_id_by_name($name) {
     if (!is_string($name)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'name', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(0, 'c_base_return_int', $error);
     }
 
     if (array_key_exists($name, self::$s_ids)) {
       return c_base_return_int::s_new(self::$s_ids[$name]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_int();
   }
 
   /**
-   * Get the id associated with the language name.
-   *
-   * @param string $name
-   *   The string associated with the id
-   *
-   * @return c_base_return_status|c_base_return_int
-   *   The numeric id or FALSE on error.
-   *   FALSE without the error flag means that there are no ids associated with the given name.
+   * Implementation of s_get_id_by_alias().
    */
-  static function s_get_id_by_alias($alias) {
+  public static function s_get_id_by_alias($alias) {
     if (!is_string($alias)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'alias', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(0, 'c_base_return_int', $error);
     }
 
     if (array_key_exists($alias, self::$s_ids)) {
       return c_base_return_int::s_new(self::$s_ids[$alias]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_int();
   }
 
   /**
-   * Get the language aliases associated with the id.
-   *
-   * @param int $id
-   *   The id of the aliases to return.
-   *
-   * @return c_base_return_status|c_base_return_array
-   *   An array of aliases or FALSE on error.
-   *   FALSE without the error flag means that there are no aliases associated with the given id.
+   * Implementation of s_get_aliases_by_id().
    */
-  static function s_get_aliases_by_id($id) {
+  public static function s_get_aliases_by_id($id) {
     if (!is_int($id) && !is_numeric($id)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'id', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(array(), 'c_base_return_array', $error);
     }
 
     if (array_key_exists($id, self::$s_aliases)) {
       return c_base_return_array::s_new(self::$s_aliases[$id]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_array();
   }
 
   /**
-   * Get the language aliases associated with the name.
-   *
-   * @param string $name
-   *   The language name of the aliases to return.
-   *
-   * @return c_base_return_status|c_base_return_array
-   *   An array of aliases or FALSE on error.
-   *   FALSE without the error flag means that there are no aliases associated with the given name.
+   * Implementation of s_get_aliases_by_name().
    */
-  static function s_get_aliases_by_name($name) {
+  public static function s_get_aliases_by_name($name) {
     if (!is_string($name)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'name', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(array(), 'c_base_return_array', $error);
     }
 
     if (array_key_exists($name, self::$s_aliases)) {
       return c_base_return_array::s_new(self::$s_aliases[$name]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_array();
   }
 
   /**
-   * Get the id of the language considered to be default by the implementing class.
-   *
-   * @return c_base_return_status|c_base_return_int
-   *   An integer representing the default language.
-   *   FALSE without the error flag means that there are no languages assigned as default.
+   * Implementation of s_get_default_id().
    */
-  static function s_get_default_id() {
+  public static function s_get_default_id() {
     return c_base_return_int::s_new(self::ENGLISH_US);
   }
 
   /**
-   * Get the name of the language considered to be default by the implementing class.
-   *
-   * @return c_base_return_status|c_base_return_string
-   *   A string representing the default language.
-   *   FALSE without the error flag means that there are no languages assigned as default.
+   * Implementation of s_get_default_name().
    */
-  static function s_get_default_name() {
+  public static function s_get_default_name() {
     return c_base_return_string::s_new($this->s_aliases[self::ENGLISH_US]);
   }
+
+  /**
+   * Implementation of s_get_ids().
+   */
+  public static function s_get_ids() {
+    $ids = array();
+    foreach (self::$s_aliases as $key => $value) {
+      $ids[$key] = $key;
+    }
+    unset($key);
+    unset($value);
+
+    return c_base_return_array::s_new($ids);
+  }
+
+  /**
+   * Implementation of s_get_aliases().
+   */
+  public static function s_get_aliases() {
+    return c_base_return_array::s_new(self::$s_aliases);
+  }
+
+  /**
+   * Implementation of s_get_names().
+   */
+  public static function s_get_names() {
+    return c_base_return_array::s_new(self::$s_names);
+  }
 }
 
 /**
@@ -849,164 +856,142 @@ final class c_base_language_limited implements i_base_language {
 
 
   /**
-   * Get the language names associated with the id.
-   *
-   * @param int $id
-   *   The id of the names to return.
-   *
-   * @return c_base_return_status|c_base_return_array
-   *   An array of names or FALSE on error.
-   *   FALSE without the error flag means that there are no names associated with the given id.
+   * Implementation of s_get_names_by_id().
    */
-  static function s_get_names_by_id($id) {
+  public static function s_get_names_by_id($id) {
     if (!is_int($id) && !is_numeric($id)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'id', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(array(), 'c_base_return_array', $error);
     }
 
     if (array_key_exists($id, self::$s_names)) {
       return c_base_return_array::s_new(self::$s_names[$id]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_array();
   }
 
   /**
-   * Get the language names associated with the alias.
-   *
-   * @param string $alias
-   *   The id of the names to return.
-   *
-   * @return c_base_return_status|c_base_return_array
-   *   An array of names or FALSE on error.
-   *   FALSE without the error flag means that there are no names associated with the given alias.
+   * Implementation of s_get_names_by_alias().
    */
-  static function s_get_names_by_alias($alias) {
-    if (!is_int($id) && !is_numeric($id)) {
+  public static function s_get_names_by_alias($alias) {
+    if (!is_string($alias)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'alias', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(array(), 'c_base_return_array', $error);
     }
 
-    if (array_key_exists($id, self::$s_aliases)) {
-      return c_base_return_array::s_new(self::$s_aliases[$id]);
+    if (array_key_exists($alias, self::$s_ids) && array_key_exists(self::$s_ids[$alias], self::$s_names)) {
+      return c_base_return_array::s_new(self::$s_names[$self::$s_ids[$alias]]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_array();
   }
 
   /**
-   * Get the id associated with the language name.
-   *
-   * @param string $name
-   *   The string associated with the id
-   *
-   * @return c_base_return_status|c_base_return_int
-   *   The numeric id or FALSE on error.
-   *   FALSE without the error flag means that there are no ids associated with the given name.
+   * Implementation of s_get_id_by_name().
    */
-  static function s_get_id_by_name($name) {
+  public static function s_get_id_by_name($name) {
     if (!is_string($name)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'name', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(0, 'c_base_return_int', $error);
     }
 
     if (array_key_exists($name, self::$s_ids)) {
       return c_base_return_int::s_new(self::$s_ids[$name]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_int();
   }
 
   /**
-   * Get the id associated with the language name.
-   *
-   * @param string $name
-   *   The string associated with the id
-   *
-   * @return c_base_return_status|c_base_return_int
-   *   The numeric id or FALSE on error.
-   *   FALSE without the error flag means that there are no ids associated with the given name.
+   * Implementation of s_get_id_by_alias().
    */
-  static function s_get_id_by_alias($alias) {
+  public static function s_get_id_by_alias($alias) {
     if (!is_string($alias)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'alias', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(0, 'c_base_return_int', $error);
     }
 
     if (array_key_exists($alias, self::$s_ids)) {
       return c_base_return_int::s_new(self::$s_ids[$alias]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_int();
   }
 
   /**
-   * Get the language aliases associated with the id.
-   *
-   * @param int $id
-   *   The id of the aliases to return.
-   *
-   * @return c_base_return_status|c_base_return_array
-   *   An array of aliases or FALSE on error.
-   *   FALSE without the error flag means that there are no aliases associated with the given id.
+   * Implementation of s_get_aliases_by_id().
    */
-  static function s_get_aliases_by_id($id) {
+  public static function s_get_aliases_by_id($id) {
     if (!is_int($id) && !is_numeric($id)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'id', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(array(), 'c_base_return_array', $error);
     }
 
     if (array_key_exists($id, self::$s_aliases)) {
       return c_base_return_array::s_new(self::$s_aliases[$id]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_array();
   }
 
   /**
-   * Get the language aliases associated with the name.
-   *
-   * @param string $name
-   *   The language name of the aliases to return.
-   *
-   * @return c_base_return_status|c_base_return_array
-   *   An array of aliases or FALSE on error.
-   *   FALSE without the error flag means that there are no aliases associated with the given name.
+   * Implementation of s_get_aliases_by_name().
    */
-  static function s_get_aliases_by_name($name) {
+  public static function s_get_aliases_by_name($name) {
     if (!is_string($name)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'name', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(array(), 'c_base_return_array', $error);
     }
 
     if (array_key_exists($name, self::$s_aliases)) {
       return c_base_return_array::s_new(self::$s_aliases[$name]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_array();
   }
 
   /**
-   * Get the id of the language considered to be default by the implementing class.
-   *
-   * @return c_base_return_status|c_base_return_int
-   *   An integer representing the default language.
-   *   FALSE without the error flag means that there are no languages assigned as default.
+   * Implementation of s_get_default_id().
    */
-  static function s_get_default_id() {
+  public static function s_get_default_id() {
     return c_base_return_int::s_new(self::ENGLISH_US);
   }
 
   /**
-   * Get the name of the language considered to be default by the implementing class.
-   *
-   * @return c_base_return_status|c_base_return_string
-   *   A string representing the default language.
-   *   FALSE without the error flag means that there are no languages assigned as default.
+   * Implementation of s_get_default_name().
    */
-  static function s_get_default_name() {
+  public static function s_get_default_name() {
     return c_base_return_string::s_new($this->s_aliases[self::ENGLISH_US]);
   }
+
+  /**
+   * Implementation of s_get_ids().
+   */
+  public static function s_get_ids() {
+    $ids = array();
+    foreach (self::$s_aliases as $key => $value) {
+      $ids[$key] = $key;
+    }
+    unset($key);
+    unset($value);
+
+    return c_base_return_array::s_new($ids);
+  }
+
+  /**
+   * Implementation of s_get_aliases().
+   */
+  public static function s_get_aliases() {
+    return c_base_return_array::s_new(self::$s_aliases);
+  }
+
+  /**
+   * Implementation of s_get_names().
+   */
+  public static function s_get_names() {
+    return c_base_return_array::s_new(self::$s_names);
+  }
 }
 
 /**
@@ -2690,162 +2675,140 @@ final class c_base_language_all implements i_base_language {
 
 
   /**
-   * Get the language names associated with the id.
-   *
-   * @param int $id
-   *   The id of the names to return.
-   *
-   * @return c_base_return_status|c_base_return_array
-   *   An array of names or FALSE on error.
-   *   FALSE without the error flag means that there are no names associated with the given id.
+   * Implementation of s_get_names_by_id().
    */
-  static function s_get_names_by_id($id) {
+  public static function s_get_names_by_id($id) {
     if (!is_int($id) && !is_numeric($id)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'id', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(array(), 'c_base_return_array', $error);
     }
 
     if (array_key_exists($id, self::$s_names)) {
       return c_base_return_array::s_new(self::$s_names[$id]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_array();
   }
 
   /**
-   * Get the language names associated with the alias.
-   *
-   * @param string $alias
-   *   The id of the names to return.
-   *
-   * @return c_base_return_status|c_base_return_array
-   *   An array of names or FALSE on error.
-   *   FALSE without the error flag means that there are no names associated with the given alias.
+   * Implementation of s_get_names_by_alias().
    */
-  static function s_get_names_by_alias($alias) {
-    if (!is_int($id) && !is_numeric($id)) {
+  public static function s_get_names_by_alias($alias) {
+    if (!is_string($alias)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'alias', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(array(), 'c_base_return_array', $error);
     }
 
-    if (array_key_exists($id, self::$s_aliases)) {
-      return c_base_return_array::s_new(self::$s_aliases[$id]);
+    if (array_key_exists($alias, self::$s_ids) && array_key_exists(self::$s_ids[$alias], self::$s_names)) {
+      return c_base_return_array::s_new(self::$s_names[$self::$s_ids[$alias]]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_array();
   }
 
   /**
-   * Get the id associated with the language name.
-   *
-   * @param string $name
-   *   The string associated with the id
-   *
-   * @return c_base_return_status|c_base_return_int
-   *   The numeric id or FALSE on error.
-   *   FALSE without the error flag means that there are no ids associated with the given name.
+   * Implementation of s_get_id_by_name().
    */
-  static function s_get_id_by_name($name) {
+  public static function s_get_id_by_name($name) {
     if (!is_string($name)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'name', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(0, 'c_base_return_int', $error);
     }
 
     if (array_key_exists($name, self::$s_ids)) {
       return c_base_return_int::s_new(self::$s_ids[$name]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_int();
   }
 
   /**
-   * Get the id associated with the language name.
-   *
-   * @param string $name
-   *   The string associated with the id
-   *
-   * @return c_base_return_status|c_base_return_int
-   *   The numeric id or FALSE on error.
-   *   FALSE without the error flag means that there are no ids associated with the given name.
+   * Implementation of s_get_id_by_alias().
    */
-  static function s_get_id_by_alias($alias) {
+  public static function s_get_id_by_alias($alias) {
     if (!is_string($alias)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'alias', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(0, 'c_base_return_int', $error);
     }
 
     if (array_key_exists($alias, self::$s_ids)) {
       return c_base_return_int::s_new(self::$s_ids[$alias]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_int();
   }
 
   /**
-   * Get the language aliases associated with the id.
-   *
-   * @param int $id
-   *   The id of the aliases to return.
-   *
-   * @return c_base_return_status|c_base_return_array
-   *   An array of aliases or FALSE on error.
-   *   FALSE without the error flag means that there are no aliases associated with the given id.
+   * Implementation of s_get_aliases_by_id().
    */
-  static function s_get_aliases_by_id($id) {
+  public static function s_get_aliases_by_id($id) {
     if (!is_int($id) && !is_numeric($id)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'id', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(array(), 'c_base_return_array', $error);
     }
 
     if (array_key_exists($id, self::$s_aliases)) {
       return c_base_return_array::s_new(self::$s_aliases[$id]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_array();
   }
 
   /**
-   * Get the language aliases associated with the name.
-   *
-   * @param string $name
-   *   The language name of the aliases to return.
-   *
-   * @return c_base_return_status|c_base_return_array
-   *   An array of aliases or FALSE on error.
-   *   FALSE without the error flag means that there are no aliases associated with the given name.
+   * Implementation of s_get_aliases_by_name().
    */
-  static function s_get_aliases_by_name($name) {
+  public static function s_get_aliases_by_name($name) {
     if (!is_string($name)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'name', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+      return c_base_return_error::s_value(array(), 'c_base_return_array', $error);
     }
 
     if (array_key_exists($name, self::$s_aliases)) {
       return c_base_return_array::s_new(self::$s_aliases[$name]);
     }
 
-    return new c_base_return_false();
+    return new c_base_return_array();
   }
 
   /**
-   * Get the id of the language considered to be default by the implementing class.
-   *
-   * @return c_base_return_status|c_base_return_int
-   *   An integer representing the default language.
-   *   FALSE without the error flag means that there are no languages assigned as default.
+   * Implementation of s_get_default_id().
    */
-  static function s_get_default_id() {
+  public static function s_get_default_id() {
     return c_base_return_int::s_new(self::ENGLISH_US);
   }
 
   /**
-   * Get the name of the language considered to be default by the implementing class.
-   *
-   * @return c_base_return_status|c_base_return_string
-   *   A string representing the default language.
-   *   FALSE without the error flag means that there are no languages assigned as default.
+   * Implementation of s_get_default_name().
    */
-  static function s_get_default_name() {
+  public static function s_get_default_name() {
     return c_base_return_string::s_new($this->s_aliases[self::ENGLISH_US]);
   }
+
+  /**
+   * Implementation of s_get_ids().
+   */
+  public static function s_get_ids() {
+    $ids = array();
+    foreach (self::$s_aliases as $key => $value) {
+      $ids[$key] = $key;
+    }
+    unset($key);
+    unset($value);
+
+    return c_base_return_array::s_new($ids);
+  }
+
+  /**
+   * Implementation of s_get_aliases().
+   */
+  public static function s_get_aliases() {
+    return c_base_return_array::s_new(self::$s_aliases);
+  }
+
+  /**
+   * Implementation of s_get_names().
+   */
+  public static function s_get_names() {
+    return c_base_return_array::s_new(self::$s_names);
+  }
 }
index 88215330575ef269ef28e2139fb17700e4648a65..c3cde253dc558e297dd37de0e4d2cfe368de47ef 100644 (file)
@@ -251,7 +251,6 @@ class c_base_path extends c_base_rfc_string {
    *   0 may be assigned to represent no group.
    * @param string $field_path
    *   The URL path assigned to this field.
-   *   This is not assigned on parameter error.
    * @param bool $is_private
    *   (optional) When TRUE, path is considered private and requires specific access privileges.
    *   When FALSE, the path is accessible without any access privileges.
@@ -269,13 +268,8 @@ class c_base_path extends c_base_rfc_string {
     // @todo: store all errors on return.
     $errors = array();
 
-    if (is_int($id_group)) {
-      $path->set_id_group($id_group);
-    }
-
-    if (is_string($field_path)) {
-      $path->set_value($field_path);
-    }
+    $path->set_id_group($id_group);
+    $path->set_value($field_path);
 
     if (is_bool($is_private)) {
       $path->set_is_private($is_private);
@@ -304,9 +298,9 @@ class c_base_path extends c_base_rfc_string {
    *   0 may be assigned to represent no group.
    * @param string $field_path
    *   The URL path assigned to this field.
-   *   This is not assigned on parameter error.
-   * @param string $field_destination
-   *   A destination URL to in which this is an alias of.
+   * @param string|array $field_destination
+   *   When a string, a destination URL to redirect to.
+   *   When an array, an array of the destination url parts.
    * @param bool $is_private
    *   (optional) When TRUE, path is considered private and requires specific access privileges.
    *   When FALSE, the path is accessible without any access privileges.
@@ -324,17 +318,9 @@ class c_base_path extends c_base_rfc_string {
     // @todo: store all errors on return.
     $errors = array();
 
-    if (is_int($id_group)) {
-      $path->set_id_group($id_group);
-    }
-
-    if (is_string($field_path)) {
-      $path->set_value($field_path);
-    }
-
-    if (is_string($field_destination)) {
-      $path->set_field_destination($field_destination);
-    }
+    $path->set_id_group($id_group);
+    $path->set_value($field_path);
+    $path->set_field_destination($field_destination);
 
     if (is_bool($is_private)) {
       $path->set_is_private($is_private);
@@ -358,8 +344,9 @@ class c_base_path extends c_base_rfc_string {
    *
    * Defaults are silently forced on invalid parameters.
    *
-   * @param string $field_destination
-   *   A destination URL to redirect to.
+   * @param string|array $field_destination
+   *   When a string, a destination URL to redirect to.
+   *   When an array, an array of the destination url parts.
    * @param int $response_code
    *   The HTTP code to use when performing the redirect.
    *   Should be one of 3xx error code integers.
@@ -370,7 +357,6 @@ class c_base_path extends c_base_rfc_string {
    *   - 300 (Multiple Choices):
    *   - 301 (Moved Permanently):
    *   - 303 (See Other):
-   *   This is not assigned on parameter error.
    * @param bool $is_private
    *   (optional) When TRUE, path is considered private and requires specific access privileges.
    *   When FALSE, the path is accessible without any access privileges.
@@ -388,13 +374,8 @@ class c_base_path extends c_base_rfc_string {
     // @todo: store all errors on return.
     $errors = array();
 
-    if (is_string($field_destination)) {
-      $path->set_field_destination($field_destination);
-    }
-
-    if (is_int($field_response_code)) {
-      $path->set_field_response_code($field_response_code);
-    }
+    $path->set_field_destination($field_destination);
+    $path->set_field_response_code($field_response_code);
 
     if (is_bool($is_private)) {
       $path->set_is_private($is_private);
@@ -607,14 +588,15 @@ class c_base_path extends c_base_rfc_string {
   /**
    * Assigns the destination field setting.
    *
-   * @param string $field_destination
-   *   The destination field associated with the path.
+   * @param string|array $field_destination
+   *   When a string, a destination URL to redirect to.
+   *   When an array, an array of the destination url parts.
    *
    * @return c_base_return_status
    *   TRUE on success, FALSE otherwise.
    */
   public function set_field_destination($field_destination) {
-    if (!is_string($field_destination)) {
+    if (!is_string($field_destination) && !is_array($field_destination)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'field_destination', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
       return c_base_return_error::s_false($error);
     }
@@ -828,17 +810,21 @@ class c_base_path extends c_base_rfc_string {
   /**
    * Gets the destination field setting.
    *
-   * @return c_base_return_string
+   * @return c_base_return_string|c_base_return_array
    *   Destination field on success.
    *   An empty string is returned if not defined.
    *   Error bit is set on error.
    */
   public function get_field_destination() {
-    if (!is_string($this->field_destination)) {
+    if (!is_string($this->field_destination) && !is_array($this->field_destination)) {
       return c_base_return_string::s_new('');
     }
 
-    return c_base_return_string::s_new($this->field_destination);
+    if (is_string($this->field_destination)) {
+      return c_base_return_string::s_new($this->field_destination);
+    }
+
+    return c_base_return_array::s_new($this->field_destination);
   }
 
   /**
@@ -930,9 +916,6 @@ class c_base_path extends c_base_rfc_string {
    *   The database object, which is usually used by form and ajax paths.
    * @param c_base_session &$session
    *   The current session.
-   * @pram c_base_html &$html
-   *   The HTML object.
-   *   If the content is not renderring HTML, the output parameter should instead be used for providing content.
    * @param array $settings
    *   (optional) An array of additional settings that are usually site-specific.
    *
@@ -940,7 +923,7 @@ class c_base_path extends c_base_rfc_string {
    *   An executed array object is returned on success.
    *   An executed array object with error bit set is returned on error.
    */
-  public function do_execute(&$http, &$database, &$session, &$html, $settings = array()) {
+  public function do_execute(&$http, &$database, &$session, $settings = array()) {
     if (!($database instanceof c_base_database)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'database', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
       return c_base_return_error::s_value(array(), 'c_base_path_executed', $error);
@@ -956,11 +939,6 @@ class c_base_path extends c_base_rfc_string {
       return c_base_return_error::s_value(array(), 'c_base_path_executed', $error);
     }
 
-    if (!($html instanceof c_base_html)) {
-      $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'html', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_value(array(), 'c_base_path_executed', $error);
-    }
-
     if (!is_array($settings)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'settings', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
       return c_base_return_error::s_value(array(), 'c_base_path_executed', $error);
@@ -1138,7 +1116,7 @@ class c_base_path_executed extends c_base_return_array {
   /**
    * Assign output.
    *
-   * @param c_base_value
+   * @param c_base_return
    *   The output to assign.
    *
    * @return c_base_return_status
@@ -1146,7 +1124,7 @@ class c_base_path_executed extends c_base_return_array {
    *   FALSE with error bit set is returned on error.
    */
   public function set_output($output) {
-    if (!($output instanceof c_base_value)) {
+    if (!($output instanceof c_base_return)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'output', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
       return c_base_return_error::s_false($error);
     }
@@ -1158,7 +1136,7 @@ class c_base_path_executed extends c_base_return_array {
   /**
    * Gets the assigned output
    *
-   * @return c_base_return_value|c_base_return_null
+   * @return c_base_return|c_base_return_null
    *   The assigned output is returned.
    *   If there is no assigned output (generally when execution is not performed) NULL is returned.
    */
@@ -1260,7 +1238,7 @@ class c_base_paths extends c_base_return {
     }
 
     if (mb_strlen($path) == 0) {
-      $this->root = array('handler' => $handler, 'include' => $include);
+      $this->root = array('handler' => $handler, 'include' => $include, 'is_root' => TRUE);
       return new c_base_return_true();
     }
 
@@ -1293,7 +1271,7 @@ class c_base_paths extends c_base_return {
         $id_group = $ordinal;
       }
       unset($ordinal);
-      unset($path_pats[0]);
+      unset($path_parts[0]);
     }
 
     if (!is_array($this->paths)) {
@@ -1363,7 +1341,7 @@ class c_base_paths extends c_base_return {
 
     if (is_null($path_string) || mb_strlen($path_string) == 0) {
       if (is_array($this->root)) {
-        return $this->root;
+        return c_base_return_array::s_new($this->root);
       }
 
       return new c_base_return_null();
@@ -1383,7 +1361,7 @@ class c_base_paths extends c_base_return {
     unset($path);
 
     // if the sanitized path is different from the original, then send a url redirect.
-    if (strcmp($path_string, $sanitized) != 0) {
+    if (strcmp($path_string, $sanitized) != 0 && $path_string != '/' . $sanitized) {
       return c_base_return_array::s_new(array('redirect' => $sanitized, 'code' => c_base_http_status::MOVED_PERMANENTLY));
     }
 
@@ -1399,14 +1377,14 @@ class c_base_paths extends c_base_return {
         $id_group = $ordinal;
       }
       unset($ordinal);
-      unset($path_pats[0]);
+      unset($path_parts[0]);
     }
 
 
     $depth_current = 1;
     $depth_total = count($path_parts);
     $found = NULL;
-    $path_tree = &$this->paths[$sort];
+    $path_tree = &$this->paths[$id_group];
     foreach ($path_parts as $path_part) {
       if ($depth_current == $depth_total) {
         if (isset($path_tree['handler'])) {
index be02c3a8a0af79866a7bbcd24dbf54804793c241..0c44f75b80a56a536f46ecb421487849d4307785 100644 (file)
@@ -3671,7 +3671,7 @@ abstract class c_base_rfc_string extends c_base_rfc_char {
 
     $combined = NULL;
     if (isset($uri_array['scheme'])) {
-      $combined .= $uri_array['scheme'] . ':';
+      $combined .= $uri_array['scheme'] . '://';
     }
 
     if (isset($uri_array['authority'])) {
@@ -3687,30 +3687,7 @@ abstract class c_base_rfc_string extends c_base_rfc_char {
         $combined .= '?' . $uri_array['query'];
       }
       elseif (is_array($uri_array['query'])) {
-        $combined .= '?';
-
-        reset($uri_array['query']);
-        $query_name = key($uri_array['query']);
-        $query_value = $uri_array['query'][$query_name];
-        unset($uri_array['query'][$query_name]);
-
-        if (is_null($query_value)) {
-          $combined .= $query_name;
-        }
-        else {
-          $combined .= $query_name . '=' . $query_value;
-        }
-
-        foreach ($uri_array['query'] as $query_name => $query_value) {
-          if (is_null($query_value)) {
-            $combined .= $query_name;
-            continue;
-          }
-
-          $combined .= '&' . $query_name . '=' . $query_value;
-        }
-        unset($query_name);
-        unset($query_value);
+        $combined .= '?' . http_build_query($uri_array['query'], '', '&', PHP_QUERY_RFC3986);
       }
     }
 
index 95c11c644f3b27480f11e63d7d695b34c9f789fd..6dcfa3b9259dbcec79999c39d917a271352fc585 100644 (file)
@@ -654,7 +654,7 @@ create function s_administers.f_users_update_materialized_views() returns trigge
   end;
 $$ language plpgsql;
 
-alter function s_administers.f_users_update_as_administer() owner to r_reservation_administer;
+alter function s_administers.f_users_update_materialized_views() owner to r_reservation_administer;
 
 create trigger tr_users_insert_actions
   before insert on s_tables.t_users
index 89e21bfd0fef9b0c8bd6493da477ba5d6c0310d0..e24708dd08f92da553ca1cc3cb31041274be341f 100644 (file)
 <?php
-  // assign custom include path.
-  set_include_path('/var/www/git/koopa');
-
-  // load the global defaults file (this file is not included by default but is required by all).
-  // replace this with your own as you see fit.
-  require_once('common/base/classes/base_defaults_global.php');
-
-  require_once('common/base/classes/base_http.php');
-  require_once('common/base/classes/base_http_status.php');
-  require_once('common/base/classes/base_cookie.php');
-  require_once('common/base/classes/base_ldap.php');
-  require_once('common/base/classes/base_markup.php');
-  require_once('common/base/classes/base_html.php');
-  require_once('common/base/classes/base_charset.php');
-  require_once('common/base/classes/base_database.php');
-  require_once('common/base/classes/base_languages.php');
-
-  require_once('common/theme/classes/theme_html.php');
-
-  require_once('program/reservation/reservation_database.php');
-  require_once('program/reservation/reservation_session.php');
-  require_once('program/reservation/reservation_paths.php');
-  require_once('program/reservation/reservation_redirects.php');
-
-  /**
-   * Load all custom settings.
-   *
-   * @return array
-   *   Custom settings.
-   */
-  function reservation_load_settings() {
-    ini_set('opcache.enable', FALSE);
-    ini_set('opcache.enable_cli', FALSE);
-
-    // only enable output buffering during the output stage, keep it disabled until then.
-    ini_set('output_buffering', FALSE);
-
-    $settings = array();
-
-    // database information
-    $settings['database_host'] = '127.0.0.1';
-    $settings['database_port'] = 5432;
-    $settings['database_name'] = 'reservation';
-    $settings['database_user'] = 'u_reservation_public';
-    $settings['database_password'] = NULL;
-    $settings['database_timeout'] = 4;
-    #$settings['database_ssl_mode'] = 'require';
-    $settings['database_ssl_mode'] = 'disable';
-    $settings['database_create_account_host'] = '127.0.0.1';
-    $settings['database_create_account_port'] = 5433;
-
-    // cookie/session information
-    $settings['cookie_name'] = 'reservation-session';
-    $settings['cookie_path'] = '/';
-    $settings['cookie_domain'] = '.localhost';
-    $settings['cookie_http_only'] = FALSE; // setting this to false will allow javascript to access this cookie, such as for ajax.
-    $settings['cookie_host_only'] = TRUE;
-    $settings['cookie_same_site'] = c_base_cookie::SAME_SITE_STRICT;
-    $settings['session_socket'] = '/program/sockets/sessionize_accounts/';
-    $settings['session_system'] = 'reservation';
-    $settings['session_expire'] = 600; // 10 minutes
-    $settings['session_max'] = 1800; // 30 minutes
-
-    // ldap information
-    $settings['ldap_server'] = 'ldaps://127.0.0.1:1636/';
-    $settings['ldap_base_dn'] = 'ou=users,ou=People';
-    $settings['ldap_fields'] = array('mail', 'gecos', 'givenname', 'cn', 'sn', 'employeenumber');
-
-    // base settings
-    $settings['base_scheme'] = 'https';
-    $settings['base_host'] = 'localhost';
-    $settings['base_path'] = $settings['cookie_path'];
-
-    // default supported languages.
-    c_base_defaults_global::s_set_languages(new c_base_language_limited());
-
-    return $settings;
+// assign custom include path.
+set_include_path('/var/git/koopa');
+
+// load the global defaults file (this file is not included by default but is required by all).
+// replace this with your own as you see fit.
+require_once('common/base/classes/base_defaults_global.php');
+
+require_once('common/base/classes/base_http.php');
+require_once('common/base/classes/base_http_status.php');
+require_once('common/base/classes/base_cookie.php');
+require_once('common/base/classes/base_ldap.php');
+require_once('common/base/classes/base_markup.php');
+require_once('common/base/classes/base_html.php');
+require_once('common/base/classes/base_charset.php');
+require_once('common/base/classes/base_database.php');
+require_once('common/base/classes/base_languages.php');
+
+require_once('program/reservation/reservation_database.php');
+require_once('program/reservation/reservation_session.php');
+require_once('program/reservation/reservation_paths.php');
+require_once('program/reservation/reservation_build.php');
+
+/**
+ * Load all custom settings.
+ *
+ * @return array
+ *   Custom settings.
+ */
+function reservation_load_settings() {
+  ini_set('opcache.enable', FALSE);
+  ini_set('opcache.enable_cli', FALSE);
+
+  // only enable output buffering during the output stage, keep it disabled until then.
+  ini_set('output_buffering', FALSE);
+
+  $settings = array();
+
+  // database information
+  $settings['database_host'] = '127.0.0.1';
+  $settings['database_port'] = 5432;
+  $settings['database_name'] = 'reservation';
+  $settings['database_user'] = 'u_reservation_public';
+  $settings['database_password'] = NULL;
+  $settings['database_timeout'] = 4;
+  #$settings['database_ssl_mode'] = 'require';
+  $settings['database_ssl_mode'] = 'disable';
+  $settings['database_create_account_host'] = '127.0.0.1';
+  $settings['database_create_account_port'] = 5433;
+
+  // cookie/session information
+  $settings['cookie_name'] = 'reservation-session';
+  $settings['cookie_path'] = '/';
+  $settings['cookie_domain'] = '.localhost';
+  $settings['cookie_http_only'] = FALSE; // setting this to false will allow javascript to access this cookie, such as for ajax.
+  $settings['cookie_host_only'] = TRUE;
+  $settings['cookie_same_site'] = c_base_cookie::SAME_SITE_STRICT;
+  $settings['session_socket'] = '/program/sockets/sessionize_accounts/';
+  $settings['session_system'] = 'reservation';
+  $settings['session_expire'] = 600; // 10 minutes
+  $settings['session_max'] = 1800; // 30 minutes
+
+  // ldap information
+  $settings['ldap_server'] = 'ldaps://127.0.0.1:1636/';
+  $settings['ldap_base_dn'] = 'ou=users,ou=People';
+  $settings['ldap_fields'] = array('mail', 'gecos', 'givenname', 'cn', 'sn', 'employeenumber');
+
+  // base settings
+  $settings['base_scheme'] = 'https';
+  $settings['base_host'] = 'localhost';
+  $settings['base_path'] = $settings['cookie_path'];
+
+  if (!isset($_SERVER["HTTPS"])) {
+    $settings['base_scheme'] = 'http';
   }
 
-  /**
-   * Process HTTP request.
-   *
-   * @return c_base_http
-   *   Processed and loaded request.
-   */
-  function reservation_receive_request() {
-    $http = new c_base_http();
-    $http->do_load_request();
+  // default supported languages.
+  c_base_defaults_global::s_set_languages(new c_base_language_limited());
 
-    // Assign a default response protocol.
-    $http->set_response_protocol('HTTP/1.1');
+  return $settings;
+}
 
-    // Assign a default response status (expected to be overridden by path handlers).
-    $http->set_response_status(c_base_http_status::OK);
-
-    return $http;
-  }
-
-  /**
-   * Send HTTP response.
-   *
-   * @param c_base_http $http
-   *   Http object.
-   */
-  function reservation_send_response($http) {
-    // add headers
-    $http->set_response_date();
-    $http->set_response_content_type('text/html');
-    $http->set_response_content_language();
-    #$http->set_response_etag();
-    #$http->set_response_last_modified(strtotime('now'));
-    #$http->set_response_expires(strtotime('+30 minutes'));
-    $http->set_response_pragma('no-cache');
-    $http->set_response_vary('Host');
-    $http->set_response_vary('User-Agent');
-    $http->set_response_vary('Accept');
-    $http->set_response_vary('Accept-Language');
-    #$http->set_response_warning('1234 This site is under active development.');
-
-    // finalize the content prior to sending headers to ensure header accuracy.
-    $http->encode_response_content();
-
-
-    // manually disable output buffering (if enabled) when transfer headers and content.
-    $old_output_buffering = ini_get('output_buffering');
-    ini_set('output_buffering', 'off');
-
-
-    // when the headers are sent, checksums are created, so at this point all error output should be stored and not sent.
-    $http->send_response_headers(TRUE);
+/**
+ * Process HTTP request.
+ *
+ * @return c_base_http
+ *   Processed and loaded request.
+ */
+function reservation_receive_request() {
+  $http = new c_base_http();
+  $http->do_load_request();
 
+  // Assign a default response protocol.
+  $http->set_response_protocol('HTTP/1.1');
 
-    // once the header are sent, send the content.
-    $http->send_response_content();
+  // Assign a default response status (expected to be overridden by path handlers).
+  $http->set_response_status(c_base_http_status::OK);
 
-
-    ini_set('output_buffering', $old_output_buffering);
-    unset($old_output_buffering);
+  // get the current language and assign the default.
+  $languages = c_base_defaults_global::s_get_languages()::s_get_ids()->get_value_exact();
+  if (!is_array($languages) || empty($languages)) {
+    $languages = array(i_base_language::ENGLISH_US => i_base_language::ENGLISH_US, i_base_language::ENGLISH => i_base_language::ENGLISH);
   }
 
-  /**
-   * Process page request.
-   *
-   * @param c_base_http &$http
-   *   Http object.
-   * @param c_base_database &$databbase
-   *   The database object.
-   * @param array &$settings
-   *   System settings
-   * @param c_base_session &$session
-   *   Session information.
-   *
-   * @return c_base_html|c_base_return_array
-   *   The generated html is returned on success.
-   *   In certain cases, an array is returned for special handling, such as redirects.
-   */
-  function reservation_process_request(&$http, &$database, &$settings, &$session) {
-    $html = new c_base_html();
-
-
-    // assign class attribute
-    $class = array(
-      'reservation',
-      'no-script',
-      'is-html5',
-    );
-
-    $html->set_attribute(c_base_markup_attributes::ATTRIBUTE_CLASS, $class);
-    unset($class);
-
-
-    // assign id attribute
-    $html->set_attribute(c_base_markup_attributes::ATTRIBUTE_ID, 'reservation-system');
-
-
-    // assign language attribute
-    $html->set_attribute(c_base_markup_attributes::ATTRIBUTE_LANGUAGE, i_base_language::ENGLISH_US);
-
-
-    // assign direction attribute
-    $html->set_attribute(c_base_markup_attributes::ATTRIBUTE_DIRECTION, 'ltr');
-
-
-    // assign title header tag (setting title tag at delta 0 so that it can easily be overriden as needed).
-    $tag = new c_base_markup_tag();
-    $tag->set_type(c_base_markup_tag::TYPE_TITLE);
-    $tag->set_text('Reservation System');
-    $html->set_header($tag, 0);
-    unset($tag);
-
-
-    // assign base header tag
-    #$tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_BASE);
-    #$tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_HREF, 'http://localhost/');
-    #$html->set_header($tag);
-    #unset($tag);
-
-
-    // assign http-equiv header tag
-    $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
-    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_HTTP_EQUIV, 'Content-Type');
-    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_CONTENT, 'text/html; charset=utf-8');
-    $html->set_header($tag);
-    unset($tag);
-
-
-    // assign charset header tag
-    $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
-    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_CHARACTER_SET, c_base_charset::UTF_8);
-    $html->set_header($tag);
-    unset($tag);
-
-
-    // assign canonical header tag
-    #$tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
-    #$tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_REL, 'canonical');
-    #$tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_HREF, 'http://localhost/');
-    #$html->set_header($tag);
-    #unset($tag);
-
+  $selected = $http->select_language($languages)->get_value_exact();
 
-    // assign shortlink header tag
-    #$tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
-    #$tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_REL, 'shortlink');
-    #$tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_HREF, '/');
-    #$html->set_header($tag);
-    #unset($tag);
-
-
-    // assign description header tag
-    $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
-    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_NAME, 'description');
-    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_CONTENT, 'A reservation/scheduling system.');
-    $html->set_header($tag);
-    unset($tag);
-
-
-    // assign distribution header tag
-    $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
-    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_NAME, 'distribution');
-    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_CONTENT, 'web');
-    $html->set_header($tag);
-    unset($tag);
-
-
-    // assign robots header tag
-    $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
-    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_NAME, 'robots');
-    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_CONTENT, 'INDEX,FOLLOW');
-    $html->set_header($tag);
-    unset($tag);
-
-
-    // assign expires header tag
-    #$tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
-    #$tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_HTTP_EQUIV, 'expires');
-    #$tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_CONTENT, c_base_defaults_global::s_get_date('r', strtotime('+30 minutes'))->get_value_exact());
-    #$html->set_header($tag);
-    #unset($tag);
+  // select the primary language.
+  $http->set_response_content_language($selected, FALSE);
 
+  // this website is primary us-english (and therefore english), also set this as an additional language because multi-lingual support is not 100% guaranteed.
+  if ($selected != i_base_language::ENGLISH_US) {
+    $http->set_response_content_language(i_base_language::ENGLISH_US);
+  }
 
-    // assign viewport header tag
-    $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
-    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_NAME, 'viewport');
-    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_CONTENT, 'width=device-width, initial-scale=1');
-    $html->set_header($tag);
-    unset($tag);
+  if ($selected != i_base_language::ENGLISH) {
+    $http->set_response_content_language(i_base_language::ENGLISH);
+  }
+  unset($selected);
+
+  return $http;
+}
+
+/**
+ * Send HTTP response.
+ *
+ * @param c_base_http $http
+ *   Http object.
+ */
+function reservation_send_response($http) {
+  // add headers
+  $http->set_response_date();
+  $http->set_response_content_type('text/html');
+  #$http->set_response_etag();
+  #$http->set_response_last_modified(strtotime('now'));
+  #$http->set_response_expires(strtotime('+30 minutes'));
+  $http->set_response_pragma('no-cache');
+  $http->set_response_vary('Host');
+  $http->set_response_vary('User-Agent');
+  $http->set_response_vary('Accept');
+  $http->set_response_vary('Accept-Language');
+  #$http->set_response_warning('1234 This site is under active development.');
+
+  // finalize the content prior to sending headers to ensure header accuracy.
+  $http->encode_response_content();
+
+
+  // manually disable output buffering (if enabled) when transfer headers and content.
+  $old_output_buffering = ini_get('output_buffering');
+  ini_set('output_buffering', 'off');
+
+
+  // when the headers are sent, checksums are created, so at this point all error output should be stored and not sent.
+  $http->send_response_headers(TRUE);
+
+
+  // once the header are sent, send the content.
+  $http->send_response_content();
+
+
+  ini_set('output_buffering', $old_output_buffering);
+  unset($old_output_buffering);
+}
+
+/**
+ * Process page request.
+ *
+ * @param c_base_http &$http
+ *   Http object.
+ * @param c_base_database &$databbase
+ *   The database object.
+ * @param array &$settings
+ *   System settings
+ * @param c_base_session &$session
+ *   Session information.
+ *
+ * @return c_base_return
+ *   The generated html is returned on success.
+ *   The generated text is returned on success.
+ *   This does not set the error bit on error.
+ */
+function reservation_process_request(&$http, &$database, &$session, &$settings) {
+  $session_user = $session->get_name()->get_value_exact();
+  if (is_null($session_user)) {
+    $logged_in = FALSE;
+
+    // @todo: delete old cookies, if they expire.
+    $cookie_login = $session->get_cookie();
+
+    // @fixme: shouldn't this check be in the session management code?
+    // the session should already be logged into at this point.
+    // if the session id exists, but no user id is defined, then the session is no longer valid, so delete the invalid cookie.
+    if (!empty($session->get_session_id()->get_value_exact())) {
+      $cookie_login->set_expires(-1);
+      $cookie_login->set_max_age(-1);
+      $session->set_cookie($cookie_login);
+      unset($cookie_login);
 
-    if (!isset($_SERVER["HTTPS"])) {
-      //reservation_login_page_require_https($settings, $session, $html);
-      // @todo: provide custom https required page.
-      return $html;
+      $session->set_session_id(NULL);
     }
+  }
+  else {
+    $user_name = $session->get_name()->get_value();
+    $password = $session->get_password()->get_value();
 
-    $session_user = $session->get_name()->get_value_exact();
-    if (is_null($session_user)) {
-      $logged_in = FALSE;
-
-      // @todo: delete old cookies, if they expire.
-      $cookie_login = $session->get_cookie();
-
-      // @fixme: shouldn't this check be in the session management code?
-      // the session should already be logged into at this point.
-      // if the session id exists, but no user id is defined, then the session is no longer valid, so delete the invalid cookie.
-      if (!empty($session->get_session_id()->get_value_exact())) {
-        $cookie_login->set_expires(-1);
-        $cookie_login->set_max_age(-1);
-        $session->set_cookie($cookie_login);
-        unset($cookie_login);
+    if (is_null($user_name) || is_null($password)) {
+      unset($user_name);
+      unset($password);
 
-        $session->set_session_id(NULL);
-      }
+      $logged_in = FALSE;
     }
     else {
       $logged_in = TRUE;
-    }
-
-    $paths = new c_reservation_paths();
-    $paths->reservation_process_path($http, $database, $session, $html, $settings, $logged_in);
-    unset($logged_in);
-    unset($paths);
-
-    return $html;
-  }
-
-  /**
-   * Render the theme.
-   *
-   * @param c_base_http $http
-   *   Http object.
-   * @param c_base_html $html
-   *   The HTML object.
-   */
-  function reservation_render_theme($http, $html) {
-    $theme = new c_theme_html();
-    $theme->set_html($html);
-    $theme->set_http($http);
-    $theme->render_markup();
-
-    return $theme->get_markup();
-  }
+      reservation_database_string($database, $settings, $user_name, $password);
 
-  /**
-   * Build the HTTP response.
-   *
-   * @param c_base_http &$http
-   *   Http object.
-   * @param c_base_session &$session
-   *   Session information.
-   * @param string $markup
-   *   The HTML markup.
-   */
-  function reservation_build_response(&$http, &$session, $markup) {
-    $http->set_response_checksum_header(c_base_http::CHECKSUM_ACTION_AUTO);
-    $http->set_response_content($markup);
-
-
-    // send the session cookie if a session id is specified.
-    $session_id = $session->get_session_id()->get_value_exact();
-    if (!empty($session_id)) {
-      $cookie_login = $session->get_cookie();
-
-      if ($cookie_login instanceof c_base_cookie) {
-        $http->set_response_set_cookie($cookie_login);
-      }
-      unset($cookie_login);
+      unset($user_name);
+      unset($password);
     }
-    unset($session_id);
-
-    return new c_base_return_true();
   }
 
-  /**
-   * Main Program Function
-   *
-   * note: Future designs will likely include content caching.
-   *       There are different designs based on the type of content that can be used for caching.
-   *       The following are some common generic areas to cache:
-   *       - design 1 (public content): 3, 4. 5 (cache handling happens between 2 and 3).
-   *       - design 2 (database bypass): 4 (4 is to be replaced with cache handling).
-   *       - design 3 (theme bypass): 4. 5 (4 is to be replaced with cache handling).
-   *       - design 4 (full private cache): 4. 5, 6* (should still handling login access, only (vary) headers are to be changed in 6).
-   *       - design 5 (full public cache): 3, 4. 5, 6* (should still handling login access, only (vary) headers are to be changed in 6).
-   *
-   *       It is also recommended that some placeholders are added to the css body to provide dynamic css class names, even on cached content.
-   */
-  function reservation_main() {
-    // 1: local settings:
-    $settings = reservation_load_settings();
-    gc_collect_cycles();
-
-
-    // 2: receive request information.
-    $http = reservation_receive_request();
-    gc_collect_cycles();
-
-
-    // 3: process session information
-    $session = reservation_process_sessions($http, $settings);
-    gc_collect_cycles();
-
-
-    // 4: perform actions, process work.
-    $database = new c_base_database();
-    $html = reservation_process_request($http, $database, $settings, $session);
-    if (!($html instanceof c_base_html)) {
-      $html = new c_base_html();
-    }
-
-    if ($database->is_connected() instanceof c_base_return_true) {
-      $database->do_disconnect();
+  $paths = new c_reservation_paths();
+  $executed = $paths->reservation_process_path($http, $database, $session, $settings, $logged_in);
+  unset($logged_in);
+  unset($paths);
+
+  return $executed->get_output();
+}
+
+/**
+ * Render the theme.
+ *
+ * @param c_base_http $http
+ *   Http object.
+ * @param c_base_return $output
+ *   The HTML object.
+ */
+function reservation_render_theme($http, $output) {
+  $theme = new c_theme_html();
+  $theme->set_html($output); // @fixme: this needs to be changed from set_html() to set_output() to handle more types of content.
+  $theme->set_http($http);
+  $theme->render_markup();
+
+  return $theme->get_markup();
+}
+
+/**
+ * Build the HTTP response.
+ *
+ * @param c_base_http &$http
+ *   Http object.
+ * @param c_base_session &$session
+ *   Session information.
+ * @param string $markup
+ *   The HTML markup.
+ */
+function reservation_build_response(&$http, &$session, $markup) {
+  $http->set_response_checksum_header(c_base_http::CHECKSUM_ACTION_AUTO);
+  $http->set_response_content($markup);
+
+
+  // send the session cookie if a session id is specified.
+  $session_id = $session->get_session_id()->get_value_exact();
+  if (!empty($session_id)) {
+    $cookie_login = $session->get_cookie();
+
+    if ($cookie_login instanceof c_base_cookie) {
+      $http->set_response_set_cookie($cookie_login);
     }
-    unset($database);
-    gc_collect_cycles();
+    unset($cookie_login);
+  }
+  unset($session_id);
+
+  return new c_base_return_true();
+}
+
+/**
+ * Main Program Function
+ *
+ * note: Future designs will likely include content caching.
+ *       There are different designs based on the type of content that can be used for caching.
+ *       The following are some common generic areas to cache:
+ *       - design 1 (public content): 3, 4. 5 (cache handling happens between 2 and 3).
+ *       - design 2 (database bypass): 4 (4 is to be replaced with cache handling).
+ *       - design 3 (theme bypass): 4. 5 (4 is to be replaced with cache handling).
+ *       - design 4 (full private cache): 4. 5, 6* (should still handling login access, only (vary) headers are to be changed in 6).
+ *       - design 5 (full public cache): 3, 4. 5, 6* (should still handling login access, only (vary) headers are to be changed in 6).
+ *
+ *       It is also recommended that some placeholders are added to the css body to provide dynamic css class names, even on cached content.
+ */
+function reservation_main() {
+  // 1: local settings:
+  $settings = reservation_load_settings();
+  gc_collect_cycles();
+
+
+  // 2: receive request information.
+  $http = reservation_receive_request();
+  gc_collect_cycles();
+
+
+  // 3: process session information
+  $session = reservation_process_sessions($http, $settings);
+  gc_collect_cycles();
+
+
+  // 4: perform actions, process work.
+  $database = new c_base_database();
+  $output = reservation_process_request($http, $database, $session, $settings);
+
+  if ($database->is_connected() instanceof c_base_return_true) {
+    $database->do_disconnect();
+  }
+  unset($database);
+  gc_collect_cycles();
 
 
-    // 5: build or finalize theme.
-    $markup = reservation_render_theme($http, $html)->get_value_exact();
-    unset($html);
-    gc_collect_cycles();
+  // 5: build or finalize theme.
+  $markup = reservation_render_theme($http, $output)->get_value_exact();
+  unset($output);
+  gc_collect_cycles();
 
 
-    // 6: build response information.
-    reservation_build_response($http, $session, $markup);
-    unset($markup);
-    gc_collect_cycles();
+  // 6: build response information.
+  reservation_build_response($http, $session, $markup);
+  unset($markup);
+  gc_collect_cycles();
 
 
-    // 7: send HTTP response.
-    reservation_send_response($http);
-    gc_collect_cycles();
+  // 7: send HTTP response.
+  reservation_send_response($http);
+  gc_collect_cycles();
 
-    unset($settings);
-    unset($http);
-    unset($session);
-    gc_collect_cycles();
-  }
+  unset($settings);
+  unset($http);
+  unset($session);
+  gc_collect_cycles();
+}
 
-  reservation_main();
+reservation_main();
index 703d22c74fa4653cf5c4231a75edc1e48496e25c..af302fed2e2e0b9b77a1807c09e3217ae4d53161 100644 (file)
@@ -13,14 +13,13 @@ require_once('common/base/classes/base_session.php');
 
 require_once('common/theme/classes/theme_html.php');
 
-final class c_reservation_path_access_denied extends c_base_path {
-
+class c_reservation_path_access_denied extends c_base_path {
   /**
    * Implements do_execute().
    */
-  public function do_execute(&$http, &$database, &$session, &$html, $settings = array()) {
+  public function do_execute(&$http, &$database, &$session, $settings = array()) {
     // the parent function performs validation on the parameters.
-    $executed = parent::do_execute($http, $database, $session, $html, $settings);
+    $executed = parent::do_execute($http, $database, $session, $settings);
     if (c_base_return::s_has_error($executed)) {
       return $executed;
     }
@@ -32,21 +31,27 @@ final class c_reservation_path_access_denied extends c_base_path {
 
     // H1
     $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_H1);
-    $tag->set_text('Access Denied');
+    $tag->set_text($this->pr_get_text(0));
     $wrapper->set_tag($tag);
     unset($tag);
 
 
     // Content
     $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_DIVIDER);
-    $tag->set_text('You are not authorized to access this resource.');
+    $tag->set_text($this->pr_get_text(1));
     $wrapper->set_tag($tag);
     unset($tag);
 
 
+    // initialize the content as HTML.
+    $html = c_reservation_build::s_create_html($http, $database, $session, $settings, $this->pr_get_title());
     $html->set_tag($wrapper);
     unset($wrapper);
 
+    $executed = new c_base_path_executed();
+    $executed->set_output($html);
+    unset($html);
+
 
     // assign HTTP response status.
     $http->set_response_status(c_base_http_status::FORBIDDEN);
@@ -54,4 +59,34 @@ final class c_reservation_path_access_denied extends c_base_path {
 
     return $executed;
   }
+
+  /**
+   * Load the title text associated with this page.
+   *
+   * This is provided here as a means for a language class to override with a custom language for the title.
+   *
+   * @return string|null
+   *   A string is returned as the custom title.
+   *   NULL is returned to enforce default title.
+   */
+  protected function pr_get_title() {
+    return NULL;
+  }
+
+  /**
+   * Load text for a supported language.
+   *
+   * @param int $index
+   *   A number representing which block of text to return.
+   */
+  protected function pr_get_text($code) {
+    switch ($code) {
+      case 0:
+        return 'Access Denied';
+      case 1:
+        return 'You are not authorized to access this resource.';
+    }
+
+    return '';
+  }
 }
index 7a22ca0e815a0218813398b6314e6f0caeb36e3f..b40b2876f622312597b839682797b723a8aa75e0 100644 (file)
@@ -13,15 +13,15 @@ require_once('common/base/classes/base_session.php');
 
 require_once('common/theme/classes/theme_html.php');
 
-final class c_reservation_path_not_found extends c_base_path {
+class c_reservation_path_bad_method extends c_base_path {
   /**
    * Implements do_execute().
    */
-  public function do_execute(&$http, &$database, &$session, &$html, $settings = array()) {
+  public function do_execute(&$http, &$database, &$session, $settings = array()) {
     // @todo: This needs to return the HTTP invalid method response status.
 
     // the parent function performs validation on the parameters.
-    $executed = parent::do_execute($http, $database, $session, $html, $settings);
+    $executed = parent::do_execute($http, $database, $session, $settings);
     if (c_base_return::s_has_error($executed)) {
       return $executed;
     }
@@ -33,21 +33,27 @@ final class c_reservation_path_not_found extends c_base_path {
 
     // H1
     $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_H1);
-    $tag->set_text('Bad Method');
+    $tag->set_text($this->pr_get_text(0));
     $wrapper->set_tag($tag);
     unset($tag);
 
 
     // Content
     $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_DIVIDER);
-    $tag->set_text('The provided HTTP request method is either unsupported or invalid for the request path.');
+    $tag->set_text($this->pr_get_text(1));
     $wrapper->set_tag($tag);
     unset($tag);
 
 
+    // initialize the content as HTML.
+    $html = c_reservation_build::s_create_html($http, $database, $session, $settings, $this->pr_get_title());
     $html->set_tag($wrapper);
     unset($wrapper);
 
+    $executed = new c_base_path_executed();
+    $executed->set_output($html);
+    unset($html);
+
 
     // assign HTTP response status.
     $http->set_response_status(c_base_http_status::METHOD_NOT_ALLOWED);
@@ -55,4 +61,34 @@ final class c_reservation_path_not_found extends c_base_path {
 
     return $executed;
   }
+
+  /**
+   * Load the title text associated with this page.
+   *
+   * This is provided here as a means for a language class to override with a custom language for the title.
+   *
+   * @return string|null
+   *   A string is returned as the custom title.
+   *   NULL is returned to enforce default title.
+   */
+  protected function pr_get_title() {
+    return NULL;
+  }
+
+  /**
+   * Load text for a supported language.
+   *
+   * @param int $index
+   *   A number representing which block of text to return.
+   */
+  protected function pr_get_text($code) {
+    switch ($code) {
+      case 0:
+        return 'Bad Method';
+      case 1:
+        return 'The provided HTTP request method is either unsupported or invalid for the request path.';
+    }
+
+    return '';
+  }
 }
diff --git a/program/reservation/internal/ja/access_denied.php b/program/reservation/internal/ja/access_denied.php
new file mode 100644 (file)
index 0000000..b197b8c
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+/**
+ * @file
+ * Provides path handler for the access denied pages.
+ */
+
+final class c_reservation_path_access_denied_ja extends c_reservation_path_access_denied {
+  /**
+   * Implements pr_get_title().
+   */
+  protected function pr_get_title() {
+    return '予約システム';
+  }
+
+  /**
+   * Implements pr_get_text().
+   */
+  protected function pr_get_text($code) {
+    switch ($code) {
+      case 0:
+        return 'アクセス拒否';
+      case 1:
+        return 'このリソースにアクセスする権限がありません。';
+    }
+
+    return '';
+  }
+}
diff --git a/program/reservation/internal/ja/bad_method.php b/program/reservation/internal/ja/bad_method.php
new file mode 100644 (file)
index 0000000..07dad1c
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+/**
+ * @file
+ * Provides path handler for the not found pages.
+ */
+
+final class c_reservation_path_bad_method_ja extends c_reservation_path_bad_method {
+  /**
+   * Implements pr_get_title().
+   */
+  protected function pr_get_title() {
+    return '予約システム';
+  }
+
+  /**
+   * Implements pr_get_text().
+   */
+  protected function pr_get_text($code) {
+    switch ($code) {
+      case 0:
+        return '悪い方法';
+      case 1:
+        return '指定されたHTTP要求メソッドは、要求パスに対してサポートされていないか無効です。';
+    }
+
+    return '';
+  }
+}
diff --git a/program/reservation/internal/ja/not_found.php b/program/reservation/internal/ja/not_found.php
new file mode 100644 (file)
index 0000000..f3a24cb
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+/**
+ * @file
+ * Provides path handler for the not found pages.
+ */
+
+final class c_reservation_path_not_found_ja extends c_reservation_path_not_found {
+  /**
+   * Implements pr_get_title().
+   */
+  protected function pr_get_title() {
+    return '予約システム';
+  }
+
+  /**
+   * Implements pr_get_text().
+   */
+  protected function pr_get_text($code) {
+    switch ($code) {
+      case 0:
+        return '見つかりません';
+      case 1:
+        return 'リクエストしたページは利用できません。';
+    }
+
+    return '';
+  }
+}
diff --git a/program/reservation/internal/ja/server_error.php b/program/reservation/internal/ja/server_error.php
new file mode 100644 (file)
index 0000000..a2271b2
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+/**
+ * @file
+ * Provides path handler for the server error pages.
+ */
+
+final class c_reservation_path_server_error_ja extends c_reservation_path_server_error {
+  /**
+   * Implements pr_get_title().
+   */
+  protected function pr_get_title() {
+    return '予約システム';
+  }
+
+  /**
+   * Implements pr_get_text().
+   */
+  protected function pr_get_text($code) {
+    switch ($code) {
+      case 0:
+        return 'サーバーエラー';
+      case 1:
+        return 'リクエストの処理中に問題が発生しました。しばらくしてからもう一度お試しください。';
+    }
+
+    return '';
+  }
+}
index 3ae847d60005e6be3473c382903679c8f1c40a42..31922ba7e962a89aef16ac46e92e744f97cce44e 100644 (file)
@@ -13,13 +13,13 @@ require_once('common/base/classes/base_session.php');
 
 require_once('common/theme/classes/theme_html.php');
 
-final class c_reservation_path_not_found extends c_base_path {
+class c_reservation_path_not_found extends c_base_path {
   /**
    * Implements do_execute().
    */
-  public function do_execute(&$http, &$database, &$session, &$html, $settings = array()) {
+  public function do_execute(&$http, &$database, &$session, $settings = array()) {
     // the parent function performs validation on the parameters.
-    $executed = parent::do_execute($http, $database, $session, $html, $settings);
+    $executed = parent::do_execute($http, $database, $session, $settings);
     if (c_base_return::s_has_error($executed)) {
       return $executed;
     }
@@ -31,25 +31,62 @@ final class c_reservation_path_not_found extends c_base_path {
 
     // H1
     $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_H1);
-    $tag->set_text('Page Not Found');
+    $tag->set_text($this->pr_get_text(0));
     $wrapper->set_tag($tag);
     unset($tag);
 
 
     // Content
     $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_DIVIDER);
-    $tag->set_text('The page you requested is not available.');
+    $tag->set_text($this->pr_get_text(1));
     $wrapper->set_tag($tag);
     unset($tag);
 
 
+    // initialize the content as HTML.
+    $html = c_reservation_build::s_create_html($http, $database, $session, $settings, $this->pr_get_title());
     $html->set_tag($wrapper);
     unset($wrapper);
 
+    $executed = new c_base_path_executed();
+    $executed->set_output($html);
+    unset($html);
+
 
     // assign HTTP response status.
     $http->set_response_status(c_base_http_status::NOT_FOUND);
 
+
     return $executed;
   }
+
+  /**
+   * Load the title text associated with this page.
+   *
+   * This is provided here as a means for a language class to override with a custom language for the title.
+   *
+   * @return string|null
+   *   A string is returned as the custom title.
+   *   NULL is returned to enforce default title.
+   */
+  protected function pr_get_title() {
+    return NULL;
+  }
+
+  /**
+   * Load text for a supported language.
+   *
+   * @param int $index
+   *   A number representing which block of text to return.
+   */
+  protected function pr_get_text($code) {
+    switch ($code) {
+      case 0:
+        return 'Page Not Found';
+      case 1:
+        return 'The page you requested is not available.';
+    }
+
+    return '';
+  }
 }
diff --git a/program/reservation/internal/server_error.php b/program/reservation/internal/server_error.php
new file mode 100644 (file)
index 0000000..9efd4d5
--- /dev/null
@@ -0,0 +1,92 @@
+<?php
+/**
+ * @file
+ * Provides path handler for the server rror pages.
+ */
+
+require_once('common/base/classes/base_error.php');
+require_once('common/base/classes/base_return.php');
+require_once('common/base/classes/base_path.php');
+require_once('common/base/classes/base_html.php');
+require_once('common/base/classes/base_cookie.php');
+require_once('common/base/classes/base_session.php');
+
+require_once('common/theme/classes/theme_html.php');
+
+class c_reservation_path_server_error extends c_base_path {
+  /**
+   * Implements do_execute().
+   */
+  public function do_execute(&$http, &$database, &$session, $settings = array()) {
+    // the parent function performs validation on the parameters.
+    $executed = parent::do_execute($http, $database, $session, $settings);
+    if (c_base_return::s_has_error($executed)) {
+      return $executed;
+    }
+
+
+    // Wrapper
+    $wrapper = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_SECTION, c_base_defaults_global::CSS_BASE . c_base_defaults_global::CSS_BASE . 'content-wrapper', array(c_base_defaults_global::CSS_BASE . 'error-path', 'error-path', 'error-path-not_found'));
+
+
+    // H1
+    $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_H1);
+    $tag->set_text($this->pr_get_text(0));
+    $wrapper->set_tag($tag);
+    unset($tag);
+
+
+    // Content
+    $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_DIVIDER);
+    $tag->set_text($this->pr_get_text(1));
+    $wrapper->set_tag($tag);
+    unset($tag);
+
+
+    // initialize the content as HTML.
+    $html = c_reservation_build::s_create_html($http, $database, $session, $settings, $this->pr_get_title());
+    $html->set_tag($wrapper);
+    unset($wrapper);
+
+    $executed = new c_base_path_executed();
+    $executed->set_output($html);
+    unset($html);
+
+
+    // assign HTTP response status.
+    $http->set_response_status(c_base_http_status::INTERNAL_SERVER_ERROR);
+
+
+    return $executed;
+  }
+
+  /**
+   * Load the title text associated with this page.
+   *
+   * This is provided here as a means for a language class to override with a custom language for the title.
+   *
+   * @return string|null
+   *   A string is returned as the custom title.
+   *   NULL is returned to enforce default title.
+   */
+  protected function pr_get_title() {
+    return NULL;
+  }
+
+  /**
+   * Load text for a supported language.
+   *
+   * @param int $index
+   *   A number representing which block of text to return.
+   */
+  protected function pr_get_text($code) {
+    switch ($code) {
+      case 0:
+        return 'Server Error';
+      case 1:
+        return 'Something went wrong while processing your request, please try again later.';
+    }
+
+    return '';
+  }
+}
index 75139abdff8327d837c18302e32a0cef96ca02bd..1e481876dcec8be2e19ebb453ee376373b2430e4 100644 (file)
@@ -13,23 +13,13 @@ require_once('common/base/classes/base_session.php');
 
 require_once('common/theme/classes/theme_html.php');
 
-final class c_reservation_path_user_dashboard extends c_base_path {
-
-  /**
-   * Class constructor.
-   */
-  public function __construct() {
-    parent::__construct();
-
-    $this->is_root = TRUE;
-  }
-
+class c_reservation_path_user_dashboard extends c_base_path {
   /**
    * Implements do_execute().
    */
-  public function do_execute(&$http, &$database, &$session, &$html, $settings = array()) {
+  public function do_execute(&$http, &$database, &$session, $settings = array()) {
     // the parent function performs validation on the parameters.
-    $executed = parent::do_execute($http, $database, $session, $html, $settings);
+    $executed = parent::do_execute($http, $database, $session, $settings);
     if (c_base_return::s_has_error($executed)) {
       return $executed;
     }
@@ -41,12 +31,12 @@ final class c_reservation_path_user_dashboard extends c_base_path {
 
     // Dashboard Content
     $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_H1);
-    $tag->set_text('Dashboard');
+    $tag->set_text($this->pr_get_text(0));
     $wrapper->set_tag($tag);
     unset($tag);
 
     $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_DIVIDER);
-    $tag->set_text('All links will go here.');
+    $tag->set_text($this->pr_get_text(1));
     $wrapper->set_tag($tag);
     unset($tag);
 
@@ -58,12 +48,12 @@ final class c_reservation_path_user_dashboard extends c_base_path {
     unset($roles_object);
 
     $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_DIVIDER);
-    $tag->set_text('You are currently logged in as: ' . $settings['database_user']);
+    $tag->set_text($this->pr_get_text(2) . $settings['database_user']);
     $wrapper->set_tag($tag);
     unset($tag);
 
     $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_DIVIDER);
-    $tag->set_text('You are currently assigned the following roles:');
+    $tag->set_text($this->pr_get_text(3));
     $wrapper->set_tag($tag);
     unset($tag);
 
@@ -74,40 +64,40 @@ final class c_reservation_path_user_dashboard extends c_base_path {
 
       switch ($role) {
         case c_base_roles::PUBLIC:
-          $tag_li->set_text('Public');
+          $tag_li->set_text($this->pr_get_text(4));
           break;
         case c_base_roles::USER:
-          $tag_li->set_text('User');
+          $tag_li->set_text($this->pr_get_text(5));
           break;
         case c_base_roles::REQUESTER:
-          $tag_li->set_text('Requester');
+          $tag_li->set_text($this->pr_get_text(6));
           break;
         case c_base_roles::DRAFTER:
-          $tag_li->set_text('Drafter');
+          $tag_li->set_text($this->pr_get_text(7));
           break;
         case c_base_roles::EDITOR:
-          $tag_li->set_text('Editor');
+          $tag_li->set_text($this->pr_get_text(8));
           break;
         case c_base_roles::REVIEWER:
-          $tag_li->set_text('Reviewer');
+          $tag_li->set_text($this->pr_get_text(9));
           break;
         case c_base_roles::FINANCER:
-          $tag_li->set_text('Financer');
+          $tag_li->set_text($this->pr_get_text(10));
           break;
         case c_base_roles::INSURER:
-          $tag_li->set_text('Insurer');
+          $tag_li->set_text($this->pr_get_text(11));
           break;
         case c_base_roles::PUBLISHER:
-          $tag_li->set_text('Publisher');
+          $tag_li->set_text($this->pr_get_text(12));
           break;
         case c_base_roles::AUDITOR:
-          $tag_li->set_text('Auditor');
+          $tag_li->set_text($this->pr_get_text(13));
           break;
         case c_base_roles::MANAGER:
-          $tag_li->set_text('Manager');
+          $tag_li->set_text($this->pr_get_text(14));
           break;
         case c_base_roles::ADMINISTER:
-          $tag_li->set_text('Administer');
+          $tag_li->set_text($this->pr_get_text(15));
           break;
       }
 
@@ -118,10 +108,59 @@ final class c_reservation_path_user_dashboard extends c_base_path {
 
     $wrapper->set_tag($tag_ul);
 
-
+    // initialize the content as HTML.
+    $html = c_reservation_build::s_create_html($http, $database, $session, $settings);
     $html->set_tag($wrapper);
-    unset($wrapper);
+
+    $executed = new c_base_path_executed();
+    $executed->set_output($html);
+    unset($html);
 
     return $executed;
   }
+
+  /**
+   * Load text for a supported language.
+   *
+   * @param int $index
+   *   A number representing which block of text to return.
+   */
+  protected function pr_get_text($code) {
+    switch ($code) {
+      case 0:
+        return 'Dashboard';
+      case 1:
+        return 'All links will go here.';
+      case 2:
+        return 'You are currently logged in as: ';
+      case 3:
+        return 'You are currently assigned the following roles:';
+      case 4:
+        return 'Public';
+      case 5:
+        return 'User';
+      case 6:
+        return 'Requester';
+      case 7:
+        return 'Drafter';
+      case 8:
+        return 'Editor';
+      case 9:
+        return 'Reviewer';
+      case 10:
+        return 'Financer';
+      case 11:
+        return 'Insurer';
+      case 12:
+        return 'Publisher';
+      case 13:
+        return 'Auditor';
+      case 14:
+        return 'Manager';
+      case 15:
+        return 'Administer';
+    }
+
+    return '';
+  }
 }
index bc4ee305a690ee5e1d6f95708e22d21360db8319..383ccca7959cf9adf7b262fac5aab32df82a8548 100644 (file)
@@ -17,18 +17,22 @@ require_once('common/theme/classes/theme_html.php');
  *
  * This listens on: /u/login
  */
-final class c_reservation_path_user_login extends c_base_path {
+class c_reservation_path_user_login extends c_base_path {
+  private const PATH_REDIRECTS = 'program/reservation/reservation_redirects.php';
 
   /**
    * Implements do_execute().
    */
-  public function do_execute(&$http, &$database, &$session, &$html, $settings = array()) {
+  public function do_execute(&$http, &$database, &$session, $settings = array()) {
     // the parent function performs validation on the parameters.
-    $executed = parent::do_execute($http, $database, $session, $html, $settings);
+    $executed = parent::do_execute($http, $database, $session, $settings);
     if (c_base_return::s_has_error($executed)) {
       return $executed;
     }
 
+    // initialize the content as HTML.
+    $html = c_reservation_build::s_create_html($http, $database, $session, $settings);
+
 
     // handle any resulting errors.
     $problem_fields = array();
@@ -58,8 +62,15 @@ final class c_reservation_path_user_login extends c_base_path {
       }
       elseif ($login_result instanceof c_base_return_true) {
         // successfully logged in.
+        require_once(self::PATH_REDIRECTS);
+
+        $destination = $settings['uri'];
+        $destination['path'] = $settings['base_path'] . '/u/dashboard';
+
         // note: by using a SEE OTHER redirect, the client knows to make a GET request and that the redirect is temporary.
-        $redirect = c_reservation_path_redirect::s_create_redirect('/u/dashboard', c_base_http_status::SEE_OTHER, FALSE);
+        $redirect = c_reservation_path_redirect::s_create_redirect($destination, c_base_http_status::SEE_OTHER, FALSE);
+        unset($destination);
+
         return $redirect->do_execute($http, $database, $session, $html, $settings);
       }
 
@@ -101,7 +112,7 @@ final class c_reservation_path_user_login extends c_base_path {
 
     // H1
     $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_H1);
-    $tag->set_text('Login to System');
+    $tag->set_text($this->pr_get_text(0));
     $form->set_tag($tag);
     unset($tag);
 
@@ -130,7 +141,7 @@ final class c_reservation_path_user_login extends c_base_path {
     // label: username
     $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_LABEL, NULL, array('login_form-label-username'));
     $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_FOR, 'login_form-username');
-    $tag->set_text('Username');
+    $tag->set_text($this->pr_get_text(1));
     $form->set_tag($tag);
     unset($tag);
 
@@ -155,7 +166,7 @@ final class c_reservation_path_user_login extends c_base_path {
     // label: password
     $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_LABEL, NULL, array('login_form-label-password'));
     $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_FOR, 'login_form-password');
-    $tag->set_text('Password');
+    $tag->set_text($this->pr_get_text(2));
     $form->set_tag($tag);
     unset($tag);
 
@@ -198,9 +209,15 @@ final class c_reservation_path_user_login extends c_base_path {
     $wrapper->set_tag($form);
     unset($form);
 
+
+    // assing the content.
     $html->set_tag($wrapper);
     unset($wrapper);
 
+    $executed = new c_base_path_executed();
+    $executed->set_output($html);
+    unset($html);
+
     return $executed;
   }
 
@@ -415,6 +432,8 @@ final class c_reservation_path_user_login extends c_base_path {
       $pushed = $session->do_push($settings['session_expire'], $settings['session_max']);
       $session->do_disconnect();
 
+      reservation_get_current_roles($database, $session, $settings);
+
       $cookie_login = NULL;
       if (c_base_return::s_has_error($pushed)) {
         $socket_error = $session->get_error_socket();
@@ -459,4 +478,23 @@ final class c_reservation_path_user_login extends c_base_path {
 
     return c_base_return_array::s_new($problems);
   }
+
+  /**
+   * Load text for a supported language.
+   *
+   * @param int $index
+   *   A number representing which block of text to return.
+   */
+  protected function pr_get_text($code) {
+    switch ($code) {
+      case 0:
+        return 'Login to System';
+      case 1:
+        return 'Username';
+      case 2:
+        return 'Password';
+    }
+
+    return '';
+  }
 }
index 7301bb6d1eee88c98269d1eae77cf67543f56ddf..4e165ad45213750e84e3363ae8c77e997349b946 100644 (file)
@@ -16,14 +16,14 @@ require_once('common/theme/classes/theme_html.php');
  *
  * This listens on: /s/u/logout
  */
-final class c_reservation_path_form_user_logout extends c_base_path {
+class c_reservation_path_form_user_logout extends c_base_path {
 
   /**
    * Implements do_execute().
    */
-  public function do_execute(&$http, &$database, &$session, &$html, $settings = array()) {
+  public function do_execute(&$http, &$database, &$session, $settings = array()) {
     // the parent function performs validation on the parameters.
-    $executed = parent::do_execute($http, $database, $session, $html, $settings);
+    $executed = parent::do_execute($http, $database, $session, $settings);
     if (c_base_return::s_has_error($executed)) {
       return $executed;
     }
@@ -35,31 +35,34 @@ final class c_reservation_path_form_user_logout extends c_base_path {
 
     // H1
     $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_H1);
-    $tag->set_text('You Have Logged Out');
+    $tag->set_text($this->pr_get_text(0));
     $wrapper->set_tag($tag);
     unset($tag);
 
     // H1
     $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_DIVIDER);
-    $tag->set_text('You have been logged out of the system.');
+    $tag->set_text($this->pr_get_text(1));
     $wrapper->set_tag($tag);
     unset($tag);
 
+
+    // initialize the content as HTML.
+    $html = c_reservation_build::s_create_html($http, $database, $session, $settings);
     $html->set_tag($wrapper);
     unset($wrapper);
 
+    $executed = new c_base_path_executed();
+    $executed->set_output($html);
+    unset($html);
 
     reservation_session_logout($database, $session, $settings);
 
     return $executed;
   }
 
-
   /**
    * Logout of the session.
    *
-   * @fixme: much of this is just a carbon copy of the login form and needs to be rewritten accordingly.
-   *
    * @param c_base_database &$database
    *   The database object.
    * @param c_base_session &$session
@@ -72,245 +75,22 @@ final class c_reservation_path_form_user_logout extends c_base_path {
    *   An array of problems on failure.
    */
   private function p_do_logout(&$database, &$session, $settings) {
-    // @fixme: below is a copy and paste of the login form, it needs to be replaced with the logout code!
-    $problems = array();
-    if (empty($_POST['login_form-username'])) {
-      $problems[] = c_base_form_problem::s_create_error('login_form-username', 'No valid username has been supplied.');
-    }
-
-    if (empty($_POST['login_form-password'])) {
-      $problems[] = c_base_form_problem::s_create_error('login_form-password', 'No valid password has been supplied.');
-    }
-
-    // explicitly deny access to internal user accounts
-    if ($_POST['login_form-username'] == 'u_reservation_public') {
-      $problems[] = c_base_form_problem::s_create_error('login_form-username', 'Unable to login, an incorrect user name or password has been specified.');
-    }
-
-    // return current list of problems before continuing to login attempt with credentials.
-    if (!empty($problems)) {
-      return c_base_return_array::s_new($problems);
-    }
-
-    $session->set_name($_POST['login_form-username']);
-    $session->set_password($_POST['login_form-password']);
-
-    // the database string must be rebuilt using the new username and password.
-    reservation_database_string($database, $settings, $_POST['login_form-username'], $_POST['login_form-password']);
-
-    $access_denied = FALSE;
-    $error_messages = array();
-    $connected = reservation_database_connect($database);
-    if (c_base_return::s_has_error($connected)) {
-      // try to determine what the warning is.
-      // this is not very accurate/efficient, but scanning the string appears to be the only way to identify the error.
-      $errors = $connected->get_error();
-
-      // @todo: walk through all errors instead of just checking the first.
-      $error = reset($errors);
-      unset($errors);
-
-      $details = $error->get_details();
-      unset($error);
-
-      if (isset($details['arguments'][':failure_reasons'][0]['message'])) {
-        // in the case where the database cannot be connected to, do not attempt to ensure user account.
-        if (preg_match('/could not connect to server: connection refused/i', $details['arguments'][':failure_reasons'][0]['message']) > 0) {
-          // @todo: separate messages for admin users and public users.
-          #foreach ($details['arguments'][':failure_reasons'] as $error_message) {
-          #  $error_messages[] = $error_message;
-          #}
-          #unset($error_message);
-          unset($details);
-
-          $problems[] = c_base_form_problem::s_create_error(NULL, 'Unable to login, cannot connect to the database.');
-          return c_base_return_array::s_new($problems);
-        }
-        elseif (preg_match('/no pg_hba\.conf entry for host/i', $details['arguments'][':failure_reasons'][0]['message']) > 0) {
-          // the account either does note exist or is not authorized.
-          // it is a pity that postgresql doesn't differentiate the two.
-          $access_denied = TRUE;
-        }
-        else {
-          $problems[] = c_base_form_problem::s_create_error(NULL, 'Unable to login, reason: ' . $details['arguments'][':failure_reasons'][0]['message'] . '.');
-          unset($details);
-
-          return c_base_return_array::s_new($problems);
-        }
-      }
-      unset($details);
-
-      if ($access_denied) {
-        // it is possible the user name might not exist, so try to auto-create the username if the username does not exist.
-        $ensure_result = reservation_ensure_user_account($settings, $_POST['login_form-username']);
-        if ($ensure_result instanceof c_base_return_int) {
-          $ensure_result = $ensure_result->get_value_exact();
-
-          $connected = new c_base_return_false();
-          if ($ensure_result === 0) {
-            // try again now that the system has attempted to ensure the user account exists.
-            $connected = reservation_database_connect($database);
-            if ($connected instanceof c_base_return_true) {
-              // @todo: add log entry.
-              #set_log_user($database, 'create_user');
-            }
-          }
-          elseif ($ensure_result === 1) {
-            // invalid user name, bad characters, or name too long.
-          }
-          elseif ($ensure_result === 2) {
-            // failed to connect to the ldap server and could not query the ldap name.
-          }
-          elseif ($ensure_result === 3) {
-            // user name not found in ldap database.
-          }
-          elseif ($ensure_result === 4) {
-            //    4 = failed to connect to the database.
-          }
-          elseif ($ensure_result === 5) {
-            //    5 = error returned while executing the SQL command.
-          }
-          elseif ($ensure_result === 6) {
-            //    6 = error occured while reading input from the user (such as via recv()).
-          }
-          elseif ($ensure_result === 7) {
-            //    7 = error occured while writing input from the user (such as via send()).
-          }
-          elseif ($ensure_result === 8) {
-            //    8 = the received packet is invalid, such as wrong length.
-          }
-          elseif ($ensure_result === 9) {
-            //   10 = connection timed out when reading or writing.
-          }
-          elseif ($ensure_result === 10) {
-            //   10 = the connection is being forced closed.
-          }
-          elseif ($ensure_result === 11) {
-            //   11 = the connection is closing because the service is quitting.
-          }
-        }
-        unset($ensure_result);
-      }
-    }
-
-    if (c_base_return::s_has_error($connected) || $connected instanceof c_base_return_false) {
-      // @todo: rewrite this function to handle multiple errors.
-      if ($access_denied) {
-        $problems[] = c_base_form_problem::s_create_error('login_form-username', 'Unable to login, an incorrect user or password has been specified.');
-      }
-      else {
-        $errors = $connected->get_error();
-
-        $error = reset($errors);
-        unset($errors);
-
-        $details = $error->get_details();
-        unset($error);
-
-        // @todo: not just database errors, but also session create errors need to be checked.
-        if (isset($details['arguments'][':failure_reasons'][0]['message']) && is_string($details['arguments'][':failure_reasons'][0]['message'])) {
-          $problems[] = c_base_form_problem::s_create_error(NULL, 'Unable to login, ' . $details['arguments'][':failure_reasons'][0]['message']);
-        }
-        else {
-          // here the reason for failure is unknown.
-          $problems[] = c_base_form_problem::s_create_error(NULL, 'Unable to login,');
-        }
-        unset($details);
-      }
-
-      unset($access_denied);
-      unset($connected);
-
-      if (empty($problems)) {
-        unset($problems);
-        return new c_base_return_false();
-      }
-
-      return c_base_return_array::s_new($problems);
-    }
-    unset($access_denied);
-
-    // @todo: add log entry.
-    #set_log_user($database, 'login');
-
-    // @todo: load and store custom settings (loaded from the database and/or ldap).
-    #$session->set_settings($user_data);
-
-    // the session needs to be opened and the data needs to be saved on successful login.
-    $result = $session->do_connect();
-    if (c_base_return::s_has_error($result)) {
-      $socket_error = $session->get_error_socket();
-      if ($socket_error instanceof c_base_return_int) {
-        $problems[] = c_base_form_problem::s_create_error(NULL, 'Failed to load session, due to socket error (' . $socket_error->get_value_exact() . '): ' . @socket_strerror($socket_error->get_value_exact()) . '.');
-      }
-      else {
-        $problems[] = c_base_form_problem::s_create_error(NULL, 'Failed to load session.');
-      }
-      unset($socket_error);
-    }
-    else {
-      $ldap = reservation_database_load_ldap_data($settings, $_POST['login_form-username'])->get_value();
-      if ($ldap instanceof c_base_return_false || !is_array($ldap)) {
-        $ldap = array(
-          'data' => NULL,
-        );
-      }
-
-      if (isset($ldap['status']) && $ldap['status'] instanceof c_base_return_false) {
-        $problems[] = c_base_form_problem::s_create_error('login_form-username', 'Failed to retrieve ldap information for specified user.');
-
-        // @todo: handle error situation.
-      }
-
-      $user_data = reservation_database_get_user_data($database, $_POST['login_form-username'], $ldap['data'])->get_value();
-
-      // @todo: get and use user id from $user_data.
-
-      $pushed = $session->do_push($settings['session_expire'], $settings['session_max']);
-      $session->do_disconnect();
-
-      $cookie_login = NULL;
-      if (c_base_return::s_has_error($pushed)) {
-        $socket_error = $session->get_error_socket();
-        if ($socket_error instanceof c_base_return_int) {
-          $problems = c_base_form_problem::s_create_error(NULL, 'Failed to push session, due to socket error (' . $socket_error->get_value_exact() . '): ' . @socket_strerror($socket_error->get_value_exact()) . '.');
-        }
-        else {
-          $problems[] = c_base_form_problem::s_create_error(NULL, 'Failed to push session.');
-        }
-        unset($socket_error);
-      }
-      else {
-        $session_expire = $session->get_timeout_expire()->get_value_exact();
-        $cookie_login = $session->get_cookie();
-      }
-
-      if ($cookie_login instanceof c_base_cookie) {
-        $cookie_login->set_expires($session_expire);
-        $cookie_login->set_max_age(NULL);
-
-        if ($pushed instanceof c_base_return_true) {
-          $data = array(
-            'session_id' => $session->get_session_id()->get_value_exact(),
-            'expire' => gmdate("D, d-M-Y H:i:s T", $session_expire), // unnecessary, but provided for debug purposes.
-          );
-
-          $cookie_login->set_value($data);
-          $session->set_cookie($cookie_login);
-        }
-      }
-      unset($cookie_login);
-      unset($session_expire);
-      unset($pushed);
-    }
-    unset($result);
-    unset($connected);
+  }
 
-    if (empty($problems)) {
-      unset($problems);
-      return new c_base_return_true();
+  /**
+   * Load text for a supported language.
+   *
+   * @param int $index
+   *   A number representing which block of text to return.
+   */
+  protected function pr_get_text($code) {
+    switch ($code) {
+      case 0:
+        return 'You Have Logged Out';
+      case 1:
+        return 'You have been logged out of the system.';
     }
 
-    return c_base_return_array::s_new($problems);
+    return '';
   }
 }
diff --git a/program/reservation/reservation_build.php b/program/reservation/reservation_build.php
new file mode 100644 (file)
index 0000000..7a8e855
--- /dev/null
@@ -0,0 +1,200 @@
+<?php
+/**
+ * @file
+ * Provides reservation build functions beyond what is found in index.php.
+ */
+require_once('common/base/classes/base_error.php');
+require_once('common/base/classes/base_return.php');
+require_once('common/base/classes/base_html.php');
+
+require_once('common/theme/classes/theme_html.php');
+
+class c_reservation_build {
+  /**
+   * Create a new HTML markup class with default settings populated.
+   *
+   * @param c_base_http &$http
+   *   Http object.
+   * @param c_base_database &$databbase
+   *   The database object.
+   * @param c_base_session &$session
+   *   Session information.
+   * @param array $settings
+   *   System settings
+   * @param string|null $title
+   *   (optional) A string to be used as the page title header.
+   *   Set to NULL to use default language.
+   *
+   * @return c_base_html
+   *   The generated html is returned on success.
+   *   The generated html with error bit set is returned on error.
+   */
+  public static function s_create_html(&$http, &$database, &$session, $settings, $title = NULL) {
+    if (!is_string($title)) {
+      $title = NULL;
+    }
+
+    $html = new c_base_html();
+
+    // assign class attribute
+    $class = array(
+      'reservation',
+      'no-script',
+      'is-html5',
+    );
+
+    $html->set_attribute(c_base_markup_attributes::ATTRIBUTE_CLASS, $class);
+    unset($class);
+
+
+    // assign id attribute
+    $html->set_attribute(c_base_markup_attributes::ATTRIBUTE_ID, 'reservation-system');
+
+
+    // assign default language attribute.
+    $html->set_attribute(c_base_markup_attributes::ATTRIBUTE_LANGUAGE, i_base_language::ENGLISH_US);
+
+
+    // assign default direction attribute
+    $html->set_attribute(c_base_markup_attributes::ATTRIBUTE_DIRECTION, 'ltr');
+
+
+    // assign title header tag (setting title tag at delta 0 so that it can easily be overriden as needed).
+    $tag = new c_base_markup_tag();
+    $tag->set_type(c_base_markup_tag::TYPE_TITLE);
+
+    if (is_string($title)) {
+      $tag->set_text($title);
+    }
+    else {
+      $tag->set_text('Reservation System');
+    }
+
+    $html->set_header($tag, 0);
+    unset($tag);
+
+
+    // assign base header tag
+    if (isset($settings['base_path']) && is_string($settings['base_path']) && mb_strlen($settings['base_scheme']) > 0) {
+      $href = '';
+      if (isset($settings['base_scheme']) && is_string($settings['base_scheme']) && mb_strlen($settings['base_scheme']) > 0) {
+        if (isset($settings['base_host']) && is_string($settings['base_host']) && mb_strlen($settings['base_host']) > 0) {
+          $href .= $settings['base_scheme'] . '://' . $settings['base_host'];
+        }
+      }
+
+      $href .= $settings['base_path'];
+
+      $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_BASE);
+      $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_HREF, $href);
+      $html->set_header($tag);
+      unset($tag);
+      unset($href);
+    }
+
+
+    // assign http-equiv header tag
+    $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
+    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_HTTP_EQUIV, 'Content-Type');
+    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_CONTENT, 'text/html; charset=utf-8');
+    $html->set_header($tag);
+    unset($tag);
+
+
+    // assign charset header tag
+    $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
+    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_CHARACTER_SET, c_base_charset::UTF_8);
+    $html->set_header($tag);
+    unset($tag);
+
+
+    // assign canonical header tag
+    #$tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
+    #$tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_REL, 'canonical');
+    #$tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_HREF, 'http://localhost/');
+    #$html->set_header($tag);
+    #unset($tag);
+
+
+    // assign shortlink header tag
+    #$tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
+    #$tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_REL, 'shortlink');
+    #$tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_HREF, '/');
+    #$html->set_header($tag);
+    #unset($tag);
+
+
+    // assign description header tag
+    $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
+    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_NAME, 'description');
+    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_CONTENT, 'A reservation/scheduling system.');
+    $html->set_header($tag);
+    unset($tag);
+
+
+    // assign distribution header tag
+    $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
+    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_NAME, 'distribution');
+    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_CONTENT, 'web');
+    $html->set_header($tag);
+    unset($tag);
+
+
+    // assign robots header tag
+    $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
+    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_NAME, 'robots');
+    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_CONTENT, 'INDEX,FOLLOW');
+    $html->set_header($tag);
+    unset($tag);
+
+
+    // assign expires header tag
+    #$tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
+    #$tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_HTTP_EQUIV, 'expires');
+    #$tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_CONTENT, c_base_defaults_global::s_get_date('r', strtotime('+30 minutes'))->get_value_exact());
+    #$html->set_header($tag);
+    #unset($tag);
+
+
+    // assign viewport header tag
+    $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
+    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_NAME, 'viewport');
+    $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_CONTENT, 'width=device-width, initial-scale=1');
+    $html->set_header($tag);
+    unset($tag);
+
+
+    // assign content http-equiv header tag
+    $aliases = array();
+    $languages = $http->get_response_content_language()->get_value_exact();
+    if (is_array($languages) && !empty($languages)) {
+      // assign the primary language.
+      $language_aliases = c_base_defaults_global::s_get_languages()::s_get_aliases_by_id(reset($languages))->get_value_exact();
+      if (is_array($language_aliases) && !empty($language_aliases)) {
+        $html->set_attribute(c_base_markup_attributes::ATTRIBUTE_LANGUAGE, reset($language_aliases));
+      }
+      unset($language_aliases);
+
+      foreach ($languages as $language) {
+        $language_aliases = c_base_defaults_global::s_get_languages()::s_get_aliases_by_id($language)->get_value_exact();
+        if (is_array($language_aliases) && !empty($language_aliases)) {
+          $aliases[] = array_pop($language_aliases);
+        }
+        unset($language_aliases);
+      }
+      unset($language);
+    }
+    unset($languages);
+
+    if (!empty($aliases)) {
+      $tag = c_theme_html::s_create_tag(c_base_markup_tag::TYPE_META);
+      $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_HTTP_EQUIV, 'content-language');
+      $tag->set_attribute(c_base_markup_attributes::ATTRIBUTE_CONTENT, implode(', ', $aliases));
+      $html->set_header($tag);
+      unset($tag);
+    }
+    unset($aliases);
+
+    return $html;
+  }
+}
index 98464430479563898cbb9372a7c201f4a5a635ea..3d325cd09dadae74b855c39c5ed8d1178181f8dd 100644 (file)
  * @file
  * Provides reservation database functions.
  */
-  require_once('common/base/classes/base_error.php');
-  require_once('common/base/classes/base_return.php');
-  require_once('common/base/classes/base_session.php');
-  require_once('common/base/classes/base_database.php');
-  require_once('common/base/classes/base_access.php');
+require_once('common/base/classes/base_error.php');
+require_once('common/base/classes/base_return.php');
+require_once('common/base/classes/base_session.php');
+require_once('common/base/classes/base_database.php');
+require_once('common/base/classes/base_access.php');
 
   /**
  * Build the database connection string.
  *
  * @param c_base_database &$database
  *   The database to connect to.
  * @param array $settings
  *   Custom settings.
  * @param string|null $username
  *   The username string.
  *   If NULL, then the global username is used.
  * @param string|null $password
  *   The password string.
  *   If NULL, then the global password is used.
  *
  * @return c_base_return_status
  *   TRUE on success, FALSE otherwise.
  *   FALSE with error bit set on error.
  */
-  function reservation_database_string(&$database, $settings, $user_name = NULL, $password = NULL) {
-    if (!($database instanceof c_base_database)) {
-      $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'database', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
-    }
+ * Build the database connection string.
+ *
+ * @param c_base_database &$database
+ *   The database to connect to.
+ * @param array $settings
+ *   Custom settings.
+ * @param string|null $username
+ *   The username string.
+ *   If NULL, then the global username is used.
+ * @param string|null $password
+ *   The password string.
+ *   If NULL, then the global password is used.
+ *
+ * @return c_base_return_status
+ *   TRUE on success, FALSE otherwise.
+ *   FALSE with error bit set on error.
+ */
+function reservation_database_string(&$database, $settings, $user_name = NULL, $password = NULL) {
+  if (!($database instanceof c_base_database)) {
+    $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'database', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
+    return c_base_return_error::s_false($error);
+  }
 
-    if (!is_array($settings)) {
-      $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'settings', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
-    }
+  if (!is_array($settings)) {
+    $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'settings', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
+    return c_base_return_error::s_false($error);
+  }
 
-    if (!is_null($user_name) && !is_string($user_name)) {
-      $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'user_name', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
-    }
+  if (!is_null($user_name) && !is_string($user_name)) {
+    $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'user_name', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
+    return c_base_return_error::s_false($error);
+  }
 
-    if (!is_null($password) && !is_string($password)) {
-      $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'password', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
-    }
+  if (!is_null($password) && !is_string($password)) {
+    $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'password', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
+    return c_base_return_error::s_false($error);
+  }
 
-    $connection_string = new c_base_connection_string();
-    $connection_string->set_host($settings['database_host']);
-    $connection_string->set_port($settings['database_port']);
-    $connection_string->set_database($settings['database_name']);
+  $connection_string = new c_base_connection_string();
+  $connection_string->set_host($settings['database_host']);
+  $connection_string->set_port($settings['database_port']);
+  $connection_string->set_database($settings['database_name']);
 
-    if (is_null($user_name)) {
-      $connection_string->set_user($settings['database_user']);
+  if (is_null($user_name)) {
+    $connection_string->set_user($settings['database_user']);
 
-      if (!is_null($settings['database_password'])) {
-        $connection_string->set_password($settings['database_password']);
-      }
+    if (!is_null($settings['database_password'])) {
+      $connection_string->set_password($settings['database_password']);
     }
-    else {
-      $connection_string->set_user($user_name);
+  }
+  else {
+    $connection_string->set_user($user_name);
 
-      if (!is_null($password)) {
-        $connection_string->set_password($password);
-      }
+    if (!is_null($password)) {
+      $connection_string->set_password($password);
     }
+  }
 
-    $connection_string->set_ssl_mode($settings['database_ssl_mode']);
-    $connection_string->set_connect_timeout($settings['database_timeout']);
+  $connection_string->set_ssl_mode($settings['database_ssl_mode']);
+  $connection_string->set_connect_timeout($settings['database_timeout']);
 
-    $database->set_connection_string($connection_string);
-    unset($connection_string);
+  $database->set_connection_string($connection_string);
+  unset($connection_string);
 
-    return new c_base_return_true();
+  return new c_base_return_true();
+}
+
+/**
+ * Connect the database and configure default settings.
+ *
+ * @param c_base_database &$database
+ *   The database to connect to.
+ *
+ * @return c_base_return_status
+ *   TRUE on success, FALSE otherwise.
+ *   FALSE with error bit set on error.
+ */
+function reservation_database_connect(&$database) {
+  if (!($database instanceof c_base_database)) {
+    $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'database', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
+    return c_base_return_error::s_false($error);
   }
 
-  /**
-   * Connect the database and configure default settings.
-   *
-   * @param c_base_database &$database
-   *   The database to connect to.
-   *
-   * @return c_base_return_status
-   *   TRUE on success, FALSE otherwise.
-   *   FALSE with error bit set on error.
-   */
-  function reservation_database_connect(&$database) {
-    if (!($database instanceof c_base_database)) {
-      $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'database', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
-    }
+  $status = $database->do_connect();
+  if (!($status instanceof c_base_return_true)) {
+    return $status;
+  }
+  unset($status);
 
-    $status = $database->do_connect();
-    if (!($status instanceof c_base_return_true)) {
-      return $status;
-    }
-    unset($status);
+  // configure default settings.
+  $database->do_query('set bytea_output to hex;');
+  $database->do_query('set search_path to s_administers,s_managers,s_auditors,s_publishers,s_insurers,s_financers,s_reviewers,s_editors,s_drafters,s_requesters,s_users,public;');
+  $database->do_query('set datestyle to us;');
 
-    // configure default settings.
-    $database->do_query('set bytea_output to hex;');
-    $database->do_query('set search_path to s_administers,s_managers,s_auditors,s_publishers,s_insurers,s_financers,s_reviewers,s_editors,s_drafters,s_requesters,s_users,public;');
-    $database->do_query('set datestyle to us;');
+  return new c_base_return_true();
+}
 
-    return new c_base_return_true();
+/**
+ * Load the user data.
+ *
+ * This is necessary to load and process session data.
+ *
+ * @param c_base_database &$database
+ *   The database to connect to.
+ * @param string $user_name
+ *   The name of the user to load.
+ * @param array|null $ldap_data
+ *   (optional) An array of ldap data (if available).
+ *   This is used to auto-populate user information in the database when an account is auto-created.
+ *
+ * @return c_base_return_array|c_base_return_status
+ *   An array of user data is returned on success.
+ *   FALSE with error bit set on error.
+ */
+function reservation_database_get_user_data(&$database, $user_name, $ldap_data = NULL) {
+  if (!($database instanceof c_base_database)) {
+    $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'database', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
+    return c_base_return_error::s_false($error);
   }
 
-  /**
-   * Load the user data.
-   *
-   * This is necessary to load and process session data.
-   *
-   * @param c_base_database &$database
-   *   The database to connect to.
-   * @param string $user_name
-   *   The name of the user to load.
-   * @param array|null $ldap_data
-   *   (optional) An array of ldap data (if available).
-   *   This is used to auto-populate user information in the database when an account is auto-created.
-   *
-   * @return c_base_return_array|c_base_return_status
-   *   An array of user data is returned on success.
-   *   FALSE with error bit set on error.
-   */
-  function reservation_database_get_user_data(&$database, $user_name, $ldap_data = NULL) {
-    if (!($database instanceof c_base_database)) {
-      $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'database', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
-    }
+  if (!is_string($user_name)) {
+    $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'user_name', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
+    return c_base_return_error::s_false($error);
+  }
 
-    if (!is_string($user_name)) {
-      $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'user_name', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
-    }
+  if (!is_null($ldap_data) && !is_array($ldap_data)) {
+    $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'ldap_data', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
+    return c_base_return_error::s_false($error);
+  }
 
-    if (!is_null($ldap_data) && !is_array($ldap_data)) {
-      $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'ldap_data', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
-    }
+  $parameters = array(
+    $user_name,
+  );
 
-    $parameters = array(
-      $user_name,
-    );
+  $query_result = $database->do_query('select id, id_sort, id_external, name_machine, name_human, address_email, is_administer, is_manager, is_auditor, is_publisher, is_financer, is_reviewer, is_editor, is_drafter, is_requester, is_system, is_public, is_locked, is_private, date_created, date_changed, date_synced, date_locked, settings from v_users_self where id_sort = ascii($1) and name_machine = $1', $parameters);
+  unset($parameters);
 
-    $query_result = $database->do_query('select id, id_sort, id_external, name_machine, name_human, address_email, is_administer, is_manager, is_auditor, is_publisher, is_financer, is_reviewer, is_editor, is_drafter, is_requester, is_system, is_public, is_locked, is_private, date_created, date_changed, date_synced, date_locked, settings from v_users_self where id_sort = ascii($1) and name_machine = $1', $parameters);
-    unset($parameters);
+  if (c_base_return::s_has_error($query_result)) {
+    return reservation_error_get_query('database->do_query(select from v_users_self)', __FUNCTION__, $query_result);
+  }
 
-    if (c_base_return::s_has_error($query_result)) {
-      return reservation_error_get_query('database->do_query(select from v_users_self)', __FUNCTION__, $query_result);
+  if ($query_result instanceof c_base_database_result && $query_result->number_of_rows()->get_value_exact() > 0) {
+    $result = $query_result->fetch_row();
+    unset($query_result);
+
+    if (c_base_return::s_has_error($result)) {
+      return reservation_error_get_query('database->do_query(select from v_users_self)', __FUNCTION__, $result);
     }
 
-    if ($query_result instanceof c_base_database_result && $query_result->number_of_rows()->get_value_exact() > 0) {
-      $result = $query_result->fetch_row();
-      unset($query_result);
+    $result_array = $result->get_value();
+    unset($result);
 
-      if (c_base_return::s_has_error($result)) {
-        return reservation_error_get_query('database->do_query(select from v_users_self)', __FUNCTION__, $result);
-      }
+    if (is_array($result_array) && !empty($result_array)) {
+      $user_data = array();
+      $user_data['id'] = $result_array[0];
+      $user_data['id_sort'] = $result_array[1];
+      $user_data['id_external'] = $result_array[2];
+      $user_data['name_machine'] = $result_array[3];
+      $user_data['name_human'] = $result_array[4];
+      $user_data['address_email'] = $result_array[5];
+      $user_data['is_administer'] = $result_array[6];
+      $user_data['is_manager'] = $result_array[7];
+      $user_data['is_auditor'] = $result_array[8];
+      $user_data['is_publisher'] = $result_array[9];
+      $user_data['is_financer'] = $result_array[10];
+      $user_data['is_reviewer'] = $result_array[11];
+      $user_data['is_editor'] = $result_array[12];
+      $user_data['is_drafter'] = $result_array[13];
+      $user_data['is_requester'] = $result_array[14];
+      $user_data['is_system'] = $result_array[15];
+      $user_data['is_public'] = $result_array[16];
+      $user_data['is_locked'] = $result_array[17];
+      $user_data['is_private'] = $result_array[18];
+      $user_data['date_created'] = $result_array[19];
+      $user_data['date_changed'] = $result_array[20];
+      $user_data['date_synced'] = $result_array[21];
+      $user_data['date_locked'] = $result_array[22];
+      $user_data['settings'] = json_decode($result_array[23], TRUE);
 
-      $result_array = $result->get_value();
-      unset($result);
-
-      if (is_array($result_array) && !empty($result_array)) {
-        $user_data = array();
-        $user_data['id'] = $result_array[0];
-        $user_data['id_sort'] = $result_array[1];
-        $user_data['id_external'] = $result_array[2];
-        $user_data['name_machine'] = $result_array[3];
-        $user_data['name_human'] = $result_array[4];
-        $user_data['address_email'] = $result_array[5];
-        $user_data['is_administer'] = $result_array[6];
-        $user_data['is_manager'] = $result_array[7];
-        $user_data['is_auditor'] = $result_array[8];
-        $user_data['is_publisher'] = $result_array[9];
-        $user_data['is_financer'] = $result_array[10];
-        $user_data['is_reviewer'] = $result_array[11];
-        $user_data['is_editor'] = $result_array[12];
-        $user_data['is_drafter'] = $result_array[13];
-        $user_data['is_requester'] = $result_array[14];
-        $user_data['is_system'] = $result_array[15];
-        $user_data['is_public'] = $result_array[16];
-        $user_data['is_locked'] = $result_array[17];
-        $user_data['is_private'] = $result_array[18];
-        $user_data['date_created'] = $result_array[19];
-        $user_data['date_changed'] = $result_array[20];
-        $user_data['date_synced'] = $result_array[21];
-        $user_data['date_locked'] = $result_array[22];
-        $user_data['settings'] = json_decode($result_array[23], TRUE);
-
-        unset($result_array);
-        return c_base_return_array::s_new($user_data);
-      }
       unset($result_array);
+      return c_base_return_array::s_new($user_data);
     }
-    unset($query_result);
+    unset($result_array);
+  }
+  unset($query_result);
 
-    // at this ppint the user account likely does not exist in the database, so create it using any ldap information if available.
-    if (is_null($ldap_data)) {
-      $query_result = $database->do_query('insert into v_users_self_insert (name_human.first) values (null)');
+  // at this ppint the user account likely does not exist in the database, so create it using any ldap information if available.
+  if (is_null($ldap_data)) {
+    $query_result = $database->do_query('insert into v_users_self_insert (name_human.first) values (null)');
 
-      if (c_base_return::s_has_error($query_result)) {
-        return reservation_error_get_query('database->do_query(insert into v_users_self_insert)', __FUNCTION__, $query_result);
-      }
-    }
-    else {
-      $email = explode('@', $ldap_data['mail']);
-      $parameters = array(
-        $ldap_data['givenname'],
-        $ldap_data['sn'],
-        $ldap_data['cn'],
-        $email[0],
-        $email[1],
-        $ldap_data['employeenumber'],
-      );
-
-      $query_result = $database->do_query('insert into v_users_self_insert (name_human.first, name_human.last, name_human.complete, address_email, id_external) values ($1, $2, $3, ($4, $5, TRUE), $6)', $parameters);
-
-      if (c_base_return::s_has_error($query_result)) {
-        return reservation_error_get_query('database->do_query(insert into v_users_self_insert)', __FUNCTION__, $query_result);
-      }
+    if (c_base_return::s_has_error($query_result)) {
+      return reservation_error_get_query('database->do_query(insert into v_users_self_insert)', __FUNCTION__, $query_result);
     }
-    unset($query_result);
-
-
-    // try loading the user information again now that the user information exists in the database.
+  }
+  else {
+    $email = explode('@', $ldap_data['mail']);
     $parameters = array(
-      $user_name,
+      $ldap_data['givenname'],
+      $ldap_data['sn'],
+      $ldap_data['cn'],
+      $email[0],
+      $email[1],
+      $ldap_data['employeenumber'],
     );
 
-    $query_result = $database->do_query('select id, id_sort, id_external, name_machine, name_human, address_email, is_administer, is_manager, is_auditor, is_publisher, is_financer, is_reviewer, is_editor, is_drafter, is_requester, is_system, is_public, is_locked, is_private, date_created, date_changed, date_synced, date_locked, settings from v_users_self where id_sort = ascii($1) and name_machine = $1', $parameters);
-    unset($parameters);
+    $query_result = $database->do_query('insert into v_users_self_insert (name_human.first, name_human.last, name_human.complete, address_email, id_external) values ($1, $2, $3, ($4, $5, TRUE), $6)', $parameters);
 
     if (c_base_return::s_has_error($query_result)) {
-      return reservation_error_get_query('database->do_query(select from v_users_self)', __FUNCTION__, $query_result);
+      return reservation_error_get_query('database->do_query(insert into v_users_self_insert)', __FUNCTION__, $query_result);
     }
+  }
+  unset($query_result);
 
-    if ($query_result instanceof c_base_database_result && $query_result->number_of_rows()->get_value_exact() > 0) {
-      $result = $query_result->fetch_row();
-      unset($query_result);
 
-      if (c_base_return::s_has_error($result)) {
-        return reservation_error_get_query('database->do_query(select from v_users_self)', __FUNCTION__, $result);
-      }
+  // try loading the user information again now that the user information exists in the database.
+  $parameters = array(
+    $user_name,
+  );
 
-      $result_array = $result->get_value();
-      unset($result);
-
-      if (is_array($result_array) && !empty($result_array)) {
-        $user_data = array();
-        $user_data['id'] = $result_array[0];
-        $user_data['id_sort'] = $result_array[1];
-        $user_data['id_external'] = $result_array[2];
-        $user_data['name_machine'] = $result_array[3];
-        $user_data['name_human'] = $result_array[4];
-        $user_data['address_email'] = $result_array[5];
-        $user_data['is_administer'] = $result_array[6];
-        $user_data['is_manager'] = $result_array[7];
-        $user_data['is_auditor'] = $result_array[8];
-        $user_data['is_publisher'] = $result_array[9];
-        $user_data['is_financer'] = $result_array[10];
-        $user_data['is_reviewer'] = $result_array[11];
-        $user_data['is_editor'] = $result_array[12];
-        $user_data['is_drafter'] = $result_array[13];
-        $user_data['is_requester'] = $result_array[14];
-        $user_data['is_system'] = $result_array[15];
-        $user_data['is_public'] = $result_array[16];
-        $user_data['is_locked'] = $result_array[17];
-        $user_data['is_private'] = $result_array[18];
-        $user_data['date_created'] = $result_array[19];
-        $user_data['date_changed'] = $result_array[20];
-        $user_data['date_synced'] = $result_array[21];
-        $user_data['date_locked'] = $result_array[22];
-        $user_data['settings'] = json_decode($result_array[23], TRUE);
-
-        unset($result_array);
-        return c_base_return_array::s_new($user_data);
-      }
-      unset($result_array);
-    }
-    unset($query_result);
+  $query_result = $database->do_query('select id, id_sort, id_external, name_machine, name_human, address_email, is_administer, is_manager, is_auditor, is_publisher, is_financer, is_reviewer, is_editor, is_drafter, is_requester, is_system, is_public, is_locked, is_private, date_created, date_changed, date_synced, date_locked, settings from v_users_self where id_sort = ascii($1) and name_machine = $1', $parameters);
+  unset($parameters);
 
-
-    return c_base_return_array::s_new(array());
+  if (c_base_return::s_has_error($query_result)) {
+    return reservation_error_get_query('database->do_query(select from v_users_self)', __FUNCTION__, $query_result);
   }
 
-  /**
-   * Loads LDAP information for the given user (if available).
-   *
-   * @param array $settings
-   *   System settings array.
-   * @param string $user_name
-   *   The user name to load
-   *
-   * @return c_base_return_array|c_base_return_status
-   *   An array of ldap data associated with the given user.
-   *   This array may contain error information if there were connection problems to the ldap database.
-   *   The array structure is:
-   *     'title': a Title for any error that occured.
-   *     'message': The detailed ldap error message.
-   *     'status': c_base_return_true if there were no problems and c_base_return_false if there were problems.
-   *     'data': Any ldap data found for the given user name.
-   *   FALSE with the error bit set is returned on error.
-   */
-  function reservation_database_load_ldap_data($settings, $user_name) {
-    if (!is_array($settings)) {
-      $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'settings', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
-    }
+  if ($query_result instanceof c_base_database_result && $query_result->number_of_rows()->get_value_exact() > 0) {
+    $result = $query_result->fetch_row();
+    unset($query_result);
 
-    if (!is_string($user_name)) {
-      $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'user_name', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_false($error);
+    if (c_base_return::s_has_error($result)) {
+      return reservation_error_get_query('database->do_query(select from v_users_self)', __FUNCTION__, $result);
     }
 
-    $return_data = array(
-      'title' => NULL,
-      'message' => NULL,
-      'status' => new c_base_return_true(),
-      'data' => NULL,
-    );
-
-    $ldap = new c_base_ldap();
-    $ldap->set_name($settings['ldap_server']);
-    #$ldap->set_bind_name('');
-    #$ldap->set_bind_password('');
-    $connected = $ldap->do_connect();
-    if (c_base_return::s_has_error($connected)) {
-      $message = $ldap->get_error_message();
+    $result_array = $result->get_value();
+    unset($result);
 
-      $return_data['title'] = 'Connection Failed';
-      $return_data['message'] = $message->get_value_exact();
-      $return_data['status'] = new c_base_return_false();
-      unset($message);
+    if (is_array($result_array) && !empty($result_array)) {
+      $user_data = array();
+      $user_data['id'] = $result_array[0];
+      $user_data['id_sort'] = $result_array[1];
+      $user_data['id_external'] = $result_array[2];
+      $user_data['name_machine'] = $result_array[3];
+      $user_data['name_human'] = $result_array[4];
+      $user_data['address_email'] = $result_array[5];
+      $user_data['is_administer'] = $result_array[6];
+      $user_data['is_manager'] = $result_array[7];
+      $user_data['is_auditor'] = $result_array[8];
+      $user_data['is_publisher'] = $result_array[9];
+      $user_data['is_financer'] = $result_array[10];
+      $user_data['is_reviewer'] = $result_array[11];
+      $user_data['is_editor'] = $result_array[12];
+      $user_data['is_drafter'] = $result_array[13];
+      $user_data['is_requester'] = $result_array[14];
+      $user_data['is_system'] = $result_array[15];
+      $user_data['is_public'] = $result_array[16];
+      $user_data['is_locked'] = $result_array[17];
+      $user_data['is_private'] = $result_array[18];
+      $user_data['date_created'] = $result_array[19];
+      $user_data['date_changed'] = $result_array[20];
+      $user_data['date_synced'] = $result_array[21];
+      $user_data['date_locked'] = $result_array[22];
+      $user_data['settings'] = json_decode($result_array[23], TRUE);
 
-      return c_base_return_array::s_new($return_data);
+      unset($result_array);
+      return c_base_return_array::s_new($user_data);
     }
+    unset($result_array);
+  }
+  unset($query_result);
 
-    $read = $ldap->do_search($settings['ldap_base_dn'], '(uid=' . $user_name . ')', $settings['ldap_fields']);
-    if (c_base_return::s_has_error($read)) {
-      $message = $ldap->get_error_message();
 
-      $return_data['title'] = 'Search Failed';
-      $return_data['message'] = $message->get_value_exact();
-      $return_data['status'] = new c_base_return_false();
-      unset($message);
+  return c_base_return_array::s_new(array());
+}
 
-      $ldap->do_disconnect();
+/**
+ * Loads LDAP information for the given user (if available).
+ *
+ * @param array $settings
+ *   System settings array.
+ * @param string $user_name
+ *   The user name to load
+ *
+ * @return c_base_return_array|c_base_return_status
+ *   An array of ldap data associated with the given user.
+ *   This array may contain error information if there were connection problems to the ldap database.
+ *   The array structure is:
+ *     'title': a Title for any error that occured.
+ *     'message': The detailed ldap error message.
+ *     'status': c_base_return_true if there were no problems and c_base_return_false if there were problems.
+ *     'data': Any ldap data found for the given user name.
+ *   FALSE with the error bit set is returned on error.
+ */
+function reservation_database_load_ldap_data($settings, $user_name) {
+  if (!is_array($settings)) {
+    $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'settings', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
+    return c_base_return_error::s_false($error);
+  }
 
-      return c_base_return_array::s_new($return_data);
-    }
+  if (!is_string($user_name)) {
+    $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'user_name', ':function_name' => __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
+    return c_base_return_error::s_false($error);
+  }
 
-    $entries = $read->get_entry_all();
-    if ($entries instanceof c_base_return_array) {
-      $entries = $entries->get_value();
-    }
-    else {
-      $entries = array();
-    }
+  $return_data = array(
+    'title' => NULL,
+    'message' => NULL,
+    'status' => new c_base_return_true(),
+    'data' => NULL,
+  );
+
+  $ldap = new c_base_ldap();
+  $ldap->set_name($settings['ldap_server']);
+  #$ldap->set_bind_name('');
+  #$ldap->set_bind_password('');
+  $connected = $ldap->do_connect();
+  if (c_base_return::s_has_error($connected)) {
+    $message = $ldap->get_error_message();
+
+    $return_data['title'] = 'Connection Failed';
+    $return_data['message'] = $message->get_value_exact();
+    $return_data['status'] = new c_base_return_false();
+    unset($message);
 
-    if ($entries['count'] > 0) {
-      $return_data['data'] = array(
-        'uid' => $user_name,
-      );
+    return c_base_return_array::s_new($return_data);
+  }
 
-      foreach ($settings['ldap_fields'] as $ldap_field) {
-        $return_data['data'][$ldap_field] = $entries[0][$ldap_field][0];
-      }
-      unset($ldap_field);
-    }
-    else {
-      $return_data['title'] = 'Username Not Found';
-      $return_data['message'] = 'The user \'' . $user_name . '\' was not found.';
-      $return_data['status'] = new c_base_return_false();
-    }
-    unset($entries);
+  $read = $ldap->do_search($settings['ldap_base_dn'], '(uid=' . $user_name . ')', $settings['ldap_fields']);
+  if (c_base_return::s_has_error($read)) {
+    $message = $ldap->get_error_message();
+
+    $return_data['title'] = 'Search Failed';
+    $return_data['message'] = $message->get_value_exact();
+    $return_data['status'] = new c_base_return_false();
+    unset($message);
+
+    $ldap->do_disconnect();
 
     return c_base_return_array::s_new($return_data);
   }
 
-  /**
-   * Get all roles assigned to the current user.
-   *
-   * @todo: this might be unecessary as it may be automated via the user view table and sql triggers.
-   * @todo: review and update or delete this function as necessary.
-   *
-   * @param c_base_database &$database
-   *   The database object.
-   * @param array &$settings
-   *   The system settings array.
-   * @param c_base_session &$session
-   *   The current session.
-   *
-   * @return c_base_return_status
-   *   TRUE on success, FALSE otherwise.
-   *   FALSE with error bit set is returned on error.
-   */
-  function reservation_get_current_roles($database, $settings, &$session) {
-    $connected = $database->is_connected();
-    if ($connected instanceof c_base_return_false) {
-      $connected = reservation_database_connect($database);
+  $entries = $read->get_entry_all();
+  if ($entries instanceof c_base_return_array) {
+    $entries = $entries->get_value();
+  }
+  else {
+    $entries = array();
+  }
+
+  if ($entries['count'] > 0) {
+    $return_data['data'] = array(
+      'uid' => $user_name,
+    );
+
+    foreach ($settings['ldap_fields'] as $ldap_field) {
+      $return_data['data'][$ldap_field] = $entries[0][$ldap_field][0];
     }
+    unset($ldap_field);
+  }
+  else {
+    $return_data['title'] = 'Username Not Found';
+    $return_data['message'] = 'The user \'' . $user_name . '\' was not found.';
+    $return_data['status'] = new c_base_return_false();
+  }
+  unset($entries);
 
-    $roles = new c_base_roles();
+  return c_base_return_array::s_new($return_data);
+}
 
+/**
+ * Get all roles assigned to the current user.
+ *
+ * @todo: this might be unecessary as it may be automated via the user view table and sql triggers.
+ * @todo: review and update or delete this function as necessary.
+ *
+ * @param c_base_database &$database
+ *   The database object.
+ * @param c_base_session &$session
+ *   The current session.
+ * @param array $settings
+ *   The system settings array.
+ *
+ * @return c_base_return_status
+ *   TRUE on success, FALSE otherwise.
+ *   FALSE with error bit set is returned on error.
+ */
+function reservation_get_current_roles(&$database, &$session, $settings) {
+  $pre_connected = TRUE;
+  $connected = $database->is_connected();
+  if ($connected instanceof c_base_return_false) {
+    $pre_connected = FALSE;
+    $connected = reservation_database_connect($database);
+  }
 
-    // if there is no session, then assume that this is a public account.
-    if (empty($session->get_session_id()->get_value_exact())) {
-      $roles->set_role(c_base_roles::PUBLIC, TRUE);
-      $session->set_setting('roles', $roles);
-      unset($roles);
+  $roles = new c_base_roles();
 
-      return new c_base_return_true();
-    }
 
+  // if there is no session, then assume that this is a public account.
+  if (empty($session->get_session_id()->get_value_exact())) {
+    unset($pre_connected);
 
-    // if unable to connect to database to retrieve other roles, just return the ppublic role.
-    if ($connected instanceof c_base_return_false) {
-      $roles->set_role(c_base_roles::PUBLIC, TRUE);
-      $session->set_setting('roles', $roles);
-      unset($roles);
+    $roles->set_role(c_base_roles::PUBLIC, TRUE);
+    $session->set_setting('roles', $roles);
+    unset($roles);
 
-      $connection_string = $database->get_connection_string();
-      $database_name = ($connection_string instanceof c_base_connection_string) ? $connection_string->get_database()->get_value_exact() : '';
-      unset($connection_string);
+    return new c_base_return_true();
+  }
 
-      $error = c_base_error::s_log(NULL, array('arguments' => array(':database_name' => $database_name, ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::POSTGRESQL_NO_CONNECTION);
-      unset($database_name);
 
-      return c_base_return_error::s_false($error);
-    }
-    unset($connected);
-
-
-    // assign default roles.
-    $roles->set_role(c_base_roles::PUBLIC, FALSE);
-    $roles->set_role(c_base_roles::USER, TRUE);
-
-
-    // load all postgresql roles.
-    $result = $database->do_query('SELECT role_name FROM information_schema.enabled_roles');
-    if ($result instanceof c_base_database_result) {
-      $rows = $result->fetch_all()->get_value_exact();
-
-      foreach ($rows as $row) {
-        if (!array_key_exists('role_name', $row)) {
-          continue;
-        }
-
-        switch ($row['role_name']) {
-          case $settings['database_name'] . '_requester':
-            $roles->set_role(c_base_roles::REQUESTER, TRUE);
-            break;
-          case $settings['database_name'] . '_drafter':
-            $roles->set_role(c_base_roles::DRAFTER, TRUE);
-            break;
-          case $settings['database_name'] . '_editor':
-            $roles->set_role(c_base_roles::EDITOR, TRUE);
-            break;
-          case $settings['database_name'] . '_reviewer':
-            $roles->set_role(c_base_roles::REVIEWER, TRUE);
-            break;
-          case $settings['database_name'] . '_financer':
-            $roles->set_role(c_base_roles::FINANCER, TRUE);
-            break;
-          case $settings['database_name'] . '_insurer':
-            $roles->set_role(c_base_roles::INSURER, TRUE);
-            break;
-          case $settings['database_name'] . '_publisher':
-            $roles->set_role(c_base_roles::PUBLISHER, TRUE);
-            break;
-          case $settings['database_name'] . '_auditor':
-            $roles->set_role(c_base_roles::AUDITOR, TRUE);
-            break;
-          case $settings['database_name'] . '_manager':
-            $roles->set_role(c_base_roles::MANAGER, TRUE);
-            break;
-          case $settings['database_name'] . '_administer':
-            $roles->set_role(c_base_roles::ADMINISTER, TRUE);
-            break;
-        }
-      }
-      unset($row);
-      unset($rows);
-    }
-    unset($result);
+  // if unable to connect to database to retrieve other roles, just return the ppublic role.
+  if ($connected instanceof c_base_return_false) {
+    unset($pre_connected);
 
+    $roles->set_role(c_base_roles::PUBLIC, TRUE);
     $session->set_setting('roles', $roles);
     unset($roles);
 
-    return new c_base_return_true();
+    $connection_string = $database->get_connection_string();
+    $database_name = ($connection_string instanceof c_base_connection_string) ? $connection_string->get_database()->get_value_exact() : '';
+    unset($connection_string);
+
+    $error = c_base_error::s_log(NULL, array('arguments' => array(':database_name' => $database_name, ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::POSTGRESQL_NO_CONNECTION);
+    unset($database_name);
+
+    return c_base_return_error::s_false($error);
   }
+  unset($connected);
 
-  /**
-   * Builds a return object for a query.
-   *
-   * This functions is provided to simplify the return of specific code.
-   * Error handling is not performed, instead simple failsafes are used.
-   *
-   * @param string $operation_name
-   *   The name of the operation, which is generally something like: database->do_query.
-   * @param string $function_name
-   *   The name of the function.
-   *   The caller should usually use __FUNCTION__ here.
-   * @param c_base_return $result
-   *   The query return result.
-   *
-   * @return c_base_error
-   *   A generated oepration failure error.
-   */
-  function reservation_error_get_query($operation_name, $function_name, $result) {
-    if (!is_string($operation_name)) {
-      $operation_name = '';
-    }
 
-    if (!is_string($function_name)) {
-      $function_name = '';
-    }
+  // assign default roles.
+  $roles->set_role(c_base_roles::PUBLIC, FALSE);
+  $roles->set_role(c_base_roles::USER, TRUE);
+
+
+  // load all postgresql roles.
+  $result = $database->do_query('SELECT role_name FROM information_schema.enabled_roles');
+  if ($result instanceof c_base_database_result) {
+    $rows = $result->fetch_all()->get_value_exact();
+
+    foreach ($rows as $row) {
+      if (!array_key_exists('role_name', $row)) {
+        continue;
+      }
 
-    $failure = new c_base_return_false();
-    $found_errors = FALSE;
-    if ($result instanceof c_base_return) {
-      $errors = $result->get_error();
-      if (is_array($errors)) {
-        $found_errors = TRUE;
-
-        foreach ($errors as $error) {
-          $failure->set_error($error);
-        }
-        unset($error);
+      switch ($row['role_name']) {
+        case 'r_' . $settings['database_name'] . '_requester':
+          $roles->set_role(c_base_roles::REQUESTER, TRUE);
+          break;
+        case 'r_' . $settings['database_name'] . '_drafter':
+          $roles->set_role(c_base_roles::DRAFTER, TRUE);
+          break;
+        case 'r_' . $settings['database_name'] . '_editor':
+          $roles->set_role(c_base_roles::EDITOR, TRUE);
+          break;
+        case 'r_' . $settings['database_name'] . '_reviewer':
+          $roles->set_role(c_base_roles::REVIEWER, TRUE);
+          break;
+        case 'r_' . $settings['database_name'] . '_financer':
+          $roles->set_role(c_base_roles::FINANCER, TRUE);
+          break;
+        case 'r_' . $settings['database_name'] . '_insurer':
+          $roles->set_role(c_base_roles::INSURER, TRUE);
+          break;
+        case 'r_' . $settings['database_name'] . '_publisher':
+          $roles->set_role(c_base_roles::PUBLISHER, TRUE);
+          break;
+        case 'r_' . $settings['database_name'] . '_auditor':
+          $roles->set_role(c_base_roles::AUDITOR, TRUE);
+          break;
+        case 'r_' . $settings['database_name'] . '_manager':
+          $roles->set_role(c_base_roles::MANAGER, TRUE);
+          break;
+        case 'r_' . $settings['database_name'] . '_administer':
+          $roles->set_role(c_base_roles::ADMINISTER, TRUE);
+          break;
       }
-      unset($errors);
     }
+    unset($row);
+    unset($rows);
+  }
+  unset($result);
+
+  if (!$pre_connected) {
+    $database->do_disconnect();
+  }
+  unset($pre_connected);
+
+  $session->set_setting('roles', $roles);
+  unset($roles);
 
-    if (!$found_errors) {
-      $error = c_base_error::s_log(NULL, array('arguments' => array(':operation_name' => $operation_name, ':function_name' => $function_name)), i_base_error_messages::OPERATION_FAILURE);
-      $failure->set_error($error);
+  return new c_base_return_true();
+}
+
+/**
+ * Builds a return object for a query.
+ *
+ * This functions is provided to simplify the return of specific code.
+ * Error handling is not performed, instead simple failsafes are used.
+ *
+ * @param string $operation_name
+ *   The name of the operation, which is generally something like: database->do_query.
+ * @param string $function_name
+ *   The name of the function.
+ *   The caller should usually use __FUNCTION__ here.
+ * @param c_base_return $result
+ *   The query return result.
+ *
+ * @return c_base_error
+ *   A generated oepration failure error.
+ */
+function reservation_error_get_query($operation_name, $function_name, $result) {
+  if (!is_string($operation_name)) {
+    $operation_name = '';
+  }
+
+  if (!is_string($function_name)) {
+    $function_name = '';
+  }
+
+  $failure = new c_base_return_false();
+  $found_errors = FALSE;
+  if ($result instanceof c_base_return) {
+    $errors = $result->get_error();
+    if (is_array($errors)) {
+      $found_errors = TRUE;
+
+      foreach ($errors as $error) {
+        $failure->set_error($error);
+      }
       unset($error);
     }
-    unset($found_errors);
+    unset($errors);
+  }
 
-    return $failure;
+  if (!$found_errors) {
+    $error = c_base_error::s_log(NULL, array('arguments' => array(':operation_name' => $operation_name, ':function_name' => $function_name)), i_base_error_messages::OPERATION_FAILURE);
+    $failure->set_error($error);
+    unset($error);
   }
+  unset($found_errors);
+
+  return $failure;
+}
index c9d8021c0b15e8ecdea838c155cfe752507aef95..5ce5ee87ecd8b5face27c4fafe9c2418afcb79e2 100644 (file)
@@ -3,30 +3,41 @@
  * @file
  * Provides reservation session functions.
  */
-  require_once('common/base/classes/base_error.php');
-  require_once('common/base/classes/base_return.php');
-  require_once('common/base/classes/base_markup.php');
-  require_once('common/base/classes/base_html.php');
-  require_once('common/base/classes/base_charset.php');
-  require_once('common/base/classes/base_ascii.php');
-  require_once('common/base/classes/base_form.php');
-  require_once('common/base/classes/base_path.php');
-
-  require_once('program/reservation/reservation_database.php');
-  require_once('program/reservation/reservation_session.php');
+require_once('common/base/classes/base_error.php');
+require_once('common/base/classes/base_return.php');
+require_once('common/base/classes/base_markup.php');
+require_once('common/base/classes/base_html.php');
+require_once('common/base/classes/base_charset.php');
+require_once('common/base/classes/base_ascii.php');
+require_once('common/base/classes/base_form.php');
+require_once('common/base/classes/base_path.php');
+
+require_once('program/reservation/reservation_database.php');
+require_once('program/reservation/reservation_session.php');
 
 class c_reservation_paths {
   // paths to common files (not url paths).
-  private const PATH_LOGIN         = 'program/reservation/paths/u/login.php';
-  private const PATH_LOGOUT        = 'program/reservation/paths/u/logout.php';
-  private const PATH_ACCESS_DENIED = 'program/reservation/internal/access_denied.php';
-  private const PATH_NOT_FOUND     = 'program/reservation/internal/not_found.php';
+  private const PATH_LOGIN         = 'program/reservation/paths/u/';
+  private const PATH_LOGOUT        = 'program/reservation/paths/u/';
+  private const PATH_ACCESS_DENIED = 'program/reservation/internal/';
+  private const PATH_NOT_FOUND     = 'program/reservation/internal/';
+  private const PATH_BAD_METHOD    = 'program/reservation/internal/';
+  private const PATH_SERVER_ERROR  = 'program/reservation/internal/';
+  private const PATH_REDIRECTS     = 'program/reservation/';
+
+  private const NAME_LOGIN         = 'login';
+  private const NAME_LOGOUT        = 'logout';
+  private const NAME_ACCESS_DENIED = 'access_denied';
+  private const NAME_NOT_FOUND     = 'not_found';
+  private const NAME_BAD_METHOD    = 'bad_method';
+  private const NAME_SERVER_ERROR  = 'server_error';
+  private const NAME_REDIRECTS     = 'reservation_redirects';
 
   private $http      = NULL;
   private $database  = NULL;
   private $settings  = NULL;
   private $session   = NULL;
-  private $markup    = NULL;
+  private $content   = NULL;
   private $logged_in = NULL;
   private $paths     = NULL;
 
@@ -34,12 +45,11 @@ class c_reservation_paths {
    * Class constructor.
    */
   public function __construct() {
-    $this->uri       = NULL;
     $this->http      = NULL;
     $this->database  = NULL;
     $this->settings  = NULL;
     $this->session   = NULL;
-    $this->markup    = NULL;
+    $this->content   = NULL;
     $this->logged_in = NULL;
     $this->paths     = NULL;
     $this->path      = NULL;
@@ -49,11 +59,10 @@ class c_reservation_paths {
    * Class destructor.
    */
   public function __destruct() {
-    unset($this->uri);
     unset($this->http);
     unset($this->settings);
     unset($this->session);
-    unset($this->markup);
+    unset($this->content);
     unset($this->logged_in);
     unset($this->paths);
     unset($this->path);
@@ -79,7 +88,7 @@ class c_reservation_paths {
    *   The execution results.
    *   The execution results with the error bit set on error.
    */
-  public function reservation_process_path(&$http, &$database, &$session, &$html, $settings, $logged_in = TRUE) {
+  public function reservation_process_path(&$http, &$database, &$session, $settings, $logged_in = TRUE) {
     // @todo: these parameter errors might need a custom service unavailable and system log support.
     if (!($http instanceof c_base_http)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'http', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
@@ -96,11 +105,6 @@ class c_reservation_paths {
       return c_base_return_error::s_value(array(), 'c_base_path_executed', $error);
     }
 
-    if (!($html instanceof c_base_html)) {
-      $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'html', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
-      return c_base_return_error::s_value(array(), 'c_base_path_executed', $error);
-    }
-
     if (!is_array($settings)) {
       $error = c_base_error::s_log(NULL, array('arguments' => array(':argument_name' => 'settings', ':function_name' => __CLASS__ . '->' . __FUNCTION__)), i_base_error_messages::INVALID_ARGUMENT);
       return c_base_return_error::s_value(array(), 'c_base_path_executed', $error);
@@ -115,21 +119,22 @@ class c_reservation_paths {
     $this->database = &$database;
     $this->settings = $settings;
     $this->session = &$session;
-    $this->markup = &$html;
+    $this->content = NULL;
     $this->logged_in = $logged_in;
 
+
     // require HTTPS for access to any part of this website.
     if (!isset($_SERVER["HTTPS"])) {
       // @todo: redirect to https version of requested uri.
       $failure_path = $this->p_get_path_not_found();
 
-      return $failure_path->do_execute($this->http, $this->database, $this->session, $this->markup, $this->settings);
+      return $failure_path->do_execute($this->http, $this->database, $this->session, $this->settings);
     }
 
 
     $request_uri = $http->get_request(c_base_http::REQUEST_URI)->get_value_exact();
 
-    $this->uri = array(
+    $this->settings['uri'] = array(
       'scheme' => '',
       'authority' => '',
       'path' => '',
@@ -139,14 +144,14 @@ class c_reservation_paths {
     );
 
     if (isset($request_uri['data'])) {
-      $this->uri = $request_uri['data'];
+      $this->settings['uri'] = $request_uri['data'];
     }
     unset($request_uri);
 
     // strip the base path from the requested uri.
     if (!empty($settings['base_path'])) {
-      $this->uri['path'] = preg_replace('@^' . preg_quote($settings['base_path'], '@') . '@i', '', $this->uri['path']);
-      $this->uri['path'] = preg_replace('@/$@', '', $this->uri['path']);
+      $this->settings['uri']['path'] = preg_replace('@^' . preg_quote($settings['base_path'], '@') . '@i', '', $this->settings['uri']['path']);
+      $this->settings['uri']['path'] = preg_replace('@/$@', '', $this->settings['uri']['path']);
     }
 
 
@@ -155,17 +160,27 @@ class c_reservation_paths {
 
 
     // find the path
-    $handler_settings = $this->paths->find_path($this->uri['path']);
+    $handler_settings = $this->paths->find_path($this->settings['uri']['path'])->get_value();
 
     if (!is_array($handler_settings)) {
-      unset($handler_settings);
-
-      // @todo: handle error case and failsafe (404)?.
-      return new c_base_return_false();
+      $not_found = $this->p_get_path_not_found();
+      return $not_found->do_execute($this->http, $this->database, $this->session, $this->settings);
     }
 
     if (array_key_exists('redirect', $handler_settings)) {
-      // @todo: handle redirect.
+      // successfully logged in.
+      require_once(self::PATH_REDIRECTS . self::NAME_REDIRECTS . '.php');
+
+      if (!is_string($handler_settings['redirect'])) {
+        $handler_settings['redirect'] = '';
+      }
+
+      if (!isset($handler_settings['code']) || !is_int($handler_settings['code'])) {
+        $handler_settings['code'] = c_base_http_status::MOVED_PERMANENTLY;
+      }
+
+      $redirect = c_reservation_path_redirect::s_create_redirect($handler_settings['redirect'], $handler_settings['code'], FALSE);
+      return $redirect->do_execute($this->http, $this->database, $this->session, $this->settings);
     }
     else {
       if (!empty($handler_settings['include']) && is_string($handler_settings['include'])) {
@@ -173,10 +188,14 @@ class c_reservation_paths {
       }
 
       if (empty($handler_settings['handler']) || !class_exists($handler_settings['handler'])) {
-        // @todo: handle error case.
+        $not_found = $this->p_get_path_server_error();
+        return $not_found->do_execute($this->http, $this->database, $this->session, $this->settings);
       }
       else {
         $this->path = new $handler_settings['handler']();
+        if (isset($handler_settings['is_root']) && $handler_settings['is_root']) {
+          $this->path->set_is_root(TRUE);
+        }
       }
     }
     unset($handler_settings);
@@ -192,17 +211,16 @@ class c_reservation_paths {
       if ($id_group === c_base_ascii::LOWER_S || $id_group === c_base_ascii::LOWER_X) {
         $failure_path = $this->p_get_path_bad_method();
 
-        return $failure_path->do_execute($this->http, $this->database, $this->session, $this->markup, $this->settings);
+        return $failure_path->do_execute($this->http, $this->database, $this->session, $this->settings);
       }
       unset($id_group);
     }
     else {
       $failure_path = $this->p_get_path_bad_method();
 
-      return $failure_path->do_execute($this->http, $this->database, $this->session, $this->markup, $this->settings);
+      return $failure_path->do_execute($this->http, $this->database, $this->session, $this->settings);
     }
 
-
     return $this->p_paths_normal();
   }
 
@@ -217,25 +235,15 @@ class c_reservation_paths {
   private function p_paths_create() {
     $this->paths = new c_base_paths();
 
-
     // set root path to be the user dashboard.
     $this->paths->set_path('', 'c_reservation_path_user_dashboard', 'program/reservation/paths/u/dashboard.php');
 
-
     // create login/logout paths
-    $path = c_base_path::s_create_content(c_base_ascii::LOWER_U, 'login', FALSE);
-    $this->paths->set_path($path, 'c_reservation_path_user_login', 'program/reservation/login.php');
-    unset($path);
-
-    $path = c_base_path::s_create_content(c_base_ascii::LOWER_U, 'logout', FALSE);
-    $this->paths->set_path($path, 'c_reservation_path_user_logout', 'program/reservation/logout.php');
-    unset($path);
-
+    $this->paths->set_path('/u/login', 'c_reservation_path_user_login', 'program/reservation/login.php');
+    $this->paths->set_path('/u/logout', 'c_reservation_path_user_logout', 'program/reservation/logout.php');
 
     // user dashboard
-    $path = c_base_path::s_create_content(c_base_ascii::LOWER_U, 'dashboard', FALSE);
-    $this->paths->set_path($path, 'c_reservation_path_user_dashboard', 'program/reservation/paths/u/dashboard.php');
-    unset($path);
+    $this->paths->set_path('/u/dashboard', 'c_reservation_path_user_dashboard', 'program/reservation/paths/u/dashboard.php');
   }
 
   /**
@@ -255,7 +263,7 @@ class c_reservation_paths {
 
     if ($this->path instanceof c_reservation_path_user_login) {
       unset($id_group);
-      return $this->path->do_execute($this->http, $this->database, $this->session, $this->markup, $this->settings);
+      return $this->path->do_execute($this->http, $this->database, $this->session, $this->settings);
     }
 
 
@@ -263,7 +271,7 @@ class c_reservation_paths {
     if ($id_group === c_base_ascii::LOWER_A || $id_group === c_base_ascii::LOWER_U || $this->path->get_is_private()->get_value_exact()) {
       if ($this->logged_in) {
         unset($id_group);
-        return $this->path->do_execute($this->http, $this->database, $this->session, $this->markup, $this->settings);
+        return $this->path->do_execute($this->http, $this->database, $this->session, $this->settings);
       }
       elseif ($this->path->get_is_root()->get_value_exact()) {
         unset($id_group);
@@ -271,7 +279,7 @@ class c_reservation_paths {
         $this->http->set_response_status(c_base_http_status::FORBIDDEN);
 
         $login_path = $this->p_get_path_login();
-        return $login_path->do_execute($this->http, $this->database, $this->session, $this->markup, $this->settings);
+        return $login_path->do_execute($this->http, $this->database, $this->session, $this->settings);
       }
       else {
         // some special case paths always provide login prompt along with access denied.
@@ -281,13 +289,13 @@ class c_reservation_paths {
           $this->http->set_response_status(c_base_http_status::FORBIDDEN);
 
           $login_path = $this->p_get_path_login();
-          return $login_path->do_execute($this->http, $this->database, $this->session, $this->markup, $this->settings);
+          return $login_path->do_execute($this->http, $this->database, $this->session, $this->settings);
         }
       }
     }
     else {
       unset($id_group);
-      return $this->path->do_execute($this->http, $this->database, $this->session, $this->markup, $this->settings);
+      return $this->path->do_execute($this->http, $this->database, $this->session, $this->settings);
     }
 
     // return access denied or page not found depending on path and privacy settings.
@@ -305,7 +313,7 @@ class c_reservation_paths {
     }
     unset($id_group);
 
-    return $failsafe_path->do_execute($this->http, $this->database, $this->session, $this->markup, $this->settings);
+    return $failsafe_path->do_execute($this->http, $this->database, $this->session, $this->settings);
   }
 
   /**
@@ -321,7 +329,7 @@ class c_reservation_paths {
     // always return not found, do not inform user if the access is denied.
     $failsafe_path = $this->p_get_path_not_found();
 
-    return $failsafe_path->do_execute($this->http, $this->database, $this->session, $this->markup, $this->settings);
+    return $failsafe_path->do_execute($this->http, $this->database, $this->session, $this->settings);
   }
 
   /**
@@ -337,46 +345,120 @@ class c_reservation_paths {
     // always return not found, do not inform user if the access is denied.
     $failsafe_path = $this->p_get_path_not_found();
 
-    return $failsafe_path->do_execute($this->http, $this->database, $this->session, $this->markup, $this->settings);
+    return $failsafe_path->do_execute($this->http, $this->database, $this->session, $this->settings);
   }
 
   /**
    * Load and return the login path.
    */
   private function p_get_path_login() {
-    require_once(self::PATH_LOGIN);
-    return new c_reservation_path_user_login();
+    return $this->p_include_path(self::PATH_LOGIN, self::NAME_LOGIN, 'c_reservation_path_user_login');
   }
 
   /**
    * Load and return the logout path.
    */
   private function p_get_path_logout() {
-    require_once(self::PATH_LOGOUT);
-    return new c_reservation_path_user_logout();
+    return $this->p_include_path(self::PATH_LOGOUT, self::NAME_LOGOUT, 'c_reservation_path_user_logout');
   }
 
   /**
    * Load and return the access denied path.
    */
   private function p_get_path_access_denied() {
-    require_once(self::PATH_ACCESS_DENIED);
-    return new c_reservation_path_access_denied();
+    return $this->p_include_path(self::PATH_ACCESS_DENIED, self::NAME_ACCESS_DENIED, 'c_reservation_path_access_denied');
   }
 
   /**
    * Load and return the not found path.
    */
   private function p_get_path_not_found() {
-    require_once(self::PATH_NOT_FOUND);
-    return new c_reservation_path_not_found();
+    return $this->p_include_path(self::PATH_NOT_FOUND, self::NAME_NOT_FOUND, 'c_reservation_path_not_found');
   }
 
   /**
    * Load and return the not found path.
    */
   private function p_get_path_bad_method() {
-    require_once(self::PATH_BAD_METHOD);
-    return new c_reservation_path_bad_method();
+    return $this->p_include_path(self::PATH_BAD_METHOD, self::NAME_BAD_METHOD, 'c_reservation_path_bad_method');
+  }
+
+  /**
+   * Load and return the internal server error path.
+   */
+  private function p_get_path_server_error() {
+    return $this->p_include_path(self::PATH_SERVER_ERROR, self::NAME_SERVER_ERROR, 'c_reservation_path_server_error');
+  }
+
+  /**
+   * Will include a custom language path if one exists.
+   *
+   * The default language files ends in "${path}${name}.php".
+   * All other language files end in "${path}${language_alias}/${name}.php".
+   *
+   * The default class is the provided class name.
+   * All other languages use the provided class name with '_${language_alias}' appended.
+   *
+   * For example (using path='my_file'), us english is the default, so that would load the file 'my_file.php'.
+   *                                     japanese language load the file 'my_file-ja.php'.
+   *
+   * @param string $path
+   *   The path to the include file, without the file name.
+   * @param string $name
+   *   The file name of the PHP file, without the '.php' extension.
+   * @param string $class
+   *   The name of the class, that is an instance of c_base_path, to execute.
+   *
+   * @return c_base_path
+   *   The created c_base_path object.
+   */
+  private function p_include_path($path, $name, $class) {
+    require_once($path . $name . '.php');
+
+    $aliases = array();
+    $languages = $this->http->get_response_content_language()->get_value_exact();
+    if (is_array($languages) && !empty($languages)) {
+      $language = reset($languages);
+
+      // us-english is the default, so do not attempt to include any external files.
+      if ($language == i_base_language::ENGLISH_US || $language == i_base_language::ENGLISH) {
+        unset($language);
+        unset($aliases);
+        unset($languages);
+        return new $class();
+      }
+
+      $aliases = c_base_defaults_global::s_get_languages()::s_get_aliases_by_id($language)->get_value_exact();
+    }
+
+    // use default if no aliases are found.
+    if (empty($aliases)) {
+      unset($aliases);
+      unset($languages);
+      return new $class();
+    }
+
+    foreach ($aliases as $alias) {
+      // use include_once instead of require_require to allow for failsafe behavior.
+      @include_once($path . $alias . '/' . $name . '.php');
+
+      $language_class = $class . '_' . $alias;
+      if (class_exists($language_class)) {
+        unset($aliases);
+        unset($alias);
+
+        $this->html->set_attribute(c_base_markup_attributes::ATTRIBUTE_LANGUAGE, $language);
+        unset($language);
+
+        return new $language_class();
+      }
+    }
+    unset($aliases);
+    unset($alias);
+    unset($language_class);
+    unset($language);
+
+    // if unable to find, fallback to original class
+    return new $class();
   }
 }
index 14283e456308243996bee2865d1f16ff3c75295f..00a366aa85d7831ad200ae0bdd09aeefaffbb30b 100644 (file)
@@ -19,11 +19,71 @@ final class c_reservation_path_redirect extends c_base_path {
   const PREFIX_CLASS = 'reservation-';
 
   /**
+   * Create a redirect path.
+   *
+   * Defaults are silently forced on invalid parameters.
+   *
+   * @param string $field_destination
+   *   A destination URL to redirect to.
+   * @param int $response_code
+   *   The HTTP code to use when performing the redirect.
+   *   Should be one of 3xx error code integers.
+   * @param int $field_response_code
+   *   The redirect response code.
+   *   Should be a 3xx url code.
+   *   Usually one of:
+   *   - 300 (Multiple Choices):
+   *   - 301 (Moved Permanently):
+   *   - 303 (See Other):
+   *   This is not assigned on parameter error.
+   * @param bool $is_private
+   *   (optional) When TRUE, path is considered private and requires specific access privileges.
+   *   When FALSE, the path is accessible without any access privileges.
+   *   Default setting is assigned on parameter error.
+   *
+   * @return c_base_markup_tag|c_base_return_status
+   *   A newly created tag is returned on success.
+   *   FALSE with the error bit set is returned on error.
+   */
+  public static function s_create_redirect($field_destination, $field_response_code, $is_private = TRUE) {
+    $class = __CLASS__;
+    $path = new $class();
+    unset($class);
+
+    // @todo: store all errors on return.
+    $errors = array();
+
+    if (is_string($field_destination)) {
+      $path->set_field_destination($field_destination);
+    }
+
+    if (is_int($field_response_code)) {
+      $path->set_field_response_code($field_response_code);
+    }
+
+    if (is_bool($is_private)) {
+      $path->set_is_private($is_private);
+    }
+    else {
+      $path->set_is_private(TRUE);
+    }
+
+    $path->set_is_redirect(TRUE);
+
+    $timestamp_session = c_base_defaults_global::s_get_timestamp_session();
+    $path->set_date_created($timestamp_session);
+    $path->set_date_changed($timestamp_session);
+    unset($timestamp_session);
+
+    return $path;
+  }
+
+  /**
    * Implements do_execute().
    */
-  public function do_execute(&$http, &$database, &$session, &$html, $settings = array()) {
+  public function do_execute(&$http, &$database, &$session, $settings = array()) {
     // the parent function performs validation on the parameters.
-    $executed = parent::do_execute($http, $database, $session, $html, $settings);
+    $executed = parent::do_execute($http, $database, $session, $settings);
     if (c_base_return::s_has_error($executed)) {
       return $executed;
     }
index 14af8f01c725c3829a4413d13b3395f8a7e1b381..a61b9183ce3d7737df2c33ffd82d8da467e3f237 100644 (file)
@@ -3,13 +3,13 @@
  * @file
  * Provides reservation session functions.
  */
-  require_once('common/base/classes/base_error.php');
-  require_once('common/base/classes/base_return.php');
-  require_once('common/base/classes/base_http.php');
-  require_once('common/base/classes/base_session.php');
-  require_once('common/base/classes/base_cookie.php');
+require_once('common/base/classes/base_error.php');
+require_once('common/base/classes/base_return.php');
+require_once('common/base/classes/base_http.php');
+require_once('common/base/classes/base_session.php');
+require_once('common/base/classes/base_cookie.php');
 
-  require_once('program/reservation/reservation_database.php');
+require_once('program/reservation/reservation_database.php');
 
 
 /**