TemplateEngine is known as WebTemplateEngine (most parts are in BasTemplateEngine...
authorRoland Häder <roland@mxchange.org>
Sun, 22 Jun 2008 22:22:39 +0000 (22:22 +0000)
committerRoland Häder <roland@mxchange.org>
Sun, 22 Jun 2008 22:22:39 +0000 (22:22 +0000)
38 files changed:
.gitattributes
application/ship-simu/class_ApplicationHelper.php
application/ship-simu/templates/images/.htaccess [new file with mode: 0644]
application/ship-simu/templates/images/de/.htaccess [new file with mode: 0644]
application/ship-simu/templates/images/de/image/.htaccess [new file with mode: 0644]
inc/classes/exceptions/io/class_FileIsMissingException.php [deleted file]
inc/classes/exceptions/io/class_FileNotFoundException.php [new file with mode: 0644]
inc/classes/exceptions/xml/.htaccess [new file with mode: 0644]
inc/classes/exceptions/xml/class_InvalidXmlNodeException.php [new file with mode: 0644]
inc/classes/exceptions/xml/class_XmlParserException.php [new file with mode: 0644]
inc/classes/interfaces/helper/class_HelpableTemplate.php [new file with mode: 0644]
inc/classes/interfaces/template/class_CompileableTemplate.php
inc/classes/main/class_BaseFrameworkSystem.php
inc/classes/main/helper/captcha/web/class_GraphicalCodeCaptcha.php
inc/classes/main/helper/class_BaseHelper.php
inc/classes/main/helper/images/.htaccess [new file with mode: 0644]
inc/classes/main/helper/images/class_ImageHelper.php [new file with mode: 0644]
inc/classes/main/helper/web/class_WebFormHelper.php
inc/classes/main/images/.htaccess [new file with mode: 0644]
inc/classes/main/images/class_ [new file with mode: 0644]
inc/classes/main/images/class_BaseImage.php [new file with mode: 0644]
inc/classes/main/images/extended/.htaccess [new file with mode: 0644]
inc/classes/main/images/extended/class_PngImage.php [new file with mode: 0644]
inc/classes/main/io/class_FrameworkFileInputPointer.php
inc/classes/main/response/class_ImageResponse.php [new file with mode: 0644]
inc/classes/main/rng/class_RandomNumberGenerator.php
inc/classes/main/template/class_BaseTemplateEngine.php [new file with mode: 0644]
inc/classes/main/template/class_TemplateEngine.php [deleted file]
inc/classes/main/template/image/.htaccess [new file with mode: 0644]
inc/classes/main/template/image/class_ImageTemplateEngine.php [new file with mode: 0644]
inc/classes/main/template/web/.htaccess [new file with mode: 0644]
inc/classes/main/template/web/class_WebTemplateEngine.php [new file with mode: 0644]
inc/config.php
templates/images/.htaccess [new file with mode: 0644]
templates/images/de/.htaccess [new file with mode: 0644]
templates/images/de/image/.htaccess [new file with mode: 0644]
templates/images/de/image/base_image.img [new file with mode: 0644]
templates/images/de/image/emergency_exit.img [new file with mode: 0644]

index 96837fa..513b4ff 100644 (file)
@@ -149,6 +149,9 @@ application/ship-simu/templates/de/code/shipsimu_main.ctp -text
 application/ship-simu/templates/de/html/.htaccess -text
 application/ship-simu/templates/de/html/nav_advert.tpl -text
 application/ship-simu/templates/de/html/selector_ship-simu.tpl -text
+application/ship-simu/templates/images/.htaccess -text
+application/ship-simu/templates/images/de/.htaccess -text
+application/ship-simu/templates/images/de/image/.htaccess -text
 db/.htaccess -text
 db/news/.htaccess -text
 db/user/.htaccess -text
@@ -202,7 +205,7 @@ inc/classes/exceptions/helper/class_InvalidFormNameException.php -text
 inc/classes/exceptions/helper/class_UserInstanceMissingException.php -text
 inc/classes/exceptions/io/.htaccess -text
 inc/classes/exceptions/io/class_DirPointerNotOpenedException.php -text
-inc/classes/exceptions/io/class_FileIsMissingException.php -text
+inc/classes/exceptions/io/class_FileNotFoundException.php -text
 inc/classes/exceptions/io/class_FilePointerNotOpenedException.php -text
 inc/classes/exceptions/io/class_FileReadProtectedException.php -text
 inc/classes/exceptions/io/class_InvalidDataLengthException.php -text
@@ -259,6 +262,9 @@ inc/classes/exceptions/user/class_AccountPasswordMismatchException.php -text
 inc/classes/exceptions/user/class_UserEmailMissingException.php -text
 inc/classes/exceptions/user/class_UserPasswordMismatchException.php -text
 inc/classes/exceptions/user/class_UsernameMissingException.php -text
+inc/classes/exceptions/xml/.htaccess -text
+inc/classes/exceptions/xml/class_InvalidXmlNodeException.php -text
+inc/classes/exceptions/xml/class_XmlParserException.php -text
 inc/classes/interfaces/.htaccess -text
 inc/classes/interfaces/actions/.htaccess -text
 inc/classes/interfaces/actions/class_PerformableAction.php -text
@@ -298,6 +304,7 @@ inc/classes/interfaces/filter/.htaccess -text
 inc/classes/interfaces/filter/class_Filterable.php -text
 inc/classes/interfaces/helper/.htaccess -text
 inc/classes/interfaces/helper/class_HelpableLogin.php -text
+inc/classes/interfaces/helper/class_HelpableTemplate.php -text
 inc/classes/interfaces/io/.htaccess -text
 inc/classes/interfaces/io/class_Streamable.php -text
 inc/classes/interfaces/io/file/.htaccess -text
@@ -462,10 +469,17 @@ inc/classes/main/helper/captcha/web/.htaccess -text
 inc/classes/main/helper/captcha/web/class_GraphicalCodeCaptcha.php -text
 inc/classes/main/helper/class_ -text
 inc/classes/main/helper/class_BaseHelper.php -text
+inc/classes/main/helper/images/.htaccess -text
+inc/classes/main/helper/images/class_ImageHelper.php -text
 inc/classes/main/helper/login/.htaccess -text
 inc/classes/main/helper/login/class_BaseLoginHelper.php -text
 inc/classes/main/helper/web/.htaccess -text
 inc/classes/main/helper/web/class_WebFormHelper.php -text
+inc/classes/main/images/.htaccess -text
+inc/classes/main/images/class_ -text
+inc/classes/main/images/class_BaseImage.php -text
+inc/classes/main/images/extended/.htaccess -text
+inc/classes/main/images/extended/class_PngImage.php -text
 inc/classes/main/io/.htaccess -text
 inc/classes/main/io/class_FileIoStream.php -text
 inc/classes/main/io/class_FrameworkDirectoryPointer.php -text
@@ -505,12 +519,17 @@ inc/classes/main/resolver/controller/web/.htaccess -text
 inc/classes/main/resolver/controller/web/class_WebControllerResolver.php -text
 inc/classes/main/response/.htaccess -text
 inc/classes/main/response/class_HttpResponse.php -text
+inc/classes/main/response/class_ImageResponse.php -text
 inc/classes/main/result/.htaccess -text
 inc/classes/main/result/class_DatabaseResult.php -text
 inc/classes/main/rng/.htaccess -text
 inc/classes/main/rng/class_RandomNumberGenerator.php -text
 inc/classes/main/template/.htaccess -text
-inc/classes/main/template/class_TemplateEngine.php -text
+inc/classes/main/template/class_BaseTemplateEngine.php -text
+inc/classes/main/template/image/.htaccess -text
+inc/classes/main/template/image/class_ImageTemplateEngine.php -text
+inc/classes/main/template/web/.htaccess -text
+inc/classes/main/template/web/class_WebTemplateEngine.php -text
 inc/classes/main/user/.htaccess -text
 inc/classes/main/user/class_Guest.php -text
 inc/classes/main/user/class_User.php -text
@@ -618,6 +637,11 @@ templates/de/code/emergency_exit.ctp -text
 templates/de/code/footer_msg.ctp -text
 templates/de/code/header.ctp -text
 templates/de/html/.htaccess -text
+templates/images/.htaccess -text
+templates/images/de/.htaccess -text
+templates/images/de/image/.htaccess -text
+templates/images/de/image/base_image.img -text
+templates/images/de/image/emergency_exit.img -text
 tests/ConfigTest.php -text
 tests/RegistryTest.php -text
 tests/RequestTest.php -text
index 32bd764..370bd02 100644 (file)
@@ -185,8 +185,19 @@ class ApplicationHelper extends BaseFrameworkSystem implements ManageableApplica
                // Create a new request object
                $requestInstance = ObjectFactory::createObjectByName('HttpRequest');
 
+               // Default response is HTTP (HTML page) and type is "Web"
+               $response = "http";
+               $responseType = "web";
+
+               // Do we have another response?
+               if ($requestInstance->isRequestElementSet('response')) {
+                       // Then use it
+                       $response = strtolower($requestInstance->getRequestElement('response'));
+                       $responseType = $response;
+               } // END - if
+
                // ... and a new response object
-               $responseInstance = ObjectFactory::createObjectByName('HttpResponse', array($this));
+               $responseInstance = ObjectFactory::createObjectByName(ucfirst($response)."Response", array($this));
 
                // Remember both in this application
                $this->setRequestInstance($requestInstance);
@@ -201,7 +212,7 @@ class ApplicationHelper extends BaseFrameworkSystem implements ManageableApplica
                } // END - if
 
                // Get a resolver
-               $resolverInstance = WebControllerResolver::createWebControllerResolver($commandName, $this);
+               $resolverInstance = ObjectFactory::createObjectByName(ucfirst($responseType)."ControllerResolver", array($commandName, $this));
 
                // Get a controller instance as well
                $this->controllerInstance = $resolverInstance->resolveController();
