diff --git a/lib/documentmanagement/observers.inc.php b/lib/documentmanagement/observers.inc.php
new file mode 100644
index 0000000..ef6b0ff
--- /dev/null
+++ b/lib/documentmanagement/observers.inc.php
@@ -0,0 +1,114 @@
+boundary = md5(time());
+ }
+
+ function start() {
+ ob_implicit_flush();
+ header(sprintf("Content-type: multipart/mixed; boundary=%s", $this->boundary));
+ }
+
+ function receiveMessage(&$msg) {
+ printf("\n--%s\n", $this->boundary);
+ echo "Content-Type: text/html\n\n";
+
+ print $msg->getString();
+ print "\n";
+ }
+
+ function redirect($location) {
+ printf("\n--%s\n", $this->boundary);
+ echo "Content-Type: text/html\n\n";
+ printf("Location: %s\n", $location);
+ }
+
+ function end() {
+ printf("\n--%s--\n", $this->boundary);
+ }
+}
+
+class JavascriptObserver {
+ function JavascriptObserver(&$context) {
+ $this->context = $context;
+ }
+
+ function start() {
+ $this->context->oPage->requireJSResource('thirdpartyjs/MochiKit/Base.js');
+ $this->context->oPage->requireJSResource('thirdpartyjs/MochiKit/Iter.js');
+ $this->context->oPage->requireJSResource('thirdpartyjs/MochiKit/DOM.js');
+ $this->context->oPage->requireJSResource('resources/js/add_document.js');
+ $this->context->oRedirector =& $this;
+ $this->context->handleOutput('
');
+ }
+
+ function receiveMessage(&$msg) {
+ if (is_a($msg, 'KTUploadNewFile')) {
+ printf('', $msg->getString());
+ return;
+ }
+ printf('', $msg->getString());
+ }
+
+ function redirectToDocument($id) {
+ printf('', $id);
+ }
+
+ function redirectToFolder($id) {
+ printf('', $id);
+ }
+
+ function redirect($url) {
+ printf('', $url);
+ }
+
+
+ function end() {
+ printf("\n--%s--\n", $this->boundary);
+ }
+}
+
+class KTSinglePageObserver {
+ function KTSinglePageObserver(&$context) {
+ $this->context =& $context;
+ }
+
+ function start() {
+ $this->context->oPage->template = 'kt3/minimal_page';
+ $this->context->oRedirector =& $this;
+ $this->context->handleOutput("");
+ }
+
+ function receiveMessage(&$msg) {
+ if (is_a($msg, 'KTUploadNewFile')) {
+ print "" . $msg->getString() . "
";
+ return;
+ }
+ print "" . $msg->getString() . "
\n";
+ }
+
+ function redirectToDocument($id) {
+ $url = generateControllerUrl("viewDocument", sprintf("fDocumentId=%d", $id));
+ printf('Go here to continue', $url);
+ printf("\n");
+ }
+
+ function redirectToFolder($id) {
+ $url = generateControllerUrl("browse", sprintf("fFolderId=%d", $id));
+ printf('Go here to continue', $url);
+ printf("\n");
+ }
+
+ function redirect($url) {
+ foreach ($_SESSION['KTErrorMessage'] as $sErrorMessage) {
+ print '' . $sErrorMessage . '
' . "\n";
+ }
+ printf('Go here to continue', $url);
+ printf("\n");
+ }
+
+ function end() {
+ printf("\n--%s--\n", $this->boundary);
+ }
+}