diff --git a/application/ship-simu/templates/images/.htaccess b/application/ship-simu/templates/images/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/application/ship-simu/templates/images/de/.htaccess b/application/ship-simu/templates/images/de/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/application/ship-simu/templates/images/de/image/.htaccess b/application/ship-simu/templates/images/de/image/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/inc/classes/exceptions/io/class_FileIsMissingException.php b/inc/classes/exceptions/io/class_FileIsMissingException.php
deleted file mode 100644 (file)
index 61fa308..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/**
- * An exception thrown when a file pointer is not opened
- *
- * @author             Roland Haeder <webmaster@ship-simu.org>
- * @version            0.0.0
- * @copyright  Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license            GNU GPL 3.0 or any newer version
- * @link               http://www.ship-simu.org
- * 
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class FileIsMissingException extends FrameworkException {
-       /**
-        * The constructor
-        *
-        * @param               $fqfn           Full-qualified file name of (maybe) missing file
-        * @param               $code           Code number for the exception
-        * @return      void
-        */
-       public function __construct ($fqfn, $code) {
-               // Add a message around the missing class
-               $message = sprintf("The requested file <span id=\"exception_reason\">%s</span> is missing.", $fqfn);
-
-               // Call parent constructor
-               parent::__construct($message, $code);
-       }
-}
-
-// [EOF]
-?>
diff --git a/inc/classes/exceptions/io/class_FileNotFoundException.php b/inc/classes/exceptions/io/class_FileNotFoundException.php
new file mode 100644 (file)
index 0000000..a8ff449
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+/**
+ * An exception thrown when a file was not found
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @license            GNU GPL 3.0 or any newer version
+ * @link               http://www.ship-simu.org
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+class FileNotFoundException extends FrameworkException {
+       /**
+        * The constructor
+        *
+        * @param               $fqfn           Full-qualified file name of (maybe) missing file
+        * @param               $code           Code number for the exception
+        * @return      void
+        */
+       public function __construct ($fqfn, $code) {
+               // Add a message around the missing class
+               $message = sprintf("The requested file <span id=\"exception_reason\">%s</span> was not found.", $fqfn);
+
+               // Call parent constructor
+               parent::__construct($message, $code);
+       }
+}
+
+// [EOF]
+?>
diff --git a/inc/classes/exceptions/xml/.htaccess b/inc/classes/exceptions/xml/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/inc/classes/exceptions/xml/class_InvalidXmlNodeException.php b/inc/classes/exceptions/xml/class_InvalidXmlNodeException.php
new file mode 100644 (file)
index 0000000..75a2353
--- /dev/null
@@ -0,0 +1,54 @@
+<?php
+/**
+ * An exception thrown when an XML parser error was detected
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @license            GNU GPL 3.0 or any newer version
+ * @link               http://www.ship-simu.org
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+class InvalidXmlNodeException extends FrameworkException {
+       /**
+        * The super constructor for all exceptions
+        *
+        * @param               $classArray             Array holding the exception data
+        * @param               $code                   Error code
+        * @return      void
+        */
+       public function __construct (array $classArray, $code) {
+               // Extract attributes
+               $attributes = "<em>None</em>";
+               if ((is_array($classArray[2])) && (count($classArray[2]) > 0)) {
+                       $attributes = implode(", ", $classArray[2]);
+               } // END - if
+
+               // Construct our message
+               $message = sprintf("[%s:%d] Invalid XML node found: %s, attributes: %s.",
+                       $classArray[0]->__toString(),
+                       $this->getLine(),
+                       $classArray[1],
+                       $attributes
+               );
+               die($message);
+
+               // Call parent exception constructor
+               parent::__construct($message, $code);
+       }
+}
+
+// [EOF]
+?>
diff --git a/inc/classes/exceptions/xml/class_XmlParserException.php b/inc/classes/exceptions/xml/class_XmlParserException.php
new file mode 100644 (file)
index 0000000..1f14281
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+/**
+ * An exception thrown when an XML parser error was detected
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @license            GNU GPL 3.0 or any newer version
+ * @link               http://www.ship-simu.org
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+class XmlParserException extends FrameworkException {
+       /**
+        * The super constructor for all exceptions
+        *
+        * @param               $classArray             Array holding the exception data
+        * @param               $code                   Error code
+        * @return      void
+        */
+       public function __construct (array $classArray, $code) {
+               // Construct our message
+               $message = sprintf("[%s:%d] XML Error: %s at line %d.",
+                       $classArray[0]->__toString(),
+                       $this->getLine(),
+                       xml_error_string(xml_get_error_code($classArray[1])),
+                       xml_get_current_line_number($classArray[1])
+               );
+
+               // Call parent exception constructor
+               parent::__construct($message, $code);
+       }
+}
+
+// [EOF]
+?>
diff --git a/inc/classes/interfaces/helper/class_HelpableTemplate.php b/inc/classes/interfaces/helper/class_HelpableTemplate.php
new file mode 100644 (file)
index 0000000..c9d61cd
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/**
+ * A helper interface for template helper ;)
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @license            GNU GPL 3.0 or any newer version
+ * @link               http://www.ship-simu.org
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+interface HelpableTemplate extends FrameworkInterface {
+       /**
+        * Flush the content out,e g. to a template variable
+        *
+        * @return      void
+        */
+       function flushContent ();
+}
+
+//
+?>
index 2b3499e..3aef610 100644 (file)
@@ -25,8 +25,8 @@ interface CompileableTemplate extends FrameworkInterface {
        /**
         * Assign variables for templates
         *
-        * @param               $var            The "variable" we want to assign
-        * @param               $value  The value we want to store in the variable
+        * @param       $var    The "variable" we want to assign
+        * @param       $value  The value we want to store in the variable
         * @return      void
         */
        function assignVariable ($var, $value);
@@ -44,7 +44,7 @@ interface CompileableTemplate extends FrameworkInterface {
         * Load a specified code template into the engine for later compilation
         * with other code/web/email templates.
         *
-        * @param               $template               The code template we shall load which is
+        * @param       $template       The code template we shall load which is
         *                                              located in "html" by default
         * @return      void
         */
@@ -53,7 +53,7 @@ interface CompileableTemplate extends FrameworkInterface {
        /**
         * Load a specified email template into the engine
         *
-        * @param               $template               The email template we shall load which is
+        * @param       $template       The email template we shall load which is
         *                                              located in "emails" by default
         * @return      void
         */
index 3b0a939..132d5be 100644 (file)
@@ -256,9 +256,12 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                                } elseif (is_null($arg)) {
                                        // Null
                                        $argsString .= "(null)";
+                               } elseif (is_resource($arg)) {
+                                       // Resource
+                                       $argsString .= "(resource)";
                                } else {
                                        // Unknown type (please report!)
-                                       $argsString .= $arg."(unknown!)";
+                                       $argsString .= $arg."(<em>unknown!</em>)";
                                }
 
                                // Add comma
@@ -266,7 +269,9 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                        }
 
                        // Remove last comma
-                       if (substr($argsString, -2, 1) === ",") $argsString = substr($argsString, 0, -2);
+                       if (substr($argsString, -2, 1) === ",") {
+                               $argsString = substr($argsString, 0, -2);
+                       } // END - if
                } else {
                        // Invalid arguments!
                        $argsString = sprintf("!INVALID:%s!", $args);
@@ -880,7 +885,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Prepare the template engine (TemplateEngine by default) for a given
+        * Prepare the template engine (WebTemplateEngine by default) for a given
         * application helper instance (ApplicationHelper by default).
         *
         * @param               $appInstance                    An application helper instance or
index 6dcf0aa..d40a1ba 100644 (file)
@@ -133,7 +133,17 @@ class GraphicalCodeCaptcha extends BaseCaptcha implements SolveableCaptcha {
         * @return      void
         */
        public function renderCode () {
-               $this->partialStub("Please implement this method.");
+               // Load a template for this CAPTCHA
+               $this->getTemplateInstance()->loadCodeTemplate("captch_graphic_code");
+
+               // Assign variable
+               $this->getTemplateInstance()->assignVariable('encrypted_code', urlencode(base64_encode($this->encryptedString)));
+
+               // Compile the template
+               $this->getTemplateInstance()->compileTemplate();
+
+               // Get the content back
+               $this->addContent($this->getTemplateInstance()->getRawTemplateData());
        }
 }
 
index 1a48194..d266d5b 100644 (file)
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 class BaseHelper extends BaseFrameworkSystem {
+       // Exception constants
+       const EXCEPTION_XML_PARSER_ERROR = 0x0d0;
+       const EXCEPTION_XML_NODE_UNKNOWN = 0x0d1;
+
        /**
         * Template engine instance
         */
diff --git a/inc/classes/main/helper/images/.htaccess b/inc/classes/main/helper/images/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/inc/classes/main/helper/images/class_ImageHelper.php b/inc/classes/main/helper/images/class_ImageHelper.php
new file mode 100644 (file)
index 0000000..5490a40
--- /dev/null
@@ -0,0 +1,253 @@
+<?php
+/**
+ * A helper for creating images
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @license            GNU GPL 3.0 or any newer version
+ * @link               http://www.ship-simu.org
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+class ImageHelper extends BaseHelper implements HelpableTemplate {
+       /**
+        * The image type
+        */
+       private $imageType = "png";
+
+       /**
+        * Width of the image in pixel
+        */
+       private $width = 0;
+
+       /**
+        * Height of the image in pixel
+        */
+       private $height = 0;
+
+       /**
+        * Array for background color values
+        */
+       private $backgroundColor = array(
+               'red'   => 0,
+               'green' => 0,
+               'blue'  => 0
+       );
+
+       /**
+        * Array for foreground color values
+        */
+       private $foregroundColor = array(
+               'red'   => 0,
+               'green' => 0,
+               'blue'  => 0
+       );
+
+       /**
+        * Image message string
+        */
+       private $imageString = "No message set!";
+
+       /**
+        * Protected constructor
+        *
+        * @return      void
+        */
+       protected function __construct () {
+               // Call parent constructor
+               parent::__construct(__CLASS__);
+
+               // Set part description
+               $this->setObjectDescription("A image helper class");
+       }
+
+       /**
+        * Creates the helper class
+        *
+        * @param       $templateInstance       An instance of a template engine
+        * @param       $imageType                      Type of the image
+        * @return      $helperInstance         A preparedf instance of this class
+        */
+       public final static function createImageHelper (CompileableTemplate $templateInstance, $imageType) {
+               // Get new instance
+               $helperInstance = new ImageHelper();
+
+               // Set template instance
+               $helperInstance->setTemplateInstance($templateInstance);
+
+               // Set image type (blindly)
+               $helperInstance->setImageType($imageType);
+
+               // Return the prepared instance
+               return $helperInstance;
+       }
+
+       /**
+        * Setter for image type
+        *
+        * @param       $imageType      Type of the image
+        * @return      void
+        */
+       protected final function setImageType ($imageType) {
+               $this->imageType = (string) $imageType;
+       }
+
+       /**
+        * Getter for image type
+        *
+        * @return      $imageType      Type of the image
+        */
+       public final function getImageType () {
+               return $this->imageType;
+       }
+
+       /**
+        * Setter for image width
+        *
+        * @param       $width  Width of the image
+        * @return      void
+        */
+       public final function setWidth ($width) {
+               $this->width = (int) $width;
+       }
+
+       /**
+        * Getter for image width
+        *
+        * @return      $width  Width of the image
+        */
+       public final function getWidth () {
+               return $this->width;
+       }
+
+       /**
+        * Setter for image height
+        *
+        * @param       $height         Height of the image
+        * @return      void
+        */
+       public final function setHeight ($height) {
+               $this->height = (int) $height;
+       }
+
+       /**
+        * Getter for image height
+        *
+        * @return      $height         Height of the image
+        */
+       public final function getHeight () {
+               return $this->height;
+       }
+
+       /**
+        * Setter for RGB of background color
+        *
+        * @param       $red    Color value for red
+        * @param       $green  Color value for green
+        * @param       $blue   Color value for blue
+        * @return      void
+        */
+       public final function setBackgroundColorRedGreenBlue ($red, $green, $blue) {
+               $this->backgroundColor['red']   = (int) $red;
+               $this->backgroundColor['green'] = (int) $green;
+               $this->backgroundColor['blue']  = (int) $blue;
+       }
+
+       /**
+        * Setter for RGB of foreground color
+        *
+        * @param       $red    Color value for red
+        * @param       $green  Color value for green
+        * @param       $blue   Color value for blue
+        * @return      void
+        */
+       public final function setForegroundColorRedGreenBlue ($red, $green, $blue) {
+               $this->foregroundColor['red']   = (int) $red;
+               $this->foregroundColor['green'] = (int) $green;
+               $this->foregroundColor['blue']  = (int) $blue;
+       }
+
+       /**
+        * Setter for image message string
+        *
+        * @param       $imageString    A message to display in the image
+        * @return      void
+        */
+       public final function setImageString ($imageString) {
+               $this->imageString = (string) $imageString;
+       }
+
+       /**
+        * Getter for image message string
+        *
+        * @return      $imageString    A message to display in the image
+        */
+       public final function getImageString () {
+               return $this->imageString;
+       }
+
+       /**
+        * Setter for base image
+        *
+        * @param       $baseImage      A base image template
+        * @return      void
+        */
+       public final function setBaseImage ($baseImage) {
+               $this->baseImage = (string) $baseImage;
+       }
+
+       /**
+        * Getter for base image
+        *
+        * @return      $baseImage      A base image template
+        */
+       public final function getBaseImage () {
+               return $this->baseImage;
+       }
+
+       /**
+        * Flushs the content out
+        *
+        * @return      void
+        */
+       public function flushContent () {
+               // Get a template instance
+               $templateInstance = $this->getTemplateInstance();
+
+               // Get the base image
+               $templateInstance->loadCodeTemplate($this->getBaseImage());
+
+               // Assign all the image values with the template
+               $templateInstance->assignVariable("image_type"    , $this->getImageType());
+               $templateInstance->assignVariable("image_width"   , $this->getWidth());
+               $templateInstance->assignVariable("image_height"  , $this->getHeight());
+               $templateInstance->assignVariable("image_bg_red"  , $this->backgroundColor['red']);
+               $templateInstance->assignVariable("image_bg_green", $this->backgroundColor['green']);
+               $templateInstance->assignVariable("image_bg_blue" , $this->backgroundColor['blue']);
+               $templateInstance->assignVariable("image_fg_red"  , $this->foregroundColor['red']);
+               $templateInstance->assignVariable("image_fg_green", $this->foregroundColor['green']);
+               $templateInstance->assignVariable("image_fg_blue" , $this->foregroundColor['blue']);
+               $templateInstance->assignVariable("image_string"  , $this->getImageString());
+
+               // Get the raw content
+               $imageContent = $templateInstance->getRawTemplateData();
+
+               // Transfer all to the template engine
+               $templateInstance->renderImageContent($imageContent);
+       }
+}
+
+// [EOF]
+?>
index ddb10a8..8d20001 100644 (file)
@@ -21,7 +21,7 @@
  * You should have received a copy of the GNU General Public License
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
-class WebFormHelper extends BaseHelper {
+class WebFormHelper extends BaseHelper implements HelpableTemplate {
        /**
         * Instance to the class which provides field values
         */
@@ -53,6 +53,11 @@ class WebFormHelper extends BaseHelper {
         */
        private $subGroupName = "";
 
+       /**
+        * Wether form tag is enabled (default: true)
+        */
+       private $formEnabled = true;
+
        // Class Constants
        const EXCEPTION_FORM_NAME_INVALID       = 0x030;
        const EXCEPTION_CLOSED_FORM             = 0x031;
@@ -81,9 +86,10 @@ class WebFormHelper extends BaseHelper {
         * @param       $templateInstance       An instance of a valid template engine
         * @param       $formName                       Name of the form
         * @param       $formId                         Value for "id" attribute (default: $formName)
+        * @param       $withForm                       Wether include the form tag
         * @return      $helperInstance         A preparedf instance of this class
         */
-       public final static function createWebFormHelper (CompileableTemplate $templateInstance, $formName, $formId = false) {
+       public final static function createWebFormHelper (CompileableTemplate $templateInstance, $formName, $formId = false, $withForm = true) {
                // Get new instance
                $helperInstance = new WebFormHelper();
 
@@ -94,10 +100,18 @@ class WebFormHelper extends BaseHelper {
                if ($formId === false) {
                        // Use form id from form name
                        $formId = $formName;
-               }
+               } // END - if
 
-               // Create the form
-               $helperInstance->addFormTag($formName, $formId);
+               // Set form name
+               $helperInstance->setFormName($formName);
+               // A form-less field may say "false" here...
+               if ($withForm === true) {
+                       // Create the form
+                       $helperInstance->addFormTag($formName, $formId);
+               } else {
+                       // Disable form
+                       $helperInstance->enableForm(false);
+               }
 
                // Return the prepared instance
                return $helperInstance;
@@ -141,7 +155,7 @@ class WebFormHelper extends BaseHelper {
                $formContent = "</form>";
 
                // Check wether we shall open or close the form
-               if ($this->formOpened === false) {
+               if (($this->formOpened === false) && ($this->formEnabled === true)) {
                        // Add HTML code
                        $formContent = sprintf("<form name=\"%s\" class=\"forms\" action=\"%s/%s\" method=\"%s\" target=\"%s\"",
                                $formName,
@@ -151,23 +165,19 @@ class WebFormHelper extends BaseHelper {
                                $this->getConfigInstance()->readConfig('form_target')
                        );
 
-                       // Is the form id set?
-                       if ($formId !== false) {
-                               // Then add it as well
-                               $formContent .= sprintf(" id=\"%s_form\"",
-                                       $formId
-                               );
-                       }
+                       // Add form id as well
+                       $formContent .= sprintf(" id=\"%s_form\"",
+                               $formId
+                       );
 
                        // Add close bracket
                        $formContent .= ">";
 
                        // Open the form and remeber the form name
                        $this->formOpened = true;
-                       $this->formName = $formName;
                } else {
                        // Add the hidden field required to identify safely this form
-                       $this->addInputHiddenField('form', $this->formName);
+                       $this->addInputHiddenField('form', $this->getFormName());
 
                        // Is a group open?
                        if ($this->groupOpened === true) {
@@ -194,7 +204,7 @@ class WebFormHelper extends BaseHelper {
         */
        public function addInputTextField ($fieldName, $fieldValue = "") {
                // Is the form opened?
-               if ($this->formOpened === false) {
+               if (($this->formOpened === false) && ($this->formEnabled === true)) {
                        // Throw an exception
                        throw new FormClosedException (array($this, $fieldName), self::EXCEPTION_CLOSED_FORM);
                } // END - if
@@ -236,7 +246,7 @@ class WebFormHelper extends BaseHelper {
         */
        public function addInputPasswordField ($fieldName, $fieldValue = "") {
                // Is the form opened?
-               if ($this->formOpened === false) {
+               if (($this->formOpened === false) && ($this->formEnabled === true)) {
                        // Throw an exception
                        throw new FormClosedException (array($this, $fieldName), self::EXCEPTION_CLOSED_FORM);
                } // END - if
@@ -263,7 +273,7 @@ class WebFormHelper extends BaseHelper {
         */
        public function addInputHiddenField ($fieldName, $fieldValue = "") {
                // Is the form opened?
-               if ($this->formOpened === false) {
+               if (($this->formOpened === false) && ($this->formEnabled === true)) {
                        // Throw an exception
                        throw new FormClosedException (array($this, $fieldName), self::EXCEPTION_CLOSED_FORM);
                } // END - if
@@ -320,7 +330,7 @@ class WebFormHelper extends BaseHelper {
         */
        public function addInputCheckboxField ($fieldName, $fieldChecked = true) {
                // Is the form opened?
-               if ($this->formOpened === false) {
+               if (($this->formOpened === false) && ($this->formEnabled === true)) {
                        // Throw an exception
                        throw new FormClosedException (array($this, $fieldName), self::EXCEPTION_CLOSED_FORM);
                } // END - if
@@ -350,14 +360,14 @@ class WebFormHelper extends BaseHelper {
         */
        public function addInputResetButton ($buttonText) {
                // Is the form opened?
-               if ($this->formOpened === false) {
+               if (($this->formOpened === false) && ($this->formEnabled === true)) {
                        // Throw an exception
                        throw new FormClosedException (array($this, "reset"), self::EXCEPTION_CLOSED_FORM);
                } // END - if
 
                // Generate the content
                $inputContent = sprintf("<input type=\"reset\" class=\"reset_button\" id=\"%s_reset\" value=\"%s\" />",
-                       $this->formName,
+                       $this->getFormName(),
                        $buttonText
                );
 
@@ -375,15 +385,15 @@ class WebFormHelper extends BaseHelper {
         */
        public function addInputSubmitButton ($buttonText) {
                // Is the form opened?
-               if ($this->formOpened === false) {
+               if (($this->formOpened === false) && ($this->formEnabled === true)) {
                        // Throw an exception
                        throw new FormClosedException (array($this, "submit"), self::EXCEPTION_CLOSED_FORM);
                } // END - if
 
                // Generate the content
                $inputContent = sprintf("<input type=\"submit\" class=\"submit_button\" id=\"%s_submit\" name=\"%s_button\" value=\"%s\" />",
-                       $this->formName,
-                       $this->formName,
+                       $this->getFormName(),
+                       $this->getFormName(),
                        $buttonText
                );
 
@@ -402,7 +412,7 @@ class WebFormHelper extends BaseHelper {
         */
        public function addFormGroup ($groupName, $groupText) {
                // Is a form opened?
-               if ($this->formOpened === false) {
+               if (($this->formOpened === false) && ($this->formEnabled === true)) {
                        // Throw exception here
                        throw new FormClosedException(array($this, $groupName), self::EXCEPTION_CLOSED_FORM);
                } // END - if
@@ -531,7 +541,7 @@ class WebFormHelper extends BaseHelper {
         */
        public function addFieldText ($fieldName, $fieldText) {
                // Is the form opened?
-               if ($this->formOpened === false) {
+               if (($this->formOpened === false) && ($this->formEnabled === true)) {
                        // Throw an exception
                        throw new FormClosedException (array($this, $fieldName), self::EXCEPTION_CLOSED_FORM);
                } // END - if
@@ -564,7 +574,7 @@ class WebFormHelper extends BaseHelper {
         */
        public function addFormNote ($formNotes) {
                // Is the form opened?
-               if ($this->formOpened === false) {
+               if (($this->formOpened === false) && ($this->formEnabled === true)) {
                        // Throw an exception
                        throw new FormClosedException (array($this, "form_notes"), self::EXCEPTION_CLOSED_FORM);
                } // END - if
@@ -742,7 +752,7 @@ class WebFormHelper extends BaseHelper {
         * @return      $isSecured      Wether this form is secured by a CAPTCHA
         */
        public function ifFormSecuredWithCaptcha () {
-               $isSecured = ($this->getConfigInstance()->readConfig($this->formName."_captcha_secured") == "Y");
+               $isSecured = ($this->getConfigInstance()->readConfig($this->getFormName()."_captcha_secured") == "Y");
                return $isSecured;
        }
 
@@ -755,13 +765,13 @@ class WebFormHelper extends BaseHelper {
         */
        public function flushContent () {
                // Is the form still open?
-               if ($this->formOpened === true) {
+               if (($this->formOpened === true) && ($this->formEnabled === true)) {
                        // Close the form automatically
                        $this->addFormTag();
                } // END - if
 
                // Send content to template engine
-               $this->getTemplateInstance()->assignVariable($this->formName, $this->getContent());
+               $this->getTemplateInstance()->assignVariable($this->getFormName(), $this->getContent());
        }
 
        /**
@@ -788,7 +798,7 @@ class WebFormHelper extends BaseHelper {
                $extraInstance = Registry::getRegistry()->getInstance('extra');
 
                // Get a configured instance
-               $captchaInstance = ObjectFactory::createObjectByConfiguredName("{$this->formName}_captcha", array($this->getTemplateInstance(), $extraInstance));
+               $captchaInstance = ObjectFactory::createObjectByConfiguredName($this->getFormName()."_captcha", array($this->getTemplateInstance(), $extraInstance));
 
                // Initiate the CAPTCHA
                $captchaInstance->initiateCaptcha();
@@ -799,6 +809,35 @@ class WebFormHelper extends BaseHelper {
                // Get the content and add it to the helper
                $this->addContent($captchaInstance->getContent());
        }
+
+       /**
+        * Enables/disables the form tag usage
+        *
+        * @param       $formEnabled    Wether form is enabled or disabled
+        * @return      void
+        */
+       public final function enableForm ($formEnabled = true) {
+               $this->formEnabled = (bool) $formEnabled;
+       }
+
+       /**
+        * Setter for form name
+        *
+        * @param       $formName       Name of this form
+        * @return      void
+        */
+       public final function setFormName ($formName) {
+               $this->formName = (string) $formName;
+       }
+
+       /**
+        * Getter for form name
+        *
+        * @return      $formName       Name of this form
+        */
+       public final function getFormName () {
+               return $this->formName;
+       }
 }
 
 // [EOF]
diff --git a/inc/classes/main/images/.htaccess b/inc/classes/main/images/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/inc/classes/main/images/class_ b/inc/classes/main/images/class_
new file mode 100644 (file)
index 0000000..9a90092
--- /dev/null
@@ -0,0 +1,56 @@
+<?php
+/**
+ * 
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @license            GNU GPL 3.0 or any newer version
+ * @link               http://www.ship-simu.org
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+class ???Image extends BaseImage {
+       /**
+        * Protected constructor
+        *
+        * @return      void
+        */
+       protected function __construct () {
+               // Call parent constructor
+               parent::__construct(__CLASS__);
+
+               // Set part description
+               $this->setObjectDescription("");
+
+               // Create unique ID number
+               $this->generateUniqueId();
+       }
+
+       /**
+        * Creates an instance of this image class
+        *
+        * @return      $imageInstance  An instance of this image class
+        */
+       public final static function create???Image() {
+               // Get a new instance
+               $imageInstance = new ???Image();
+
+               // Return the instance
+               return $imageInstance;
+       }
+}
+
+// [EOF]
+?>
diff --git a/inc/classes/main/images/class_BaseImage.php b/inc/classes/main/images/class_BaseImage.php
new file mode 100644 (file)
index 0000000..2273945
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+/**
+ * A general image class
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @license            GNU GPL 3.0 or any newer version
+ * @link               http://www.ship-simu.org
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+class BaseImage extends BaseFrameworkSystem {
+       /**
+        * Protected constructor
+        *
+        * @param       $className      Name of the class
+        * @return      void
+        */
+       protected function __construct ($className) {
+               // Call parent constructor
+               parent::__construct($className);
+
+               // Clean up a little
+               $this->removeNumberFormaters();
+               $this->removeSystemArray();
+       }
+}
+
+// [EOF]
+?>
diff --git a/inc/classes/main/images/extended/.htaccess b/inc/classes/main/images/extended/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/inc/classes/main/images/extended/class_PngImage.php b/inc/classes/main/images/extended/class_PngImage.php
new file mode 100644 (file)
index 0000000..4693a3d
--- /dev/null
@@ -0,0 +1,56 @@
+<?php
+/**
+ * A PNG image generator
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @license            GNU GPL 3.0 or any newer version
+ * @link               http://www.ship-simu.org
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+class PngImage extends BaseImage {
+       /**
+        * Protected constructor
+        *
+        * @return      void
+        */
+       protected function __construct () {
+               // Call parent constructor
+               parent::__construct(__CLASS__);
+
+               // Set part description
+               $this->setObjectDescription("");
+
+               // Create unique ID number
+               $this->generateUniqueId();
+       }
+
+       /**
+        * Creates an instance of this image class
+        *
+        * @return      $imageInstance  An instance of this image class
+        */
+       public final static function createPngImage() {
+               // Get a new instance
+               $imageInstance = new PngImage();
+
+               // Return the instance
+               return $imageInstance;
+       }
+}
+
+// [EOF]
+?>
index fe6b058..c81db57 100644 (file)
@@ -81,7 +81,7 @@ class FrameworkFileInputPointer extends BaseFrameworkSystem {
                        throw new FileIsEmptyException(null, self::EXCEPTION_UNEXPECTED_EMPTY_STRING);
                } elseif (!file_exists($fileName)) {
                        // File does not exist!
-                       throw new FileIsMissingException($fileName, self::EXCEPTION_FILE_NOT_FOUND);
+                       throw new FileNotFoundException($fileName, self::EXCEPTION_FILE_NOT_FOUND);
                } elseif (!is_readable($fileName)) {
                        // File does not exist!
                        throw new FileReadProtectedException($fileName, self::EXCEPTION_FILE_CANNOT_BE_READ);
diff --git a/inc/classes/main/response/class_ImageResponse.php b/inc/classes/main/response/class_ImageResponse.php
new file mode 100644 (file)
index 0000000..2e2fd09
--- /dev/null
@@ -0,0 +1,376 @@
+<?php
+/**
+ * A class for an image response on an HTTP request
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @license            GNU GPL 3.0 or any newer version
+ * @link               http://www.ship-simu.org
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The extended headers are taken from phpMyAdmin setup tool, written by
+ * Michal Cihar <michal@cihar.com>, licensed under GNU GPL 2.0.
+ */
+class ImageResponse extends BaseFrameworkSystem implements Responseable {
+       /**
+        * Response status
+        */
+       private $responseStatus = "200 OK";
+
+       /**
+        * Array with all headers
+        */
+       private $responseHeaders = array();
+
+       /**
+        * Cookies we shall sent out
+        */
+       private $cookies = array();
+
+       /**
+        * Body of the response
+        */
+       private $responseBody = "";
+
+       /**
+        * Instance of the template engine
+        */
+       private $templateEngine = null;
+
+       /**
+        * Fatal resolved messages from filters and so on
+        */
+       private $fatalMessages = array();
+
+       /**
+        * Protected constructor
+        *
+        * @return      void
+        */
+       protected function __construct () {
+               // Call parent constructor
+               parent::__construct(__CLASS__);
+
+               // Set part description
+               $this->setObjectDescription("HTTP response");
+
+               // Create unique ID number
+               $this->generateUniqueId();
+
+               // Clean up a little
+               $this->removeNumberFormaters();
+               $this->removeSystemArray();
+       }
+
+       /**
+        * Creates an object of this class
+        *
+        * @param       $appInstance            An instance of a manageable application
+        * @return      $responseInstance       A prepared instance of this class
+        */
+       public final static function createImageResponse (ManageableApplication $appInstance) {
+               // Get a new instance
+               $responseInstance = new ImageResponse();
+
+               // Set the application instance
+               $responseInstance->setApplicationInstance($appInstance);
+
+               // Initialize the template engine here
+               $responseInstance->initTemplateEngine($appInstance);
+
+               // Return the prepared instance
+               return $responseInstance;
+       }
+
+       /**
+        * Setter for status
+        *
+        * @param       $status         New response status
+        * @return      void
+        */
+       public final function setResponseStatus ($status) {
+               $this->responseStatus = (string) $status;
+       }
+
+       /**
+        * Add header element
+        *
+        * @param       $name   Name of header element
+        * @param       $value  Value of header element
+        * @return      void
+        */
+       public final function addHeader ($name, $value) {
+               $this->responseHeaders[$name] = $value;
+       }
+
+       /**
+        * Reset the header array
+        *
+        * @return      void
+        */
+       public final function resetResponseHeaders () {
+               $this->responseHeaders = array();
+       }
+
+       /**
+        * "Writes" data to the response body
+        *
+        * @param       $output         Output we shall sent in the HTTP response
+        * @return      void
+        */
+       public function writeToBody ($output) {
+               $this->responseBody .= $output;
+       }
+
+       /**
+        * Sets the response body to something new
+        *
+        * @param       $output         Output we shall sent in the HTTP response
+        * @return      void
+        */
+       public function setResponseBody ($output) {
+               $this->responseBody = $output;
+       }
+
+       /**
+        * Flushs the cached HTTP response to the outer world
+        *
+        * @param       $force  Wether we shall force the output or abort if headers are
+        *                                      already sent with an exception
+        * @return      void
+        * @throws      ResponseHeadersAlreadySentException             Thrown if headers are
+        *                                                                                                      already sent
+        */
+       public function flushBuffer ($force=false) {
+               if ((headers_sent()) && (!$force)) {
+                       // Headers are already sent!
+                       throw new ResponseHeadersAlreadySentException($this, self::EXCEPTION_HEADERS_ALREADY_SENT);
+               } elseif (!headers_sent()) {
+                       // Send headers out
+                       header("HTTP/1.1 {$this->responseStatus}");
+
+                       // Used later
+                       $now = gmdate('D, d M Y H:i:s') . ' GMT';
+
+                       // General header for no caching
+                       $this->addHeader('Expired', $now); // rfc2616 - Section 14.21
+                       $this->addHeader('Last-Modified', $now);
+                       $this->addHeader('Cache-Control', 'no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0'); // HTTP/1.1
+                       $this->addHeader('Pragma', 'no-cache'); // HTTP/1.0
+
+                       // Define the charset to be used
+                       //$this->addHeader('Content-Type:', sprintf("text/html; charset=%s", $this->getConfigInstance()->readConfig('header_charset')));
+
+                       foreach ($this->responseHeaders as $name=>$value) {
+                               header("{$name}: {$value}");
+                       } // END - foreach
+
+                       // Send cookies out?
+                       if (count($this->cookies) > 0) {
+                               // Send all cookies
+                               $cookieString = implode(" ", $this->cookies);
+                               header("Set-Cookie: {$cookieString}");
+
+                               // Remove them all
+                               $this->cookies = array();
+                       } // END - if
+               }
+
+               // Are there some error messages?
+               if (count($this->fatalMessages) == 0) {
+                       // Flush the output to the world
+                       $this->getWebOutputInstance()->output($this->responseBody);
+               } else {
+                       // Display all error messages
+                       $this->getApplicationInstance()->handleFatalMessages($this->fatalMessages);
+
+                       // Send the error messages out to the world
+                       $this->getWebOutputInstance()->output($this->responseBody);
+               }
+
+               // Clear response header and body
+               $this->setResponseBody("");
+               $this->resetResponseHeaders();
+       }
+
+       /**
+        * Initializes the template engine instance
+        *
+        * @param       $appInstance    An instance of a manageable application
+        * @return      void
+        */
+       public final function initTemplateEngine (ManageableApplication $appInstance) {
+               // Get config instance
+               $cfg = $this->getConfigInstance();
+
+               // Set new template engine
+               $cfg->setConfigEntry('template_class', "ImageTemplateEngine");
+               $cfg->setConfigEntry('raw_template_extension', ".img");
+               $cfg->setConfigEntry('code_template_extension', ".img");
+               $cfg->setConfigEntry('tpl_base_path', "templates/images/");
+               $cfg->setConfigEntry('code_template_type', "image");
+
+               // Get a prepared instance
+               $this->templateEngine = $this->prepareTemplateEngine($appInstance);
+       }
+
+       /**
+        * Getter for the template engine instance
+        *
+        * @return      $templateEngine         An instance of the used template engine
+        */
+       public final function getTemplateEngine () {
+               return $this->templateEngine;
+       }
+
+       /**
+        * Adds a fatal message id to the response. The added messages can then be
+        * processed and outputed to the world
+        *
+        * @param       $messageId      The message id we shall add
+        * @return      void
+        */
+       public final function addFatalMessage ($messageId) {
+               // Adds the resolved message id to the fatal message list
+               $this->fatalMessages[] = $this->getApplicationInstance()->getLanguageInstance()->getMessage($messageId);
+       }
+
+       /**
+        * Adds a cookie to the response
+        *
+        * @param       $cookieName             Cookie's name
+        * @param       $cookieValue    Value to store in the cookie
+        * @param       $encrypted              Do some extra encryption on the value
+        * @param       $expires                Timestamp of expiration (default: configured)
+        * @return      void
+        * @throws      ResponseHeadersAlreadySentException             If headers are already sent
+        * @todo        Encryption of cookie data not yet supported.
+        * @todo        Why are these parameters conflicting?
+        * @todo        If the return statement is removed and setcookie() commented out,
+        * @todo        this will send only one cookie out, the first one.
+        */
+       public function addCookie ($cookieName, $cookieValue, $encrypted = false, $expires = null) {
+               // Are headers already sent?
+               if (headers_sent()) {
+                       // Throw an exception here
+                       throw new ResponseHeadersAlreadySentException($this, self::EXCEPTION_HEADERS_ALREADY_SENT);
+               } // END - if
+
+               // Shall we encrypt the cookie?
+               if ($encrypted === true) {
+               } // END - if
+
+               // For slow browsers set the cookie array element first
+               $_COOKIE[$cookieName] = $cookieValue;
+
+               // Get all config entries
+               if (is_null($expires)) {
+                       $expires = (time() + $this->getConfigInstance()->readConfig('cookie_expire'));
+               } // END - if
+
+               $path = $this->getConfigInstance()->readConfig('cookie_path');
+               $domain = $this->getConfigInstance()->readConfig('cookie_domain');
+
+               setcookie($cookieName, $cookieValue, $expires);
+               //, $path, $domain, (isset($_SERVER['HTTPS']))
+               return;
+
+               // Now construct the full header
+               $cookieString = $cookieName . "=" . $cookieValue . "; ";
+               $cookieString .= "expires=" . date("D, d-F-Y H:i:s", $expires) . " GMT";
+               // $cookieString .= "; path=".$path."; domain=".$domain;
+
+               // Set the cookie as a header
+               $this->cookies[$cookieName] = $cookieString;
+       }
+
+       /**
+        * Redirect to a configured URL. The URL can be absolute or relative. In
+        * case of relative URL it will be extended automatically.
+        *
+        * @param       $configEntry    The configuration entry which holds our URL
+        * @return      void
+        * @throws      ResponseHeadersAlreadySentException             If headers are already sent
+        */
+       public function redirectToConfiguredUrl ($configEntry) {
+               // Is the header not yet sent?
+               if (headers_sent()) {
+                       // Throw an exception here
+                       throw new ResponseHeadersAlreadySentException($this, self::EXCEPTION_HEADERS_ALREADY_SENT);
+               } // END - if
+
+               // Get the url from config
+               $url = $this->getConfigInstance()->readConfig($configEntry);
+
+               // Do we have a "http" in front of the URL?
+               if (substr(strtolower($url), 0, 4) != "http") {
+                       // Is there a / in front of the relative URL?
+                       if (substr($url, 0, 1) == "/") $url = substr($url, 1);
+
+                       // No, then extend it with our base URL
+                       $url = $this->getConfigInstance()->readConfig('base_url') . "/" . $url;
+               } // END - if
+
+               // Add redirect header
+               $this->addHeader("Location", $url);
+
+               // Set correct response status
+               $this->setResponseStatus("301 Moved Permanently");
+
+               // Clear the body
+               $this->setResponseBody("");
+
+               // Flush the result
+               $this->flushBuffer();
+
+               // All done here...
+               exit();
+       }
+
+       /**
+        * Expires the given cookie if it is set
+        *
+        * @param       $cookieName             Cookie to expire
+        * @return      void
+        */
+       public function expireCookie ($cookieName) {
+               // Is the cookie there?
+               if (isset($_COOKIE[$cookieName])) {
+                       // Then expire it with 20 minutes past
+                       $this->addCookie($cookieName, "", false, (time() - 1200));
+
+                       // Remove it from array
+                       unset($_COOKIE[$cookieName]);
+               } // END - if
+       }
+
+       /**
+        * Refreshs a given cookie. This will make the cookie live longer
+        *
+        * @param       $cookieName             Cookie to refresh
+        * @return      void
+        */
+       public function refreshCookie ($cookieName) {
+               // Only update existing cookies
+               if (isset($_COOKIE[$cookieName])) {
+                       // Update the cookie
+                       $this->addCookie($cookieName, $_COOKIE[$cookieName], false);
+               } // END - if
+       }
+}
+
+// [EOF]
+?>
index 1e702c9..15f4373 100644 (file)
@@ -122,7 +122,7 @@ class RandomNumberGenerator extends BaseFrameworkSystem {
                }
 
                // One-way data we need for "extra-salting" the random number
-               $this->extraSalt = sha1($this->fixedSalt . ":" . getenv('SERVER_SOFTWARE') . ":" . $this->getConfigInstance()->readConfig('date_key'));
+               $this->extraSalt = sha1($this->fixedSalt . ":" . getenv('SERVER_SOFTWARE') . ":" . $this->getConfigInstance()->readConfig('date_key') . $this->getConfigInstance()->readConfig('base_url'));
 
                // Get config entry for max salt length
                $this->rndStrLen = $this->getConfigInstance()->readConfig('rnd_str_length');
diff --git a/inc/classes/main/template/class_BaseTemplateEngine.php b/inc/classes/main/template/class_BaseTemplateEngine.php
new file mode 100644 (file)
index 0000000..7188fda
--- /dev/null
@@ -0,0 +1,1184 @@
+<?php
+/**
+ * A generic template engine
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @license            GNU GPL 3.0 or any newer version
+ * @link               http://www.ship-simu.org
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+class BaseTemplateEngine extends BaseFrameworkSystem {
+       /**
+        * The local path name where all templates and sub folders for special
+        * templates are stored. We will internally determine the language plus
+        * "html" for web templates or "emails" for email templates
+        */
+       private $basePath = "";
+
+       /**
+        * Template type
+        */
+       private $templateType = "html";
+
+       /**
+        * The extension for web and email templates (not compiled templates)
+        */
+       private $templateExtension = ".tpl";
+
+       /**
+        * The extension for code templates (not compiled templates)
+        */
+       private $codeExtension = ".ctp";
+
+       /**
+        * Path relative to $basePath and language code for compiled code-templates
+        */
+       private $compileOutputPath = "templates/_compiled";
+
+       /**
+        * The raw (maybe uncompiled) template
+        */
+       private $rawTemplateData = "";
+
+       /**
+        * Template data with compiled-in variables
+        */
+       private $compiledData = "";
+
+       /**
+        * The last loaded template's FQFN for debugging the engine
+        */
+       private $lastTemplate = "";
+
+       /**
+        * The variable stack for the templates. This must be initialized and
+        * shall become an instance of FrameworkArrayObject.
+        */
+       private $varStack = null;
+
+       /**
+        * Configuration variables in a simple array
+        */
+       private $configVariables = array();
+
+       /**
+        * Loaded templates for recursive protection and detection
+        */
+       private $loadedTemplates = array();
+
+       /**
+        * Compiled templates for recursive protection and detection
+        */
+       private $compiledTemplates = array();
+
+       /**
+        * Loaded raw template data
+        */
+       private $loadedRawData = null;
+
+       /**
+        * Raw templates which are linked in code templates
+        */
+       private $rawTemplates = null;
+
+       /**
+        * A regular expression for variable=value pairs
+        */
+       private $regExpVarValue = '/([\w_]+)(="([^"]*)"|=([\w_]+))?/';
+
+       /**
+        * A regular expression for filtering out code tags
+        *
+        * E.g.: {?template:variable=value;var2=value2;[...]?}
+        */
+       private $regExpCodeTags = '/\{\?([a-z_]+)(:("[^"]+"|[^?}]+)+)?\?\}/';
+
+       /**
+        * Loaded helpers
+        */
+       private $helpers = array();
+
+       // Exception codes for the template engine
+       const EXCEPTION_TEMPLATE_TYPE_IS_UNEXPECTED   = 0x020;
+       const EXCEPTION_TEMPLATE_CONTAINS_INVALID_VAR = 0x021;
+       const EXCEPTION_INVALID_VIEW_HELPER           = 0x022;
+
+       /**
+        * Initialize the variable stack. This holds all variables for later
+        * compilation.
+        *
+        * @return      void
+        */
+       public final function initVariableStack () {
+               $this->varStack = new FrameworkArrayObject("FakedVariableStack");
+       }
+
+       /**
+        * Protected constructor
+        *
+        * @param       $className      Name of the class
+        * @return      void
+        */
+       protected function __construct ($className) {
+               // Call parent constructor
+               parent::__construct($className);
+
+               // Clean up a little
+               $this->removeNumberFormaters();
+               $this->removeSystemArray();
+       }
+
+       /**
+        * Search for a variable in the stack
+        *
+        * @param       $var    The variable we are looking for
+        * @return      $idx    FALSE means not found, >=0 means found on a specific index
+        */
+       private function isVariableAlreadySet ($var) {
+               // First everything is not found
+               $found = false;
+
+               // Now search for it
+               for ($idx = $this->varStack->getIterator(); $idx->valid(); $idx->next()) {
+                       // Get current item
+                       $currEntry = $idx->current();
+
+                       // Is the entry found?
+                       if ($currEntry['name'] == $var) {
+                               // Found!
+                               $found = $idx->key();
+                               break;
+                       }
+               }
+
+               // Return the current position
+               return $found;
+       }
+
+       /**
+        * Return a content of a variable or null if not found
+        *
+        * @param       $var            The variable we are looking for
+        * @return      $content        Content of the variable or null if not found
+        */
+       private function readVariable ($var) {
+               // First everything is not found
+               $content = null;
+
+               // Now search for it
+               for ($idx = $this->varStack->getIterator(); $idx->valid(); $idx->next()) {
+                       // Get current item
+                       $currEntry = $idx->current();
+
+                       // Is the entry found?
+                       if ($currEntry['name'] == $var) {
+                               // Found!
+                               $content = $currEntry['value'];
+                               break;
+                       }
+               }
+
+               // Return the current position
+               return $content;
+       }
+
+       /**
+        * Add a variable to the stack
+        *
+        * @param       $var    The variable we are looking for
+        * @param       $value  The value we want to store in the variable
+        * @return      void
+        */
+       private function addVariable ($var, $value) {
+               // Add it to the stack
+               $this->varStack->append(array(
+                       'name'  => trim($var),
+                       'value' => trim($value)
+               ));
+       }
+
+       /**
+        * Modify an entry on the stack
+        *
+        * @param       $var    The variable we are looking for
+        * @param       $value  The value we want to store in the variable
+        * @return      void
+        */
+       private function modifyVariable ($var, $value) {
+               // It should be there so let's look again...
+               for ($idx = $this->varStack->getIterator(); $idx->valid(); $idx->next()) {
+                       // Get current entry
+                       $currEntry = $idx->current();
+
+                       // Is this the requested variable?
+                       if ($currEntry['name'] == $var) {
+                               // Change it to the other value
+                               $this->varStack->offsetSet($idx->key(), array(
+                                       'name'  => $var,
+                                       'value' => $value
+                               ));
+                       }
+               }
+       }
+
+       /**
+        * Setter for template type. Only "html", "emails" and "compiled" should
+        * be sent here
+        *
+        * @param       $templateType   The current template's type
+        * @return      void
+        */
+       private final function setTemplateType ($templateType) {
+               // Cast it
+               $templateType = (string) $templateType;
+
+               // And set it (only 2 letters)
+               $this->templateType = $templateType;
+       }
+
+       /**
+        * Setter for the last loaded template's FQFN
+        *
+        * @param       $template       The last loaded template
+        * @return      void
+        */
+       private final function setLastTemplate ($template) {
+               // Cast it to string
+               $template = (string) $template;
+               $this->lastTemplate = $template;
+       }
+
+       /**
+        * Getter for the last loaded template's FQFN
+        *
+        * @return      $template       The last loaded template
+        */
+       private final function getLastTemplate () {
+               return $this->lastTemplate;
+       }
+
+       /**
+        * Setter for base path
+        *
+        * @param               $basePath               The local base path for all templates
+        * @return      void
+        */
+       public final function setBasePath ($basePath) {
+               // Cast it
+               $basePath = (string) $basePath;
+
+               // And set it
+               $this->basePath = $basePath;
+       }
+
+       /**
+        * Getter for base path
+        *
+        * @return      $basePath               The local base path for all templates
+        */
+       public final function getBasePath () {
+               // And set it
+               return $this->basePath;
+       }
+
+       /**
+        * Setter for template extension
+        *
+        * @param               $templateExtension      The file extension for all uncompiled
+        *                                                      templates
+        * @return      void
+        */
+       public final function setRawTemplateExtension ($templateExtension) {
+               // Cast it
+               $templateExtension = (string) $templateExtension;
+
+               // And set it
+               $this->templateExtension = $templateExtension;
+       }
+
+       /**
+        * Setter for code template extension
+        *
+        * @param               $codeExtension          The file extension for all uncompiled
+        *                                                      templates
+        * @return      void
+        */
+       public final function setCodeTemplateExtension ($codeExtension) {
+               // Cast it
+               $codeExtension = (string) $codeExtension;
+
+               // And set it
+               $this->codeExtension = $codeExtension;
+       }
+
+       /**
+        * Getter for template extension
+        *
+        * @return      $templateExtension      The file extension for all uncompiled
+        *                                                      templates
+        */
+       public final function getRawTemplateExtension () {
+               // And set it
+               return $this->templateExtension;
+       }
+
+       /**
+        * Getter for code-template extension
+        *
+        * @return      $codeExtension          The file extension for all code-
+        *                                                      templates
+        */
+       public final function getCodeTemplateExtension () {
+               // And set it
+               return $this->codeExtension;
+       }
+
+       /**
+        * Setter for path of compiled templates
+        *
+        * @param       $compileOutputPath      The local base path for all compiled
+        *                                                              templates
+        * @return      void
+        */
+       public final function setCompileOutputPath ($compileOutputPath) {
+               // Cast it
+               $compileOutputPath = (string) $compileOutputPath;
+
+               // And set it
+               $this->compileOutputPath = $compileOutputPath;
+       }
+
+       /**
+        * Getter for template type
+        *
+        * @return      $templateType   The current template's type
+        */
+       public final function getTemplateType () {
+               return $this->templateType;
+       }
+
+       /**
+        * Assign (add) a given variable with a value
+        *
+        * @param       $var    The variable we are looking for
+        * @param       $value  The value we want to store in the variable
+        * @return      void
+        */
+       public final function assignVariable ($var, $value) {
+               // First search for the variable if it was already added
+               $idx = $this->isVariableAlreadySet($var);
+
+               // Was it found?
+               if ($idx === false) {
+                       // Add it to the stack
+                       $this->addVariable($var, $value);
+               } elseif (!empty($value)) {
+                       // Modify the stack entry
+                       $this->modifyVariable($var, $value);
+               }
+       }
+
+       /**
+        * Removes a given variable
+        *
+        * @param       $var    The variable we are looking for
+        * @return      void
+        */
+       public final function removeVariable ($var) {
+               // First search for the variable if it was already added
+               $idx = $this->isVariableAlreadySet($var);
+
+               // Was it found?
+               if ($idx !== false) {
+                       // Remove this variable
+                       $this->varStack->offsetUnset($idx);
+               }
+       }
+
+       /**
+        * Private setter for raw template data
+        *
+        * @param       $rawTemplateData        The raw data from the template
+        * @return      void
+        */
+       private final function setRawTemplateData ($rawTemplateData) {
+               // Cast it to string
+               $rawTemplateData = (string) $rawTemplateData;
+
+               // And store it in this class
+               $this->rawTemplateData = $rawTemplateData;
+       }
+
+       /**
+        * Private setter for compiled templates
+        *
+        * @return      void
+        */
+       private final function setCompiledData ($compiledData) {
+               // Cast it to string
+               $compiledData = (string) $compiledData;
+
+               // And store it in this class
+               $this->compiledData = $compiledData;
+       }
+
+       /**
+        * Private loader for all template types
+        *
+        * @param       $template       The template we shall load
+        * @return      void
+        */
+       private function loadTemplate ($template) {
+               // Cast it to string
+               $template = (string) $template;
+
+               // Get extension for the template
+               $ext = $this->getRawTemplateExtension();
+
+               // If we shall load a code-template we need to switch the file extension
+               if ($this->getTemplateType() == $this->getConfigInstance()->readConfig('code_template_type')) {
+                       // Switch over to the code-template extension
+                       $ext = $this->getCodeTemplateExtension();
+               } // END - if
+
+               // Construct the FQFN for the template by honoring the current language
+               $fqfn = sprintf("%s%s/%s/%s%s",
+                       $this->getBasePath(),
+                       $this->getLanguageInstance()->getLanguageCode(),
+                       $this->getTemplateType(),
+                       $template,
+                       $ext
+               );
+
+               // Load the raw template data
+               $this->loadRawTemplateData($fqfn);
+       }
+
+       /**
+        * A private loader for raw template names
+        *
+        * @param       $fqfn   The full-qualified file name for a template
+        * @return      void
+        * @throws      NullPointerException    If $inputInstance is null
+        * @throws      NoObjectException               If $inputInstance is not an object
+        * @throws      MissingMethodException  If $inputInstance is missing a
+        *                                                                      required method
+        */
+       private function loadRawTemplateData ($fqfn) {
+               // Get a input/output instance from the middleware
+               $ioInstance = $this->getFileIoInstance();
+
+               // Validate the instance
+               if (is_null($ioInstance)) {
+                       // Throw exception
+                       throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER);
+               } elseif (!is_object($ioInstance)) {
+                       // Throw another exception
+                       throw new NoObjectException($ioInstance, self::EXCEPTION_IS_NO_OBJECT);
+               } elseif (!method_exists($ioInstance, 'loadFileContents')) {
+                       // Throw yet another exception
+                       throw new MissingMethodException(array($ioInstance, 'loadFileContents'), self::EXCEPTION_MISSING_METHOD);
+               }
+
+               /* DEBUG: */ echo __METHOD__.": FQFN=".$fqfn."<br />\n";
+
+               // Load the raw template
+               $rawTemplateData = $ioInstance->loadFileContents($fqfn);
+
+               // Store the template's contents into this class
+               $this->setRawTemplateData($rawTemplateData);
+
+               // Remember the template's FQFN
+               $this->setLastTemplate($fqfn);
+       }
+
+       /**
+        * Try to assign an extracted template variable as a "content" or "config"
+        * variable.
+        *
+        * @param       $varName        The variable's name (shall be content orconfig) by
+        *                                              default
+        * @param       $var            The variable we want to assign
+        */
+       private function assignTemplateVariable ($varName, $var) {
+               // Is it not a config variable?
+               if ($varName != "config") {
+                       // Regular template variables
+                       $this->assignVariable($var, "");
+               } else {
+                       // Configuration variables
+                       $this->assignConfigVariable($var);
+               }
+       }
+
+       /**
+        * Extract variables from a given raw data stream
+        *
+        * @param       $rawData        The raw template data we shall analyze
+        * @return      void
+        */
+       private function extractVariablesFromRawData ($rawData) {
+               // Cast to string
+               $rawData = (string) $rawData;
+
+               // Search for variables
+               @preg_match_all('/\$(\w+)(\[(\w+)\])?/', $rawData, $variableMatches);
+
+               // Did we find some variables?
+               if ((is_array($variableMatches)) && (count($variableMatches) == 4) && (count($variableMatches[0]) > 0)) {
+                       // Initialize all missing variables
+                       foreach ($variableMatches[3] as $key=>$var) {
+                               // Try to assign it, empty strings are being ignored
+                               $this->assignTemplateVariable($variableMatches[1][$key], $var);
+                       } // END - foreach
+               } // END - if
+       }
+
+       /**
+        * Main analysis of the loaded template
+        *
+        * @param       $templateMatches        Found template place-holders, see below
+        * @return      void
+        *
+        *---------------------------------
+        * Structure of $templateMatches:
+        *---------------------------------
+        * [0] => Array - An array with all full matches
+        * [1] => Array - An array with left part (before the ":") of a match
+        * [2] => Array - An array with right part of a match including ":"
+        * [3] => Array - An array with right part of a match excluding ":"
+        */
+       private function analyzeTemplate (array $templateMatches) {
+               // Backup raw template data
+               $backup = $this->getRawTemplateData();
+
+               // Initialize some arrays
+               if (is_null($this->loadedRawData)) { $this->loadedRawData = array(); $this->rawTemplates = array(); }
+
+               // Load all requested templates
+               foreach ($templateMatches[1] as $template) {
+
+                       // Load and compile only templates which we have not yet loaded
+                       // RECURSIVE PROTECTION! BE CAREFUL HERE!
+                       if ((!isset($this->loadedRawData[$template])) && (!in_array($template, $this->loadedTemplates))) {
+
+                               // Template not found, but maybe variable assigned?
+                               if ($this->isVariableAlreadySet($template) !== false) {
+                                       // Use that content here
+                                       $this->loadedRawData[$template] = $this->readVariable($template);
+
+                                       // Recursive protection:
+                                       $this->loadedTemplates[] = $template;
+                               } else {
+                                       // Then try to search for code-templates
+                                       try {
+                                               // Load the code template and remember it's contents
+                                               $this->loadCodeTemplate($template);
+                                               $this->loadedRawData[$template] = $this->getRawTemplateData();
+
+                                               // Remember this template for recursion detection
+                                               // RECURSIVE PROTECTION!
+                                               $this->loadedTemplates[] = $template;
+                                       } catch (FileNotFoundException $e) {
+                                               // Even this is not done... :/
+                                               $this->rawTemplates[] = $template;
+                                       } catch (FilePointerNotOpenedException $e) {
+                                               // Even this is not done... :/
+                                               $this->rawTemplates[] = $template;
+                                       }
+                               }
+                       } // END - if
+               } // END - foreach
+
+               // Restore the raw template data
+               $this->setRawTemplateData($backup);
+       }
+
+       /**
+        * Compile a given raw template code and remember it for later usage
+        *
+        * @param       $code           The raw template code
+        * @param       $template       The template's name
+        * @return      void
+        */
+       private function compileCode ($code, $template) {
+               // Is this template already compiled?
+               if (in_array($template, $this->compiledTemplates)) {
+                       // Abort here...
+                       return;
+               }
+
+               // Remember this template being compiled
+               $this->compiledTemplates[] = $template;
+
+               // Compile the loaded code in five steps:
+               //
+               // 1. Backup current template data
+               $backup = $this->getRawTemplateData();
+
+               // 2. Set the current template's raw data as the new content
+               $this->setRawTemplateData($code);
+
+               // 3. Compile the template data
+               $this->compileTemplate();
+
+               // 4. Remember it's contents
+               $this->loadedRawData[$template] = $this->getRawTemplateData();
+
+               // 5. Restore the previous raw content from backup variable
+               $this->setRawTemplateData($backup);
+       }
+
+       /**
+        * Insert all given and loaded templates by running through all loaded
+        * codes and searching for their place-holder in the main template
+        *
+        * @param       $templateMatches        See method analyzeTemplate()
+        * @return      void
+        */
+       private function insertAllTemplates (array $templateMatches) {
+               // Run through all loaded codes
+               foreach ($this->loadedRawData as $template=>$code) {
+
+                       // Search for the template
+                       $foundIndex = array_search($template, $templateMatches[1]);
+
+                       // Lookup the matching template replacement
+                       if (($foundIndex !== false) && (isset($templateMatches[0][$foundIndex]))) {
+
+                               // Get the current raw template
+                               $rawData = $this->getRawTemplateData();
+
+                               // Replace the space holder with the template code
+                               $rawData = str_replace($templateMatches[0][$foundIndex], $code, $rawData);
+
+                               // Set the new raw data
+                               $this->setRawTemplateData($rawData);
+
+                       } // END - if
+
+               } // END - foreach
+       }
+
+       /**
+        * Load all extra raw templates
+        *
+        * @return      void
+        */
+       private function loadExtraRawTemplates () {
+               // Are there some raw templates we need to load?
+               if (count($this->rawTemplates) > 0) {
+                       // Try to load all raw templates
+                       foreach ($this->rawTemplates as $key => $template) {
+                               try {
+                                       // Load the template
+                                       $this->loadWebTemplate($template);
+
+                                       // Remember it's contents
+                                       $this->rawTemplates[$template] = $this->getRawTemplateData();
+
+                                       // Remove it from the loader list
+                                       unset($this->rawTemplates[$key]);
+
+                                       // Remember this template for recursion detection
+                                       // RECURSIVE PROTECTION!
+                                       $this->loadedTemplates[] = $template;
+                               } catch (FileNotFoundException $e) {
+                                       // This template was never found. We silently ignore it
+                                       unset($this->rawTemplates[$key]);
+                               } catch (FilePointerNotOpenedException $e) {
+                                       // This template was never found. We silently ignore it
+                                       unset($this->rawTemplates[$key]);
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Assign all found template variables
+        *
+        * @param       $varMatches             An array full of variable/value pairs.
+        * @return      void
+        * @todo        Unfinished work or don't die here.
+        */
+       private function assignAllVariables (array $varMatches) {
+               // Search for all variables
+               foreach ($varMatches[1] as $key=>$var) {
+
+                       // Detect leading equals
+                       if (substr($varMatches[2][$key], 0, 1) == "=") {
+                               // Remove and cast it
+                               $varMatches[2][$key] = (string) substr($varMatches[2][$key], 1);
+                       }
+
+                       // Do we have some quotes left and right side? Then it is free text
+                       if ((substr($varMatches[2][$key], 0, 1) == "\"") && (substr($varMatches[2][$key], -1, 1) == "\"")) {
+                               // Free string detected! Which we can assign directly
+                               $this->assignVariable($var, $varMatches[3][$key]);
+                       } elseif (!empty($varMatches[2][$key])) {
+                               // Non-string found so we need some deeper analysis...
+                               die("Deeper analysis not yet implemented!");
+                       }
+
+               } // for ($varMatches ...
+       }
+       /**
+        * Compiles all loaded raw templates
+        *
+        * @param               $templateMatches        See method analyzeTemplate() for details
+        * @return      void
+        */
+       private function compileRawTemplateData (array $templateMatches) {
+               // Are some code-templates found which we need to compile?
+               if (count($this->loadedRawData) > 0) {
+
+                       // Then compile all!
+                       foreach ($this->loadedRawData as $template=>$code) {
+
+                               // Is this template already compiled?
+                               if (in_array($template, $this->compiledTemplates)) {
+                                       // Then skip it
+                                       continue;
+                               }
+
+                               // Search for the template
+                               $foundIndex = array_search($template, $templateMatches[1]);
+
+                               // Lookup the matching variable data
+                               if (($foundIndex !== false) && (isset($templateMatches[3][$foundIndex]))) {
+
+                                       // Split it up with another reg. exp. into variable=value pairs
+                                       preg_match_all($this->regExpVarValue, $templateMatches[3][$foundIndex], $varMatches);
+
+                                       // Assign all variables
+                                       $this->assignAllVariables($varMatches);
+
+                               } // END - if (isset($templateMatches ...
+
+                               // Compile the loaded template
+                               $this->compileCode($code, $template);
+
+                       } // END - foreach ($this->loadedRawData ...
+
+                       // Insert all templates
+                       $this->insertAllTemplates($templateMatches);
+
+               } // END - if (count($this->loadedRawData) ...
+       }
+
+       /**
+        * Inserts all raw templates into their respective variables
+        *
+        * @return      void
+        */
+       private function insertRawTemplates () {
+               // Load all templates
+               foreach ($this->rawTemplates as $template=>$content) {
+                       // Set the template as a variable with the content
+                       $this->assignVariable($template, $content);
+               }
+       }
+
+       /**
+        * Finalizes the compilation of all template variables
+        *
+        * @return      void
+        */
+       private function finalizeVariableCompilation () {
+               // Get the content
+               $content = $this->getRawTemplateData();
+
+               // Walk through all variables
+               for ($idx = $this->varStack->getIterator(); $idx->valid(); $idx->next()) {
+                       // Get current entry
+                       $currEntry = $idx->current();
+
+                       // Replace all [$var] or {?$var?} with the content
+                       //* DEBUG: */ echo "name=".$currEntry['name'].", value=<pre>".htmlentities($currEntry['value'])."</pre>\n";
+                       $content = str_replace("\$content[".$currEntry['name']."]", $currEntry['value'], $content);
+                       $content = str_replace("[".$currEntry['name']."]", $currEntry['value'], $content);
+                       $content = str_replace("{?".$currEntry['name']."?}", $currEntry['value'], $content);
+               } // END - for
+
+               // Set the content back
+               $this->setRawTemplateData($content);
+       }
+
+       /**
+        * Getter for raw template data
+        *
+        * @return      $rawTemplateData        The raw data from the template
+        */
+       public final function getRawTemplateData () {
+               return $this->rawTemplateData;
+       }
+
+       /**
+        * Getter for compiled templates
+        */
+       public final function getCompiledData () {
+               return $this->compiledData;
+       }
+
+       /**
+        * Load a specified web template into the engine
+        *
+        * @param               $template               The web template we shall load which is
+        *                                              located in "html" by default
+        * @return      void
+        */
+       public function loadWebTemplate ($template) {
+               // Set template type
+               $this->setTemplateType($this->getConfigInstance()->readConfig('web_template_type'));
+
+               // Load the special template
+               $this->loadTemplate($template);
+       }
+
+       /**
+        * Assign a given congfiguration variable with a value
+        *
+        * @param       $var    The configuration variable we want to assign
+        * @return      void
+        */
+       public function assignConfigVariable ($var) {
+               // Sweet and simple...
+               $this->configVariables[$var] = $this->getConfigInstance()->readConfig($var);
+       }
+
+       /**
+        * Load a specified email template into the engine
+        *
+        * @param               $template               The email template we shall load which is
+        *                                              located in "emails" by default
+        * @return      void
+        */
+       public function loadEmailTemplate ($template) {
+               // Set template type
+               $this->setTemplateType($this->getConfigInstance()->readConfig('email_template_type'));
+
+               // Load the special template
+               $this->loadTemplate($template);
+       }
+
+       /**
+        * Load a specified code template into the engine
+        *
+        * @param               $template               The code template we shall load which is
+        *                                              located in "code" by default
+        * @return      void
+        */
+       public function loadCodeTemplate ($template) {
+               // Set template type
+               $this->setTemplateType($this->getConfigInstance()->readConfig('code_template_type'));
+
+               // Load the special template
+               $this->loadTemplate($template);
+       }
+
+       /**
+        * Compile all variables by inserting their respective values
+        *
+        * @return      void
+        * @todo        Make this code some nicer...
+        */
+       public final function compileVariables () {
+               // Initialize the $content array
+               $validVar = $this->getConfigInstance()->readConfig('tpl_valid_var');
+               $dummy = array();
+
+               // Iterate through all variables
+               for ($idx = $this->varStack->getIterator(); $idx->valid(); $idx->next()) {
+
+                       // Get current variable from the stack
+                       $currVariable = $idx->current();
+
+                       // Transfer it's name/value combination to the $content array
+                       //* DEBUG: */ echo $currVariable['name']."=<pre>".htmlentities($currVariable['value'])."</pre>\n";
+                       $dummy[$currVariable['name']] = $currVariable['value'];
+
+               }// END - if
+
+               // Set the new variable (don't remove the second dollar !)
+               $$validVar = $dummy;
+
+               // Prepare all configuration variables
+               $config = $this->configVariables;
+
+               // Remove some variables
+               unset($idx);
+               unset($currVariable);
+
+               // Run the compilation twice to get content from helper classes in
+               $cnt = 0;
+               while ($cnt < 3) {
+                       // Finalize the compilation of template variables
+                       $this->finalizeVariableCompilation();
+
+                       // Prepare the eval() command for comiling the template
+                       $eval = sprintf("\$result = \"%s\";",
+                               addslashes($this->getRawTemplateData())
+                       );
+
+                       // This loop does remove the backslashes (\) in PHP parameters
+                       while (strpos($eval, "<?") !== false) {
+                               // Get left part before "<?"
+                               $evalLeft = substr($eval, 0, strpos($eval, "<?"));
+
+                               // Get all from right of "<?"
+                               $evalRight = substr($eval, (strpos($eval, "<?") + 2));
+
+                               // Is this a full PHP tag?
+                               if (substr(strtolower($evalRight), 0, 3) == "php") {
+                                       // Remove "php" string from full PHP tag
+                                       $evalRight = substr($evalRight, 3);
+                               } // END - if
+
+                               // Cut middle part out and remove escapes
+                               $evalMiddle = trim(substr($evalRight, 0, strpos($evalRight, "?>")));
+                               $evalMiddle = stripslashes($evalMiddle);
+
+                               // Remove the middle part from right one
+                               $evalRight = substr($evalRight, (strpos($evalRight, "?>") + 2));
+
+                               // And put all together
+                               $eval = sprintf("%s<%%php %s %%>%s", $evalLeft, $evalMiddle, $evalRight);
+                       } // END - while
+
+                       // Prepare PHP code for eval() command
+                       $evalLength = strlen($eval);
+                       $eval = str_replace(
+                               "<%php", "\";",
+                               str_replace(
+                                       "%>", "\n\$result .= \"", $eval
+                               )
+                       );
+
+                       // Did something change?
+                       if (strlen($eval) != $eval) {
+                               // Run the constructed command. This will "compile" all variables in
+                               @eval($eval);
+                       } // END - if
+
+                       // Goes something wrong?
+                       if (!isset($result)) {
+                               // Output eval command
+                               $this->debugOutput(sprintf("Failed eval() code: <pre>%s</pre>", $this->markupCode($eval, true)), true);
+
+                               // Output backtrace here
+                               $this->debugBacktrace();
+                       } // END - if
+
+                       // Set raw template data
+                       $this->setRawTemplateData($result);
+                       $cnt++;
+               }
+
+               // Set the new content
+               $this->setCompiledData($result);
+       }
+
+       /**
+        * Compile all required templates into the current loaded one
+        *
+        * @return      void
+        * @throws      UnexpectedTemplateTypeException If the template type is
+        *                                                                                      not "code"
+        * @throws      InvalidArrayCountException              If an unexpected array
+        *                                                                                      count has been found
+        */
+       public final function compileTemplate () {
+               // We will only work with template type "code" from configuration
+               if ($this->getTemplateType() != $this->getConfigInstance()->readConfig('code_template_type')) {
+                       // Abort here
+                       throw new UnexpectedTemplateTypeException(array($this, $this->getTemplateType(), $this->getConfigInstance()->readConfig('code_template_type')), self::EXCEPTION_TEMPLATE_TYPE_IS_UNEXPECTED);
+               } // END - if
+
+               // Get the raw data.
+               $rawData = $this->getRawTemplateData();
+
+               // Remove double spaces and trim leading/trailing spaces
+               $rawData = trim(str_replace("  ", " ", $rawData));
+
+               // Search for raw variables
+               $this->extractVariablesFromRawData($rawData);
+
+               // Search for code-tags which are {? ?}
+               preg_match_all($this->regExpCodeTags, $rawData, $templateMatches);
+
+               // Analyze the matches array
+               if ((is_array($templateMatches)) && (count($templateMatches) == 4) && (count($templateMatches[0]) > 0)) {
+                       // Entries are found:
+                       //
+                       // The main analysis
+                       $this->analyzeTemplate($templateMatches);
+
+                       // Compile raw template data
+                       $this->compileRawTemplateData($templateMatches);
+
+                       // Are there some raw templates left for loading?
+                       $this->loadExtraRawTemplates();
+
+                       // Are some raw templates found and loaded?
+                       if (count($this->rawTemplates) > 0) {
+
+                               // Insert all raw templates
+                               $this->insertRawTemplates();
+
+                               // Remove the raw template content as well
+                               $this->setRawTemplateData("");
+
+                       } // END - if
+
+               } // END - if($templateMatches ...
+       }
+
+       /**
+        * Output the compiled page to the outside world. In case of web templates
+        * this would be vaild (X)HTML code. And in case of email templates this
+        * would store a prepared email body inside the template engine.
+        *
+        * @return      void
+        */
+       public final function output () {
+               // Check which type of template we have
+               switch ($this->getTemplateType()) {
+               case "html": // Raw HTML templates can be send to the output buffer
+                       // Quick-N-Dirty:
+                       $this->getWebOutputInstance()->output($this->getCompiledData());
+                       break;
+
+               default: // Unknown type found
+                       // Construct message
+                       $msg = sprintf("[%s-&gt;%s] Unknown/unsupported template type <strong>%s</strong> detected.",
+                               $this->__toString(),
+                               __FUNCTION__,
+                               $this->getTemplateType()
+                       );
+
+                       // Write the problem to the world...
+                       $this->debugOutput($msg);
+                       break;
+               }
+       }
+
+       /**
+        * Loads a given view helper (by name)
+        *
+        * @param       $helperName     The helper's name
+        * @return      void
+        * @throws      ViewHelperNotFoundException     If the given view helper was not found
+        */
+       protected function loadViewHelper ($helperName) {
+               // Make first character upper case, rest low
+               $helperName = ucfirst($helperName);
+
+               // Is this view helper loaded?
+               if (!isset($this->helpers[$helperName])) {
+                       // Create a class name
+                       $className = "{$helperName}ViewHelper";
+
+                       // Does this class exists?
+                       if (!class_exists($className)) {
+                               // Abort here!
+                               throw new ViewHelperNotFoundException(array($this, $helperName), self::EXCEPTION_INVALID_VIEW_HELPER);
+                       }
+
+                       // Generate new instance
+                       $eval = sprintf("\$this->helpers[%s] = %s::create%s();",
+                               $helperName,
+                               $className,
+                               $className
+                       );
+
+                       // Run the code
+                       eval($eval);
+               }
+
+               // Return the requested instance
+               return $this->helpers[$helperName];
+       }
+
+       /**
+        * Assigns the last loaded raw template content with a given variable
+        *
+        * @param       $templateName   Name of the template we want to assign
+        * @param       $variableName   Name of the variable we want to assign
+        * @return      void
+        */
+       public function assignTemplateWithVariable ($templateName, $variableName) {
+               // Get the content from last loaded raw template
+               $content = $this->getRawTemplateData();
+
+               // Assign the variable
+               $this->assignVariable($variableName, $content);
+
+               // Purge raw content
+               $this->setRawTemplateData("");
+       }
+
+       /**
+        * Transfers the content of this template engine to a given response instance
+        *
+        * @param       $responseInstance       An instance of a response class
+        * @return      void
+        */
+       public function transferToResponse (Responseable $responseInstance) {
+               // Get the content and set it in the response class
+               $responseInstance->writeToBody($this->getCompiledData());
+       }
+
+       /**
+        * Assigns all the application data with template variables
+        *
+        * @param       $appInstance    A manageable application instance
+        * @return      void
+        */
+       public function assignApplicationData (ManageableApplication $appInstance) {
+               // Get long name and assign it
+               $this->assignVariable("app_full_name" , $appInstance->getAppName());
+
+               // Get short name and assign it
+               $this->assignVariable("app_short_name", $appInstance->getAppShortName());
+
+               // Get version number and assign it
+               $this->assignVariable("app_version"   , $appInstance->getAppVersion());
+       }
+
+       /**
+        * "Compiles" a variable by replacing {?var?} with it's content
+        *
+        * @param       $rawCode        Raw code to compile
+        * @return      $rawCode        Compile code with inserted variable value
+        */
+       protected function compileRawCode ($rawCode) {
+               // Find the variables
+               preg_match_all($this->regExpVarValue, $rawCode, $varMatches);
+
+               // Compile all variables
+               foreach ($varMatches[0] as $match) {
+                       // Replace the variable with it's value, if found
+                       $rawCode = str_replace("{?".$match."?}", $this->readVariable($match), $rawCode);
+               } // END - foreach
+
+               // Return the compiled data
+               return $rawCode;
+       }
+}
+
+// [EOF]
+?>
diff --git a/inc/classes/main/template/class_TemplateEngine.php b/inc/classes/main/template/class_TemplateEngine.php
deleted file mode 100644 (file)
index 23ac8b4..0000000
+++ /dev/null
@@ -1,1221 +0,0 @@
-<?php
-/**
- * The own template engine for loading caching and sending out the web pages
- * and emails.
- *
- * @author             Roland Haeder <webmaster@ship-simu.org>
- * @version            0.0.0
- * @copyright  Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license            GNU GPL 3.0 or any newer version
- * @link               http://www.ship-simu.org
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate {
-       /**
-        * The local path name where all templates and sub folders for special
-        * templates are stored. We will internally determine the language plus
-        * "html" for web templates or "emails" for email templates
-        */
-       private $basePath = "";
-
-       /**
-        * The extension for web and email templates (not compiled templates)
-        */
-       private $templateExtension = ".tpl";
-
-       /**
-        * The extension for code templates (not compiled templates)
-        */
-       private $codeExtension = ".ctp";
-
-       /**
-        * Path relative to $basePath and language code for compiled code-templates
-        */
-       private $compileOutputPath = "templates/_compiled";
-
-       /**
-        * The raw (maybe uncompiled) template
-        */
-       private $rawTemplateData = "";
-
-       /**
-        * Template data with compiled-in variables
-        */
-       private $compiledData = "";
-
-       /**
-        * The last loaded template's FQFN for debugging the engine
-        */
-       private $lastTemplate = "";
-
-       /**
-        * The variable stack for the templates. This must be initialized and
-        * shall become an instance of FrameworkArrayObject.
-        */
-       private $varStack = null;
-
-       /**
-        * Configuration variables in a simple array
-        */
-       private $configVariables = array();
-
-       /**
-        * Loaded templates for recursive protection and detection
-        */
-       private $loadedTemplates = array();
-
-       /**
-        * Compiled templates for recursive protection and detection
-        */
-       private $compiledTemplates = array();
-
-       /**
-        * Loaded raw template data
-        */
-       private $loadedRawData = null;
-
-       /**
-        * Raw templates which are linked in code templates
-        */
-       private $rawTemplates = null;
-
-       /**
-        * A regular expression for variable=value pairs
-        */
-       private $regExpVarValue = '/([\w_]+)(="([^"]*)"|=([\w_]+))?/';
-
-       /**
-        * A regular expression for filtering out code tags
-        *
-        * E.g.: {?template:variable=value;var2=value2;[...]?}
-        */
-       private $regExpCodeTags = '/\{\?([a-z_]+)(:("[^"]+"|[^?}]+)+)?\?\}/';
-
-       /**
-        * Loaded helpers
-        */
-       private $helpers = array();
-
-       // Exception codes for the template engine
-       const EXCEPTION_TEMPLATE_TYPE_IS_UNEXPECTED   = 0x020;
-       const EXCEPTION_TEMPLATE_CONTAINS_INVALID_VAR = 0x021;
-       const EXCEPTION_INVALID_VIEW_HELPER           = 0x022;
-
-       /**
-        * Protected constructor
-        *
-        * @return      void
-        */
-       protected function __construct () {
-               // Call parent constructor
-               parent::__construct(__CLASS__);
-
-               // Set part description
-               $this->setObjectDescription("Web template engine");
-
-               // Create unique ID number
-               $this->generateUniqueId();
-
-               // Clean up a little
-               $this->removeNumberFormaters();
-               $this->removeSystemArray();
-       }
-
-       /**
-        * Creates an instance of the class TemplateEngine and prepares it for usage
-        *
-        * @param       $basePath               The local base path for all templates
-        * @param       $langInstance   An instance of LanguageSystem (default)
-        * @param       $ioInstance             An instance of FileIoHandler (default, middleware!)
-        * @return      $tplInstance    An instance of TemplateEngine
-        * @throws      BasePathIsEmptyException                If the provided $basePath is empty
-        * @throws      InvalidBasePathStringException  If $basePath is no string
-        * @throws      BasePathIsNoDirectoryException  If $basePath is no
-        *                                                                                      directory or not found
-        * @throws      BasePathReadProtectedException  If $basePath is
-        *                                                                                      read-protected
-        */
-       public final static function createTemplateEngine ($basePath, ManageableLanguage  $langInstance, FileIoHandler $ioInstance) {
-               // Get a new instance
-               $tplInstance = new TemplateEngine();
-
-               // Is the base path valid?
-               if (empty($basePath)) {
-                       // Base path is empty
-                       throw new BasePathIsEmptyException($tplInstance, self::EXCEPTION_UNEXPECTED_EMPTY_STRING);
-               } elseif (!is_string($basePath)) {
-                       // Is not a string
-                       throw new InvalidBasePathStringException(array($tplInstance, $basePath), self::EXCEPTION_INVALID_STRING);
-               } elseif (!is_dir($basePath)) {
-                       // Is not a path
-                       throw new BasePathIsNoDirectoryException(array($tplInstance, $basePath), self::EXCEPTION_INVALID_PATH_NAME);
-               } elseif (!is_readable($basePath)) {
-                       // Is not readable
-                       throw new BasePathReadProtectedException(array($tplInstance, $basePath), self::EXCEPTION_READ_PROTECED_PATH);
-               }
-
-               // Get configuration instance
-               $cfgInstance = FrameworkConfiguration::getInstance();
-
-               // Set the base path
-               $tplInstance->setBasePath($basePath);
-
-               // Initialize the variable stack
-               $tplInstance->initVariableStack();
-
-               // Set the language and IO instances
-               $tplInstance->setLanguageInstance($langInstance);
-               $tplInstance->setFileIoInstance($ioInstance);
-
-               // Set template extensions
-               $tplInstance->setRawTemplateExtension($cfgInstance->readConfig('raw_template_extension'));
-               $tplInstance->setCodeTemplateExtension($cfgInstance->readConfig('code_template_extension'));
-
-               // Absolute output path for compiled templates
-               $tplInstance->setCompileOutputPath(PATH . $cfgInstance->readConfig('compile_output_path'));
-
-               // Return the prepared instance
-               return $tplInstance;
-       }
-
-       /**
-        * Search for a variable in the stack
-        *
-        * @param               $var            The variable we are looking for
-        * @return      $idx            FALSE means not found, >=0 means found on a specific index
-        */
-       private function isVariableAlreadySet ($var) {
-               // First everything is not found
-               $found = false;
-
-               // Now search for it
-               for ($idx = $this->varStack->getIterator(); $idx->valid(); $idx->next()) {
-                       // Get current item
-                       $currEntry = $idx->current();
-
-                       // Is the entry found?
-                       if ($currEntry['name'] == $var) {
-                               // Found!
-                               $found = $idx->key();
-                               break;
-                       }
-               }
-
-               // Return the current position
-               return $found;
-       }
-
-       /**
-        * Return a content of a variable or null if not found
-        *
-        * @param       $var            The variable we are looking for
-        * @return      $content        Content of the variable or null if not found
-        */
-       private function readVariable ($var) {
-               // First everything is not found
-               $content = null;
-
-               // Now search for it
-               for ($idx = $this->varStack->getIterator(); $idx->valid(); $idx->next()) {
-                       // Get current item
-                       $currEntry = $idx->current();
-
-                       // Is the entry found?
-                       if ($currEntry['name'] == $var) {
-                               // Found!
-                               $content = $currEntry['value'];
-                               break;
-                       }
-               }
-
-               // Return the current position
-               return $content;
-       }
-
-       /**
-        * Add a variable to the stack
-        *
-        * @param               $var            The variable we are looking for
-        * @param               $value  The value we want to store in the variable
-        * @return      void
-        */
-       private function addVariable ($var, $value) {
-               // Add it to the stack
-               $this->varStack->append(array(
-                       'name'  => trim($var),
-                       'value' => trim($value)
-               ));
-       }
-
-       /**
-        * Modify an entry on the stack
-        *
-        * @param               $var            The variable we are looking for
-        * @param               $value  The value we want to store in the variable
-        * @return      void
-        */
-       private function modifyVariable ($var, $value) {
-               // It should be there so let's look again...
-               for ($idx = $this->varStack->getIterator(); $idx->valid(); $idx->next()) {
-                       // Get current entry
-                       $currEntry = $idx->current();
-
-                       // Is this the requested variable?
-                       if ($currEntry['name'] == $var) {
-                               // Change it to the other value
-                               $this->varStack->offsetSet($idx->key(), array(
-                                       'name'  => $var,
-                                       'value' => $value
-                               ));
-                       }
-               }
-       }
-
-       /**
-        * Setter for template type. Only "html", "emails" and "compiled" should
-        * be sent here
-        *
-        * @param       $templateType   The current template's type
-        * @return      void
-        */
-       private final function setTemplateType ($templateType) {
-               // Cast it
-               $templateType = (string) $templateType;
-
-               // And set it (only 2 letters)
-               $this->templateType = $templateType;
-       }
-
-       /**
-        * Setter for the last loaded template's FQFN
-        *
-        * @param       $template       The last loaded template
-        * @return      void
-        */
-       private final function setLastTemplate ($template) {
-               // Cast it to string
-               $template = (string) $template;
-               $this->lastTemplate = $template;
-       }
-
-       /**
-        * Getter for the last loaded template's FQFN
-        *
-        * @return      $template       The last loaded template
-        */
-       private final function getLastTemplate () {
-               return $this->lastTemplate;
-       }
-
-       /**
-        * Initialize the variable stack. This holds all variables for later
-        * compilation.
-        *
-        * @return      void
-        */
-       public final function initVariableStack () {
-               $this->varStack = new FrameworkArrayObject("FakedVariableStack");
-       }
-
-       /**
-        * Setter for base path
-        *
-        * @param               $basePath               The local base path for all templates
-        * @return      void
-        */
-       public final function setBasePath ($basePath) {
-               // Cast it
-               $basePath = (string) $basePath;
-
-               // And set it
-               $this->basePath = $basePath;
-       }
-
-       /**
-        * Getter for base path
-        *
-        * @return      $basePath               The local base path for all templates
-        */
-       public final function getBasePath () {
-               // And set it
-               return $this->basePath;
-       }
-
-       /**
-        * Setter for template extension
-        *
-        * @param               $templateExtension      The file extension for all uncompiled
-        *                                                      templates
-        * @return      void
-        */
-       public final function setRawTemplateExtension ($templateExtension) {
-               // Cast it
-               $templateExtension = (string) $templateExtension;
-
-               // And set it
-               $this->templateExtension = $templateExtension;
-       }
-
-       /**
-        * Setter for code template extension
-        *
-        * @param               $codeExtension          The file extension for all uncompiled
-        *                                                      templates
-        * @return      void
-        */
-       public final function setCodeTemplateExtension ($codeExtension) {
-               // Cast it
-               $codeExtension = (string) $codeExtension;
-
-               // And set it
-               $this->codeExtension = $codeExtension;
-       }
-
-       /**
-        * Getter for template extension
-        *
-        * @return      $templateExtension      The file extension for all uncompiled
-        *                                                      templates
-        */
-       public final function getRawTemplateExtension () {
-               // And set it
-               return $this->templateExtension;
-       }
-
-       /**
-        * Getter for code-template extension
-        *
-        * @return      $codeExtension          The file extension for all code-
-        *                                                      templates
-        */
-       public final function getCodeTemplateExtension () {
-               // And set it
-               return $this->codeExtension;
-       }
-
-       /**
-        * Setter for path of compiled templates
-        *
-        * @param       $compileOutputPath      The local base path for all compiled
-        *                                                              templates
-        * @return      void
-        */
-       public final function setCompileOutputPath ($compileOutputPath) {
-               // Cast it
-               $compileOutputPath = (string) $compileOutputPath;
-
-               // And set it
-               $this->compileOutputPath = $compileOutputPath;
-       }
-
-       /**
-        * Getter for template type
-        *
-        * @return      $templateType   The current template's type
-        */
-       public final function getTemplateType () {
-               return $this->templateType;
-       }
-
-       /**
-        * Assign (add) a given variable with a value
-        *
-        * @param       $var    The variable we are looking for
-        * @param       $value  The value we want to store in the variable
-        * @return      void
-        */
-       public final function assignVariable ($var, $value) {
-               // First search for the variable if it was already added
-               $idx = $this->isVariableAlreadySet($var);
-
-               // Was it found?
-               if ($idx === false) {
-                       // Add it to the stack
-                       $this->addVariable($var, $value);
-               } elseif (!empty($value)) {
-                       // Modify the stack entry
-                       $this->modifyVariable($var, $value);
-               }
-       }
-
-       /**
-        * Removes a given variable
-        *
-        * @param       $var    The variable we are looking for
-        * @return      void
-        */
-       public final function removeVariable ($var) {
-               // First search for the variable if it was already added
-               $idx = $this->isVariableAlreadySet($var);
-
-               // Was it found?
-               if ($idx !== false) {
-                       // Remove this variable
-                       $this->varStack->offsetUnset($idx);
-               }
-       }
-
-       /**
-        * Private setter for raw template data
-        *
-        * @param       $rawTemplateData        The raw data from the template
-        * @return      void
-        */
-       private final function setRawTemplateData ($rawTemplateData) {
-               // Cast it to string
-               $rawTemplateData = (string) $rawTemplateData;
-
-               // And store it in this class
-               $this->rawTemplateData = $rawTemplateData;
-       }
-
-       /**
-        * Private setter for compiled templates
-        *
-        * @return      void
-        */
-       private final function setCompiledData ($compiledData) {
-               // Cast it to string
-               $compiledData = (string) $compiledData;
-
-               // And store it in this class
-               $this->compiledData = $compiledData;
-       }
-
-       /**
-        * Private loader for all template types
-        *
-        * @param       $template       The template we shall load
-        * @return      void
-        */
-       private function loadTemplate ($template) {
-               // Cast it to string
-               $template = (string) $template;
-
-               // Get extension for the template
-               $ext = $this->getRawTemplateExtension();
-
-               // If we shall load a code-template we need to switch the file extension
-               if ($this->getTemplateType() == $this->getConfigInstance()->readConfig('code_template_type')) {
-                       // Switch over to the code-template extension
-                       $ext = $this->getCodeTemplateExtension();
-               }
-
-               // Construct the FQFN for the template by honoring the current language
-               $fqfn = sprintf("%s%s/%s/%s%s",
-                       $this->getBasePath(),
-                       $this->getLanguageInstance()->getLanguageCode(),
-                       $this->getTemplateType(),
-                       $template,
-                       $ext
-               );
-
-               // Load the raw template data
-               $this->loadRawTemplateData($fqfn);
-       }
-
-       /**
-        * A private loader for raw template names
-        *
-        * @param       $fqfn   The full-qualified file name for a template
-        * @return      void
-        * @throws      NullPointerException    If $inputInstance is null
-        * @throws      NoObjectException               If $inputInstance is not an object
-        * @throws      MissingMethodException  If $inputInstance is missing a
-        *                                                                      required method
-        */
-       private function loadRawTemplateData ($fqfn) {
-               // Get a input/output instance from the middleware
-               $ioInstance = $this->getFileIoInstance();
-
-               // Validate the instance
-               if (is_null($ioInstance)) {
-                       // Throw exception
-                       throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER);
-               } elseif (!is_object($ioInstance)) {
-                       // Throw another exception
-                       throw new NoObjectException($ioInstance, self::EXCEPTION_IS_NO_OBJECT);
-               } elseif (!method_exists($ioInstance, 'loadFileContents')) {
-                       // Throw yet another exception
-                       throw new MissingMethodException(array($ioInstance, 'loadFileContents'), self::EXCEPTION_MISSING_METHOD);
-               }
-
-               // Load the raw template
-               $rawTemplateData = $ioInstance->loadFileContents($fqfn);
-
-               // Store the template's contents into this class
-               $this->setRawTemplateData($rawTemplateData);
-
-               // Remember the template's FQFN
-               $this->setLastTemplate($fqfn);
-       }
-
-       /**
-        * Try to assign an extracted template variable as a "content" or "config"
-        * variable.
-        *
-        * @param       $varName        The variable's name (shall be content orconfig) by
-        *                                              default
-        * @param       $var            The variable we want to assign
-        */
-       private function assignTemplateVariable ($varName, $var) {
-               // Is it not a config variable?
-               if ($varName != "config") {
-                       // Regular template variables
-                       $this->assignVariable($var, "");
-               } else {
-                       // Configuration variables
-                       $this->assignConfigVariable($var);
-               }
-       }
-
-       /**
-        * Extract variables from a given raw data stream
-        *
-        * @param       $rawData        The raw template data we shall analyze
-        * @return      void
-        */
-       private function extractVariablesFromRawData ($rawData) {
-               // Cast to string
-               $rawData = (string) $rawData;
-
-               // Search for variables
-               @preg_match_all('/\$(\w+)(\[(\w+)\])?/', $rawData, $variableMatches);
-
-               // Did we find some variables?
-               if ((is_array($variableMatches)) && (count($variableMatches) == 4) && (count($variableMatches[0]) > 0)) {
-                       // Initialize all missing variables
-                       foreach ($variableMatches[3] as $key=>$var) {
-                               // Try to assign it, empty strings are being ignored
-                               $this->assignTemplateVariable($variableMatches[1][$key], $var);
-                       } // END - foreach
-               } // END - if
-       }
-
-       /**
-        * Main analysis of the loaded template
-        *
-        * @param       $templateMatches        Found template place-holders, see below
-        * @return      void
-        *
-        *---------------------------------
-        * Structure of $templateMatches:
-        *---------------------------------
-        * [0] => Array - An array with all full matches
-        * [1] => Array - An array with left part (before the ":") of a match
-        * [2] => Array - An array with right part of a match including ":"
-        * [3] => Array - An array with right part of a match excluding ":"
-        */
-       private function analyzeTemplate (array $templateMatches) {
-               // Backup raw template data
-               $backup = $this->getRawTemplateData();
-
-               // Initialize some arrays
-               if (is_null($this->loadedRawData)) { $this->loadedRawData = array(); $this->rawTemplates = array(); }
-
-               // Load all requested templates
-               foreach ($templateMatches[1] as $template) {
-
-                       // Load and compile only templates which we have not yet loaded
-                       // RECURSIVE PROTECTION! BE CAREFUL HERE!
-                       if ((!isset($this->loadedRawData[$template])) && (!in_array($template, $this->loadedTemplates))) {
-
-                               // Template not found, but maybe variable assigned?
-                               if ($this->isVariableAlreadySet($template) !== false) {
-                                       // Use that content here
-                                       $this->loadedRawData[$template] = $this->readVariable($template);
-
-                                       // Recursive protection:
-                                       $this->loadedTemplates[] = $template;
-                               } else {
-                                       // Then try to search for code-templates
-                                       try {
-                                               // Load the code template and remember it's contents
-                                               $this->loadCodeTemplate($template);
-                                               $this->loadedRawData[$template] = $this->getRawTemplateData();
-
-                                               // Remember this template for recursion detection
-                                               // RECURSIVE PROTECTION!
-                                               $this->loadedTemplates[] = $template;
-                                       } catch (FileIsMissingException $e) {
-                                               // Even this is not done... :/
-                                               $this->rawTemplates[] = $template;
-                                       } catch (FilePointerNotOpenedException $e) {
-                                               // Even this is not done... :/
-                                               $this->rawTemplates[] = $template;
-                                       }
-                               }
-
-                       } // if ((!isset( ...
-
-               } // for ($templateMatches ...
-
-               // Restore the raw template data
-               $this->setRawTemplateData($backup);
-       }
-
-       /**
-        * Compile a given raw template code and remember it for later usage
-        *
-        * @param       $code           The raw template code
-        * @param       $template       The template's name
-        * @return      void
-        */
-       private function compileCode ($code, $template) {
-               // Is this template already compiled?
-               if (in_array($template, $this->compiledTemplates)) {
-                       // Abort here...
-                       return;
-               }
-
-               // Remember this template being compiled
-               $this->compiledTemplates[] = $template;
-
-               // Compile the loaded code in five steps:
-               //
-               // 1. Backup current template data
-               $backup = $this->getRawTemplateData();
-
-               // 2. Set the current template's raw data as the new content
-               $this->setRawTemplateData($code);
-
-               // 3. Compile the template data
-               $this->compileTemplate();
-
-               // 4. Remember it's contents
-               $this->loadedRawData[$template] = $this->getRawTemplateData();
-
-               // 5. Restore the previous raw content from backup variable
-               $this->setRawTemplateData($backup);
-       }
-
-       /**
-        * Insert all given and loaded templates by running through all loaded
-        * codes and searching for their place-holder in the main template
-        *
-        * @param       $templateMatches        See method analyzeTemplate()
-        * @return      void
-        */
-       private function insertAllTemplates (array $templateMatches) {
-               // Run through all loaded codes
-               foreach ($this->loadedRawData as $template=>$code) {
-
-                       // Search for the template
-                       $foundIndex = array_search($template, $templateMatches[1]);
-
-                       // Lookup the matching template replacement
-                       if (($foundIndex !== false) && (isset($templateMatches[0][$foundIndex]))) {
-
-                               // Get the current raw template
-                               $rawData = $this->getRawTemplateData();
-
-                               // Replace the space holder with the template code
-                               $rawData = str_replace($templateMatches[0][$foundIndex], $code, $rawData);
-
-                               // Set the new raw data
-                               $this->setRawTemplateData($rawData);
-
-                       } // END - if
-
-               } // END - foreach
-       }
-
-       /**
-        * Load all extra raw templates
-        *
-        * @return      void
-        */
-       private function loadExtraRawTemplates () {
-               // Are there some raw templates we need to load?
-               if (count($this->rawTemplates) > 0) {
-                       // Try to load all raw templates
-                       foreach ($this->rawTemplates as $key => $template) {
-                               try {
-                                       // Load the template
-                                       $this->loadWebTemplate($template);
-
-                                       // Remember it's contents
-                                       $this->rawTemplates[$template] = $this->getRawTemplateData();
-
-                                       // Remove it from the loader list
-                                       unset($this->rawTemplates[$key]);
-
-                                       // Remember this template for recursion detection
-                                       // RECURSIVE PROTECTION!
-                                       $this->loadedTemplates[] = $template;
-                               } catch (FileIsMissingException $e) {
-                                       // This template was never found. We silently ignore it
-                                       unset($this->rawTemplates[$key]);
-                               } catch (FilePointerNotOpenedException $e) {
-                                       // This template was never found. We silently ignore it
-                                       unset($this->rawTemplates[$key]);
-                               }
-                       }
-               }
-       }
-
-       /**
-        * Assign all found template variables
-        *
-        * @param               $varMatches     An array full of variable/value pairs.
-        * @return      void
-        * @todo        Unfinished work or don't die here.
-        */
-       private function assignAllVariables (array $varMatches) {
-               // Search for all variables
-               foreach ($varMatches[1] as $key=>$var) {
-
-                       // Detect leading equals
-                       if (substr($varMatches[2][$key], 0, 1) == "=") {
-                               // Remove and cast it
-                               $varMatches[2][$key] = (string) substr($varMatches[2][$key], 1);
-                       }
-
-                       // Do we have some quotes left and right side? Then it is free text
-                       if ((substr($varMatches[2][$key], 0, 1) == "\"") && (substr($varMatches[2][$key], -1, 1) == "\"")) {
-                               // Free string detected! Which we can assign directly
-                               $this->assignVariable($var, $varMatches[3][$key]);
-                       } elseif (!empty($varMatches[2][$key])) {
-                               // Non-string found so we need some deeper analysis...
-                               die("Deeper analysis not yet implemented!");
-                       }
-
-               } // for ($varMatches ...
-       }
-       /**
-        * Compiles all loaded raw templates
-        *
-        * @param               $templateMatches        See method analyzeTemplate() for details
-        * @return      void
-        */
-       private function compileRawTemplateData (array $templateMatches) {
-               // Are some code-templates found which we need to compile?
-               if (count($this->loadedRawData) > 0) {
-
-                       // Then compile all!
-                       foreach ($this->loadedRawData as $template=>$code) {
-
-                               // Is this template already compiled?
-                               if (in_array($template, $this->compiledTemplates)) {
-                                       // Then skip it
-                                       continue;
-                               }
-
-                               // Search for the template
-                               $foundIndex = array_search($template, $templateMatches[1]);
-
-                               // Lookup the matching variable data
-                               if (($foundIndex !== false) && (isset($templateMatches[3][$foundIndex]))) {
-
-                                       // Split it up with another reg. exp. into variable=value pairs
-                                       preg_match_all($this->regExpVarValue, $templateMatches[3][$foundIndex], $varMatches);
-
-                                       // Assign all variables
-                                       $this->assignAllVariables($varMatches);
-
-                               } // END - if (isset($templateMatches ...
-
-                               // Compile the loaded template
-                               $this->compileCode($code, $template);
-
-                       } // END - foreach ($this->loadedRawData ...
-
-                       // Insert all templates
-                       $this->insertAllTemplates($templateMatches);
-
-               } // END - if (count($this->loadedRawData) ...
-       }
-
-       /**
-        * Inserts all raw templates into their respective variables
-        *
-        * @return      void
-        */
-       private function insertRawTemplates () {
-               // Load all templates
-               foreach ($this->rawTemplates as $template=>$content) {
-                       // Set the template as a variable with the content
-                       $this->assignVariable($template, $content);
-               }
-       }
-
-       /**
-        * Finalizes the compilation of all template variables
-        *
-        * @return      void
-        */
-       private function finalizeVariableCompilation () {
-               // Get the content
-               $content = $this->getRawTemplateData();
-
-               // Walk through all variables
-               for ($idx = $this->varStack->getIterator(); $idx->valid(); $idx->next()) {
-                       // Get current entry
-                       $currEntry = $idx->current();
-
-                       // Replace all [$var] or {?$var?} with the content
-                       //* DEBUG: */ echo "name=".$currEntry['name'].", value=<pre>".htmlentities($currEntry['value'])."</pre>\n";
-                       $content = str_replace("\$content[".$currEntry['name']."]", $currEntry['value'], $content);
-                       $content = str_replace("[".$currEntry['name']."]", $currEntry['value'], $content);
-                       $content = str_replace("{?".$currEntry['name']."?}", $currEntry['value'], $content);
-               } // END - for
-
-               // Set the content back
-               $this->setRawTemplateData($content);
-       }
-
-       /**
-        * Getter for raw template data
-        *
-        * @return      $rawTemplateData        The raw data from the template
-        */
-       public final function getRawTemplateData () {
-               return $this->rawTemplateData;
-       }
-
-       /**
-        * Getter for compiled templates
-        */
-       public final function getCompiledData () {
-               return $this->compiledData;
-       }
-
-       /**
-        * Load a specified web template into the engine
-        *
-        * @param               $template               The web template we shall load which is
-        *                                              located in "html" by default
-        * @return      void
-        */
-       public function loadWebTemplate ($template) {
-               // Set template type
-               $this->setTemplateType($this->getConfigInstance()->readConfig('web_template_type'));
-
-               // Load the special template
-               $this->loadTemplate($template);
-       }
-
-       /**
-        * Assign a given congfiguration variable with a value
-        *
-        * @param       $var    The configuration variable we want to assign
-        * @return      void
-        */
-       public function assignConfigVariable ($var) {
-               // Sweet and simple...
-               $this->configVariables[$var] = $this->getConfigInstance()->readConfig($var);
-       }
-
-       /**
-        * Load a specified email template into the engine
-        *
-        * @param               $template               The email template we shall load which is
-        *                                              located in "emails" by default
-        * @return      void
-        */
-       public function loadEmailTemplate ($template) {
-               // Set template type
-               $this->setTemplateType($this->getConfigInstance()->readConfig('email_template_type'));
-
-               // Load the special template
-               $this->loadTemplate($template);
-       }
-
-       /**
-        * Load a specified code template into the engine
-        *
-        * @param               $template               The code template we shall load which is
-        *                                              located in "code" by default
-        * @return      void
-        */
-       public function loadCodeTemplate ($template) {
-               // Set template type
-               $this->setTemplateType($this->getConfigInstance()->readConfig('code_template_type'));
-
-               // Load the special template
-               $this->loadTemplate($template);
-       }
-
-       /**
-        * Compile all variables by inserting their respective values
-        *
-        * @return      void
-        * @todo        Make this code some nicer...
-        */
-       public final function compileVariables () {
-               // Initialize the $content array
-               $validVar = $this->getConfigInstance()->readConfig('tpl_valid_var');
-               $dummy = array();
-
-               // Iterate through all variables
-               for ($idx = $this->varStack->getIterator(); $idx->valid(); $idx->next()) {
-
-                       // Get current variable from the stack
-                       $currVariable = $idx->current();
-
-                       // Transfer it's name/value combination to the $content array
-                       //* DEBUG: */ echo $currVariable['name']."=<pre>".htmlentities($currVariable['value'])."</pre>\n";
-                       $dummy[$currVariable['name']] = $currVariable['value'];
-
-               }// END - if
-
-               // Set the new variable (don't remove the second dollar !)
-               $$validVar = $dummy;
-
-               // Prepare all configuration variables
-               $config = $this->configVariables;
-
-               // Remove some variables
-               unset($idx);
-               unset($currVariable);
-
-               // Run the compilation twice to get content from helper classes in
-               $cnt = 0;
-               while ($cnt < 3) {
-                       // Finalize the compilation of template variables
-                       $this->finalizeVariableCompilation();
-
-                       // Prepare the eval() command for comiling the template
-                       $eval = sprintf("\$result = \"%s\";",
-                               addslashes($this->getRawTemplateData())
-                       );
-
-                       // This loop does remove the backslashes (\) in PHP parameters
-                       while (strpos($eval, "<?") !== false) {
-                               // Get left part before "<?"
-                               $evalLeft = substr($eval, 0, strpos($eval, "<?"));
-
-                               // Get all from right of "<?"
-                               $evalRight = substr($eval, (strpos($eval, "<?") + 2));
-
-                               // Is this a full PHP tag?
-                               if (substr(strtolower($evalRight), 0, 3) == "php") {
-                                       // Remove "php" string from full PHP tag
-                                       $evalRight = substr($evalRight, 3);
-                               } // END - if
-
-                               // Cut middle part out and remove escapes
-                               $evalMiddle = trim(substr($evalRight, 0, strpos($evalRight, "?>")));
-                               $evalMiddle = stripslashes($evalMiddle);
-
-                               // Remove the middle part from right one
-                               $evalRight = substr($evalRight, (strpos($evalRight, "?>") + 2));
-
-                               // And put all together
-                               $eval = sprintf("%s<%%php %s %%>%s", $evalLeft, $evalMiddle, $evalRight);
-                       } // END - while
-
-                       // Prepare PHP code for eval() command
-                       $evalLength = strlen($eval);
-                       $eval = str_replace(
-                               "<%php", "\";",
-                               str_replace(
-                                       "%>", "\n\$result .= \"", $eval
-                               )
-                       );
-
-                       // Did something change?
-                       if (strlen($eval) != $eval) {
-                               // Run the constructed command. This will "compile" all variables in
-                               @eval($eval);
-                       } // END - if
-
-                       // Goes something wrong?
-                       if (!isset($result)) {
-                               // Output eval command
-                               $this->debugOutput(sprintf("Failed eval() code: <pre>%s</pre>", $this->markupCode($eval, true)), true);
-
-                               // Output backtrace here
-                               $this->debugBacktrace();
-                       } // END - if
-
-                       // Set raw template data
-                       $this->setRawTemplateData($result);
-                       $cnt++;
-               }
-
-               // Set the new content
-               $this->setCompiledData($result);
-       }
-
-       /**
-        * Compile all required templates into the current loaded one
-        *
-        * @return      void
-        * @throws      UnexpectedTemplateTypeException If the template type is
-        *                                                                                      not "code"
-        * @throws      InvalidArrayCountException              If an unexpected array
-        *                                                                                      count has been found
-        */
-       public final function compileTemplate () {
-               // We will only work with template type "code" from configuration
-               if ($this->getTemplateType() != $this->getConfigInstance()->readConfig('code_template_type')) {
-                       // Abort here
-                       throw new UnexpectedTemplateTypeException(array($this, $this->getTemplateType(), $this->getConfigInstance()->readConfig('code_template_type')), self::EXCEPTION_TEMPLATE_TYPE_IS_UNEXPECTED);
-               } // END - if
-
-               // Get the raw data.
-               $rawData = $this->getRawTemplateData();
-
-               // Remove double spaces and trim leading/trailing spaces
-               $rawData = trim(str_replace("  ", " ", $rawData));
-
-               // Search for raw variables
-               $this->extractVariablesFromRawData($rawData);
-
-               // Search for code-tags which are {? ?}
-               preg_match_all($this->regExpCodeTags, $rawData, $templateMatches);
-
-               // Analyze the matches array
-               if ((is_array($templateMatches)) && (count($templateMatches) == 4) && (count($templateMatches[0]) > 0)) {
-                       // Entries are found:
-                       //
-                       // The main analysis
-                       $this->analyzeTemplate($templateMatches);
-
-                       // Compile raw template data
-                       $this->compileRawTemplateData($templateMatches);
-
-                       // Are there some raw templates left for loading?
-                       $this->loadExtraRawTemplates();
-
-                       // Are some raw templates found and loaded?
-                       if (count($this->rawTemplates) > 0) {
-
-                               // Insert all raw templates
-                               $this->insertRawTemplates();
-
-                               // Remove the raw template content as well
-                               $this->setRawTemplateData("");
-
-                       } // END - if
-
-               } // END - if($templateMatches ...
-       }
-
-       /**
-        * Output the compiled page to the outside world. In case of web templates
-        * this would be vaild (X)HTML code. And in case of email templates this
-        * would store a prepared email body inside the template engine.
-        *
-        * @return      void
-        */
-       public final function output () {
-               // Check which type of template we have
-               switch ($this->getTemplateType()) {
-               case "html": // Raw HTML templates can be send to the output buffer
-                       // Quick-N-Dirty:
-                       $this->getWebOutputInstance()->output($this->getCompiledData());
-                       break;
-
-               default: // Unknown type found
-                       // Construct message
-                       $msg = sprintf("[%s:] Unknown/unsupported template type <strong>%s</strong> detected.",
-                               $this->__toString(),
-                               $this->getTemplateType()
-                       );
-
-                       // Write the problem to the world...
-                       $this->debugOutput($msg);
-                       break;
-               }
-       }
-
-       /**
-        * Loads a given view helper (by name)
-        *
-        * @param       $helperName     The helper's name
-        * @return      void
-        * @throws      ViewHelperNotFoundException     If the given view helper was not found
-        */
-       protected function loadViewHelper ($helperName) {
-               // Make first character upper case, rest low
-               $helperName = ucfirst($helperName);
-
-               // Is this view helper loaded?
-               if (!isset($this->helpers[$helperName])) {
-                       // Create a class name
-                       $className = "{$helperName}ViewHelper";
-
-                       // Does this class exists?
-                       if (!class_exists($className)) {
-                               // Abort here!
-                               throw new ViewHelperNotFoundException(array($this, $helperName), self::EXCEPTION_INVALID_VIEW_HELPER);
-                       }
-
-                       // Generate new instance
-                       $eval = sprintf("\$this->helpers[%s] = %s::create%s();",
-                               $helperName,
-                               $className,
-                               $className
-                       );
-
-                       // Run the code
-                       eval($eval);
-               }
-
-               // Return the requested instance
-               return $this->helpers[$helperName];
-       }
-
-       /**
-        * Assigns the last loaded raw template content with a given variable
-        *
-        * @param       $templateName   Name of the template we want to assign
-        * @param       $variableName   Name of the variable we want to assign
-        * @return      void
-        */
-       public function assignTemplateWithVariable ($templateName, $variableName) {
-               // Get the content from last loaded raw template
-               $content = $this->getRawTemplateData();
-
-               // Assign the variable
-               $this->assignVariable($variableName, $content);
-
-               // Purge raw content
-               $this->setRawTemplateData("");
-       }
-
-       /**
-        * Transfers the content of this template engine to a given response instance
-        *
-        * @param       $responseInstance       An instance of a response class
-        * @return      void
-        */
-       public function transferToResponse (Responseable $responseInstance) {
-               // Get the content and set it in the response class
-               $responseInstance->writeToBody($this->getCompiledData());
-       }
-
-       /**
-        * Assigns all the application data with template variables
-        *
-        * @param       $appInstance    A manageable application instance
-        * @return      void
-        */
-       public function assignApplicationData (ManageableApplication $appInstance) {
-               // Get long name and assign it
-               $this->assignVariable("app_full_name" , $appInstance->getAppName());
-
-               // Get short name and assign it
-               $this->assignVariable("app_short_name", $appInstance->getAppShortName());
-
-               // Get version number and assign it
-               $this->assignVariable("app_version"   , $appInstance->getAppVersion());
-       }
-}
-
-// [EOF]
-?>
diff --git a/inc/classes/main/template/image/.htaccess b/inc/classes/main/template/image/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/inc/classes/main/template/image/class_ImageTemplateEngine.php b/inc/classes/main/template/image/class_ImageTemplateEngine.php
new file mode 100644 (file)
index 0000000..6e80fd1
--- /dev/null
@@ -0,0 +1,210 @@
+<?php
+/**
+ * The own template engine for loading caching and sending out images
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @license            GNU GPL 3.0 or any newer version
+ * @link               http://www.ship-simu.org
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+class ImageTemplateEngine extends BaseTemplateEngine implements CompileableTemplate {
+       /**
+        * Main nodes in the XML tree ("image" is ignored)
+        */
+       private $mainNodes = array("type", "resolution", "background-color", "foreground-color", "image-string");
+
+       /**
+        * Sub nodes in the XML tree
+        */
+       private $subNodes = array("width", "height", "red", "green", "blue", "text");
+
+       /**
+        * Image instance
+        */
+       private $imageInstance = null;
+
+       /**
+        * Protected constructor
+        *
+        * @return      void
+        */
+       protected function __construct () {
+               // Call parent constructor
+               parent::__construct(__CLASS__);
+
+               // Set part description
+               $this->setObjectDescription("Image template engine");
+
+               // Create unique ID number
+               $this->generateUniqueId();
+
+               // Clean up a little
+               $this->removeNumberFormaters();
+               $this->removeSystemArray();
+       }
+
+       /**
+        * Creates an instance of the class TemplateEngine and prepares it for usage
+        *
+        * @param       $basePath               The local base path for all templates
+        * @param       $langInstance   An instance of LanguageSystem (default)
+        * @param       $ioInstance             An instance of FileIoHandler (default, middleware!)
+        * @return      $tplInstance    An instance of TemplateEngine
+        * @throws      BasePathIsEmptyException                If the provided $basePath is empty
+        * @throws      InvalidBasePathStringException  If $basePath is no string
+        * @throws      BasePathIsNoDirectoryException  If $basePath is no
+        *                                                                                      directory or not found
+        * @throws      BasePathReadProtectedException  If $basePath is
+        *                                                                                      read-protected
+        */
+       public final static function createImageTemplateEngine ($basePath, ManageableLanguage  $langInstance, FileIoHandler $ioInstance) {
+               // Get a new instance
+               $tplInstance = new ImageTemplateEngine();
+
+               // Is the base path valid?
+               if (empty($basePath)) {
+                       // Base path is empty
+                       throw new BasePathIsEmptyException($tplInstance, self::EXCEPTION_UNEXPECTED_EMPTY_STRING);
+               } elseif (!is_string($basePath)) {
+                       // Is not a string
+                       throw new InvalidBasePathStringException(array($tplInstance, $basePath), self::EXCEPTION_INVALID_STRING);
+               } elseif (!is_dir($basePath)) {
+                       // Is not a path
+                       throw new BasePathIsNoDirectoryException(array($tplInstance, $basePath), self::EXCEPTION_INVALID_PATH_NAME);
+               } elseif (!is_readable($basePath)) {
+                       // Is not readable
+                       throw new BasePathReadProtectedException(array($tplInstance, $basePath), self::EXCEPTION_READ_PROTECED_PATH);
+               }
+
+               // Get configuration instance
+               $cfgInstance = FrameworkConfiguration::getInstance();
+
+               // Set the base path
+               $tplInstance->setBasePath($basePath);
+
+               // Initialize the variable stack
+               $tplInstance->initVariableStack();
+
+               // Set the language and IO instances
+               $tplInstance->setLanguageInstance($langInstance);
+               $tplInstance->setFileIoInstance($ioInstance);
+
+               // Set template extensions
+               $tplInstance->setRawTemplateExtension($cfgInstance->readConfig('raw_template_extension'));
+               $tplInstance->setCodeTemplateExtension($cfgInstance->readConfig('code_template_extension'));
+
+               // Absolute output path for compiled templates
+               $tplInstance->setCompileOutputPath(PATH . $cfgInstance->readConfig('compile_output_path'));
+
+               // Return the prepared instance
+               return $tplInstance;
+       }
+
+       /**
+        * Renders the given image content
+        *
+        * @param       $imageContent           A valid XML image content
+        * @return      void
+        * @throws      XmlParserException      If an XML error was found
+        */
+       public function renderImageContent ($imageContent) {
+               // Get an XML parser
+               $xmlParser = xml_parser_create();
+
+               // Force case-folding to on
+               xml_parser_set_option($xmlParser, XML_OPTION_CASE_FOLDING, true);
+
+               // Set object
+               xml_set_object($xmlParser, $this);
+
+               // Set handler call-backs
+               xml_set_element_handler($xmlParser, "startElement", "endElement");
+               xml_set_character_data_handler($xmlParser, "characterHandler");
+
+               // Now parse the XML tree
+               if (!xml_parse($xmlParser, $imageContent)) {
+                       // Error found in XML!
+                       throw new XmlParserException(array($this, $xmlParser), BaseHelper::EXCEPTION_XML_PARSER_ERROR);
+               } // END - if
+
+               // Free the parser
+               xml_parser_free($xmlParser);
+       }
+
+       /**
+        * Handles the start element of an XML resource
+        *
+        * @param       $resource               XML parser resource
+        * @param       $element                The element we shall handle
+        * @param       $attributes             All attributes
+        * @return      void
+        * @throws      InvalidXmlNodeException         If an unknown/invalid XML node name was found
+        */
+       public function startElement ($resource, $element, array $attributes) {
+               // Initial method name which will never be called...
+               $methodName = "initImage";
+
+               // Make the element name lower-case
+               $element = strtolower($element);
+
+               // Is the element a main node?
+               if (in_array($element, $this->mainNodes)) {
+                       // Okay, main node found!
+                       $methodName = "setImage" . $this->convertToClassName($element);
+               } elseif (in_array($element, $this->subNodes)) {
+                       // Sub node found
+                       $methodName = "setImageProperty" . $this->convertToClassName($element);
+               } elseif ($element != "image") {
+                       // Invalid node name found
+                       throw new InvalidXmlNodeException(array($this, $element, $attributes), self::EXCEPTION_XML_NODE_UNKNOWN);
+               }
+
+               // Call method
+               //* DEBUG: */ echo "call: ".$methodName."<br />\n";
+               call_user_func_array(array($this, $methodName), $attributes);
+       }
+
+       /**
+        * Intializes the image
+        *
+        * @return      void
+        * @todo        Add cache creation here
+        */
+       private function initImage () {
+               // Unfinished work!
+       }
+
+       /**
+        * Set the image type
+        *
+        * @param       $imageType      Code fragment or direct value holding the image type
+        * @return      void
+        */
+       private function setImageType ($imageType) {
+               // Try to compile it first to get the value from variable stack
+               $imageType = $this->compileRawCode($imageType);
+
+               // Now make a class name of it
+               $className = $this->convertToClassName($imageType."_image");
+
+               // And try to initiate it
+               $this->imageInstance = ObjectFactory::createObjectByName($className);
+       }
+}
+
+// [EOF]
+?>
diff --git a/inc/classes/main/template/web/.htaccess b/inc/classes/main/template/web/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/inc/classes/main/template/web/class_WebTemplateEngine.php b/inc/classes/main/template/web/class_WebTemplateEngine.php
new file mode 100644 (file)
index 0000000..8c9c408
--- /dev/null
@@ -0,0 +1,104 @@
+<?php
+/**
+ * The own template engine for loading caching and sending out the web pages
+ * and emails.
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @license            GNU GPL 3.0 or any newer version
+ * @link               http://www.ship-simu.org
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+class WebTemplateEngine extends BaseTemplateEngine implements CompileableTemplate {
+       /**
+        * Protected constructor
+        *
+        * @return      void
+        */
+       protected function __construct () {
+               // Call parent constructor
+               parent::__construct(__CLASS__);
+
+               // Set part description
+               $this->setObjectDescription("Web template engine");
+
+               // Create unique ID number
+               $this->generateUniqueId();
+
+               // Clean up a little
+               $this->removeNumberFormaters();
+               $this->removeSystemArray();
+       }
+
+       /**
+        * Creates an instance of the class TemplateEngine and prepares it for usage
+        *
+        * @param       $basePath               The local base path for all templates
+        * @param       $langInstance   An instance of LanguageSystem (default)
+        * @param       $ioInstance             An instance of FileIoHandler (default, middleware!)
+        * @return      $tplInstance    An instance of TemplateEngine
+        * @throws      BasePathIsEmptyException                If the provided $basePath is empty
+        * @throws      InvalidBasePathStringException  If $basePath is no string
+        * @throws      BasePathIsNoDirectoryException  If $basePath is no
+        *                                                                                      directory or not found
+        * @throws      BasePathReadProtectedException  If $basePath is
+        *                                                                                      read-protected
+        */
+       public final static function createWebTemplateEngine ($basePath, ManageableLanguage  $langInstance, FileIoHandler $ioInstance) {
+               // Get a new instance
+               $tplInstance = new WebTemplateEngine();
+
+               // Is the base path valid?
+               if (empty($basePath)) {
+                       // Base path is empty
+                       throw new BasePathIsEmptyException($tplInstance, self::EXCEPTION_UNEXPECTED_EMPTY_STRING);
+               } elseif (!is_string($basePath)) {
+                       // Is not a string
+                       throw new InvalidBasePathStringException(array($tplInstance, $basePath), self::EXCEPTION_INVALID_STRING);
+               } elseif (!is_dir($basePath)) {
+                       // Is not a path
+                       throw new BasePathIsNoDirectoryException(array($tplInstance, $basePath), self::EXCEPTION_INVALID_PATH_NAME);
+               } elseif (!is_readable($basePath)) {
+                       // Is not readable
+                       throw new BasePathReadProtectedException(array($tplInstance, $basePath), self::EXCEPTION_READ_PROTECED_PATH);
+               }
+
+               // Get configuration instance
+               $cfgInstance = FrameworkConfiguration::getInstance();
+
+               // Set the base path
+               $tplInstance->setBasePath($basePath);
+
+               // Initialize the variable stack
+               $tplInstance->initVariableStack();
+
+               // Set the language and IO instances
+               $tplInstance->setLanguageInstance($langInstance);
+               $tplInstance->setFileIoInstance($ioInstance);
+
+               // Set template extensions
+               $tplInstance->setRawTemplateExtension($cfgInstance->readConfig('raw_template_extension'));
+               $tplInstance->setCodeTemplateExtension($cfgInstance->readConfig('code_template_extension'));
+
+               // Absolute output path for compiled templates
+               $tplInstance->setCompileOutputPath(PATH . $cfgInstance->readConfig('compile_output_path'));
+
+               // Return the prepared instance
+               return $tplInstance;
+       }
+
+// [EOF]
+?>
index 145761f..a9e567f 100644 (file)
@@ -90,7 +90,7 @@ $cfg->setConfigEntry('application_path', "application");
 $cfg->setConfigEntry('compile_output_path', "templates/_compiled/"); // DON'T MISS THE TRAILING SLASH!
 
 // CFG: TEMPLATE-ENGINE
-$cfg->setConfigEntry('template_class', "TemplateEngine");
+$cfg->setConfigEntry('template_class', "WebTemplateEngine");
 
 // CFG: DEBUG-ENGINE
 $cfg->setConfigEntry('debug_class', "DebugWebOutput");
diff --git a/templates/images/.htaccess b/templates/images/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/templates/images/de/.htaccess b/templates/images/de/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/templates/images/de/image/.htaccess b/templates/images/de/image/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/templates/images/de/image/base_image.img b/templates/images/de/image/base_image.img
new file mode 100644 (file)
index 0000000..39781ef
--- /dev/null
@@ -0,0 +1,20 @@
+<image>
+       <type value="{?image_type?}" />
+       <resolution>
+               <width value="{?image_width?}" />
+               <height value="{?image_height?}" />
+       </resolution>
+       <background-color>
+               <red value="{?image_bg_red?}" />
+               <green value="{?image_bg_green?}" />
+               <blue value="{?image_bg_blue?}" />
+       </background-color>
+       <foreground-color>
+               <red value="{?image_bg_red?}" />
+               <green value="{?image_bg_green?}" />
+               <blue value="{?image_bg_blue?}" />
+       </foreground-color>
+       <image-string>
+               <text value="{?image_string?}" />
+       </image-string>
+</image>
diff --git a/templates/images/de/image/emergency_exit.img b/templates/images/de/image/emergency_exit.img
new file mode 100644 (file)
index 0000000..b46b738
--- /dev/null
@@ -0,0 +1,22 @@
+<?php
+// Needed in every image template to initialy set the image type
+$helper = ImageHelper::createImageHelper($this, "png");
+$helper->setBaseImage("base_image");
+
+// Set image dimensions
+$helper->setWidth(400);
+$helper->setHeight(200);
+
+// Background and foreground color
+$helper->setBackgroundColorRedGreenBlue(0xFF, 0xAA, 0xAA);
+$helper->setForegroundColorRedGreenBlue(0x00, 0x00, 0x00);
+
+// Add error message
+$helper->setImageString("Genereller Fehler!");
+
+// Flush content to the template engine
+$helper->flushContent();
+
+// Comment this out if image is done
+//$this->debugInstance();
+?>