From fdc4cbd087b1e2d1f04700f744954ccab5308a70 Mon Sep 17 00:00:00 2001 From: sebastian Date: Thu, 3 Feb 2005 16:55:35 +0000 Subject: [PATCH] *** empty log message *** --- .../SmartyDynamic__example_8php-source.html | 113 + .../html/SmartyDynamic__example_8php.html | 276 + .../SmartyExtensions_8inc_8php-source.html | 59 + .../html/SmartyExtensions_8inc_8php.html | 232 + .../SmartyStatic__example_8php-source.html | 142 + .../html/SmartyStatic__example_8php.html | 426 + .../htmlUI/doc/doxygen/html/annotated.html | 17 + .../htmlUI/doc/doxygen/html/classes.html | 16 + .../doc/doxygen/html/classuiBase-members.html | 15 + .../htmlUI/doc/doxygen/html/classuiBase.html | 141 + .../htmlUI/doc/doxygen/html/classuiBase.png | Bin 0 -> 439 bytes .../doxygen/html/classuiBrowser-members.html | 36 + .../doc/doxygen/html/classuiBrowser.html | 938 +++ .../doc/doxygen/html/classuiBrowser.png | Bin 0 -> 316 bytes .../doxygen/html/classuiHandler-members.html | 38 + .../doc/doxygen/html/classuiHandler.html | 1139 +++ .../doc/doxygen/html/classuiHandler.png | Bin 0 -> 310 bytes .../doc/doxygen/html/conf_8php-source.html | 115 + .../htmlUI/doc/doxygen/html/conf_8php.html | 326 + .../htmlUI/doc/doxygen/html/dir_000000.html | 39 + .../htmlUI/doc/doxygen/html/dir_000001.html | 24 + .../modules/htmlUI/doc/doxygen/html/dirs.html | 18 + .../htmlUI/doc/doxygen/html/doxygen.css | 297 + .../htmlUI/doc/doxygen/html/doxygen.png | Bin 0 -> 1281 bytes .../htmlUI/doc/doxygen/html/files.html | 26 + .../htmlUI/doc/doxygen/html/functions.html | 88 + .../doc/doxygen/html/functions_func.html | 84 + .../doc/doxygen/html/functions_vars.html | 19 + .../htmlUI/doc/doxygen/html/globals.html | 103 + .../htmlUI/doc/doxygen/html/globals_enum.html | 26 + .../htmlUI/doc/doxygen/html/globals_func.html | 23 + .../htmlUI/doc/doxygen/html/globals_vars.html | 88 + .../htmlUI/doc/doxygen/html/hierarchy.html | 19 + .../doxygen/html/html_2index_8php-source.html | 18 + .../doc/doxygen/html/html_2index_8php.html | 19 + .../htmlUI/doc/doxygen/html/index.html | 14 + .../doc/doxygen/html/index_8php-source.html | 18 + .../htmlUI/doc/doxygen/html/index_8php.html | 19 + .../html/ui__base_8inc_8php-source.html | 92 + .../doc/doxygen/html/ui__base_8inc_8php.html | 53 + .../html/ui__browser_8class_8php-source.html | 288 + .../doxygen/html/ui__browser_8class_8php.html | 19 + .../doxygen/html/ui__browser_8php-source.html | 125 + .../doc/doxygen/html/ui__browser_8php.html | 413 + .../html/ui__browser__init_8php-source.html | 54 + .../doxygen/html/ui__browser__init_8php.html | 104 + .../html/ui__fmask_8inc_8php-source.html | 302 + .../doc/doxygen/html/ui__fmask_8inc_8php.html | 48 + .../html/ui__handler_8class_8php-source.html | 312 + .../doxygen/html/ui__handler_8class_8php.html | 19 + .../doxygen/html/ui__handler_8php-source.html | 95 + .../doc/doxygen/html/ui__handler_8php.html | 621 ++ .../html/ui__handler__init_8php-source.html | 35 + .../doxygen/html/ui__handler__init_8php.html | 48 + livesupport/modules/htmlUI/etc/doxygen.config | 1214 +++ livesupport/modules/htmlUI/index.php | 4 + .../modules/htmlUI/var/Smarty-2.6.6.tar.gz | Bin 0 -> 137589 bytes .../htmlUI/var/SmartyExtensions.inc.php | 82 + livesupport/modules/htmlUI/var/conf.php | 125 + livesupport/modules/htmlUI/var/elements.txt | 14 + .../modules/htmlUI/var/html/Smarty/BUGS | 7 + .../htmlUI/var/html/Smarty/COPYING.lib | 458 ++ .../modules/htmlUI/var/html/Smarty/ChangeLog | 6908 +++++++++++++++++ .../modules/htmlUI/var/html/Smarty/FAQ | 284 + .../modules/htmlUI/var/html/Smarty/INSTALL | 29 + .../modules/htmlUI/var/html/Smarty/NEWS | 865 +++ .../modules/htmlUI/var/html/Smarty/README | 80 + .../htmlUI/var/html/Smarty/RELEASE_NOTES | 423 + .../modules/htmlUI/var/html/Smarty/TODO | 10 + .../var/html/Smarty/demo/configs/test.conf | 5 + .../htmlUI/var/html/Smarty/demo/index.php | 25 + .../var/html/Smarty/demo/templates/footer.tpl | 2 + .../var/html/Smarty/demo/templates/header.tpl | 6 + .../var/html/Smarty/demo/templates/index.tpl | 83 + .../html/Smarty/libs/Config_File.class.php | 389 + .../var/html/Smarty/libs/Smarty.class.php | 1938 +++++ .../Smarty/libs/Smarty_Compiler.class.php | 2258 ++++++ .../htmlUI/var/html/Smarty/libs/debug.tpl | 64 + .../core.assemble_plugin_filepath.php | 67 + .../core.assign_smarty_interface.php | 43 + .../internals/core.create_dir_structure.php | 79 + .../internals/core.display_debug_console.php | 61 + .../libs/internals/core.get_include_path.php | 44 + .../libs/internals/core.get_microtime.php | 23 + .../libs/internals/core.get_php_resource.php | 80 + .../Smarty/libs/internals/core.is_secure.php | 56 + .../Smarty/libs/internals/core.is_trusted.php | 47 + .../libs/internals/core.load_plugins.php | 125 + .../internals/core.load_resource_plugin.php | 74 + .../internals/core.process_cached_inserts.php | 71 + .../core.process_compiled_include.php | 32 + .../libs/internals/core.read_cache_file.php | 111 + .../Smarty/libs/internals/core.rm_auto.php | 71 + .../html/Smarty/libs/internals/core.rmdir.php | 55 + .../internals/core.run_insert_handler.php | 71 + .../internals/core.smarty_include_php.php | 50 + .../libs/internals/core.write_cache_file.php | 95 + .../internals/core.write_compiled_include.php | 79 + .../core.write_compiled_resource.php | 35 + .../Smarty/libs/internals/core.write_file.php | 54 + .../Smarty/libs/plugins/block.textformat.php | 102 + .../Smarty/libs/plugins/compiler.assign.php | 38 + .../plugins/function.assign_debug_info.php | 39 + .../libs/plugins/function.config_load.php | 140 + .../Smarty/libs/plugins/function.counter.php | 79 + .../Smarty/libs/plugins/function.cycle.php | 102 + .../Smarty/libs/plugins/function.debug.php | 35 + .../Smarty/libs/plugins/function.eval.php | 48 + .../Smarty/libs/plugins/function.fetch.php | 220 + .../libs/plugins/function.html_checkboxes.php | 143 + .../libs/plugins/function.html_image.php | 142 + .../libs/plugins/function.html_options.php | 121 + .../libs/plugins/function.html_radios.php | 145 + .../plugins/function.html_select_date.php | 316 + .../plugins/function.html_select_time.php | 192 + .../libs/plugins/function.html_table.php | 137 + .../Smarty/libs/plugins/function.mailto.php | 143 + .../Smarty/libs/plugins/function.math.php | 82 + .../Smarty/libs/plugins/function.popup.php | 110 + .../libs/plugins/function.popup_init.php | 39 + .../libs/plugins/modifier.capitalize.php | 42 + .../html/Smarty/libs/plugins/modifier.cat.php | 33 + .../plugins/modifier.count_characters.php | 31 + .../plugins/modifier.count_paragraphs.php | 28 + .../libs/plugins/modifier.count_sentences.php | 28 + .../libs/plugins/modifier.count_words.php | 32 + .../libs/plugins/modifier.date_format.php | 48 + .../libs/plugins/modifier.debug_print_var.php | 56 + .../Smarty/libs/plugins/modifier.default.php | 31 + .../Smarty/libs/plugins/modifier.escape.php | 89 + .../Smarty/libs/plugins/modifier.indent.php | 27 + .../Smarty/libs/plugins/modifier.lower.php | 25 + .../Smarty/libs/plugins/modifier.nl2br.php | 35 + .../libs/plugins/modifier.regex_replace.php | 29 + .../Smarty/libs/plugins/modifier.replace.php | 29 + .../Smarty/libs/plugins/modifier.spacify.php | 29 + .../libs/plugins/modifier.string_format.php | 28 + .../Smarty/libs/plugins/modifier.strip.php | 33 + .../libs/plugins/modifier.strip_tags.php | 31 + .../Smarty/libs/plugins/modifier.truncate.php | 43 + .../Smarty/libs/plugins/modifier.upper.php | 25 + .../Smarty/libs/plugins/modifier.wordwrap.php | 28 + .../plugins/outputfilter.trimwhitespace.php | 75 + .../plugins/shared.escape_special_chars.php | 30 + .../libs/plugins/shared.make_timestamp.php | 43 + .../var/html/Smarty/misc/smarty_icon.README | 6 + .../var/html/Smarty/misc/smarty_icon.gif | Bin 0 -> 1102 bytes .../htmlUI/var/html/Smarty/unit_test/README | 32 + .../var/html/Smarty/unit_test/config.php | 5 + .../configs/globals_double_quotes.conf | 1 + .../configs/globals_single_quotes.conf | 1 + .../Smarty/unit_test/smarty_unit_test.php | 10 + .../Smarty/unit_test/smarty_unit_test_gui.php | 10 + .../Smarty/unit_test/templates/assign_var.tpl | 1 + .../Smarty/unit_test/templates/constant.tpl | 1 + .../html/Smarty/unit_test/templates/index.tpl | 1 + .../Smarty/unit_test/templates/parse_math.tpl | 12 + .../unit_test/templates/parse_obj_meth.tpl | 8 + .../var/html/Smarty/unit_test/test_cases.php | 450 ++ .../htmlUI/var/html/SmartyDynamic_example.php | 108 + .../htmlUI/var/html/SmartyStatic_example.php | 137 + livesupport/modules/htmlUI/var/html/clock.php | 178 + .../htmlUI/var/html/img/a_Fernsehturm.jpg | Bin 0 -> 18300 bytes .../modules/htmlUI/var/html/img/logo.jpg | Bin 0 -> 18300 bytes .../modules/htmlUI/var/html/img/logo1.jpg | Bin 0 -> 88780 bytes livesupport/modules/htmlUI/var/html/index.php | 4 + .../htmlUI/var/html/rightmouseclick.html | 26 + .../examples/smarty-dynamic-fancygroup.tpl | 28 + .../examples/smarty-dynamic-green.tpl | 9 + .../templates/examples/smarty-dynamic.tpl | 134 + .../htmlUI/var/html/templates/filedata.tpl | 14 + .../htmlUI/var/html/templates/footer.tpl | 6 + .../templates/form_parts/dynForm_plain.tpl | 60 + .../templates/form_parts/dynForm_sections.tpl | 79 + .../var/html/templates/form_parts/error.tpl | 1 + .../html/templates/form_parts/required.tpl | 10 + .../templates/form_parts/requirednote.tpl | 1 + .../htmlUI/var/html/templates/header.tpl | 13 + .../htmlUI/var/html/templates/login.tpl | 19 + .../htmlUI/var/html/templates/main.tpl | 7 + .../htmlUI/var/html/templates/masterpanel.tpl | 55 + .../htmlUI/var/html/templates/menu_top.tpl | 11 + .../var/html/templates/metadataform.tpl | 124 + .../htmlUI/var/html/templates/newfileform.tpl | 7 + .../htmlUI/var/html/templates/objects.tpl | 60 + .../htmlUI/var/html/templates/path.tpl | 17 + .../htmlUI/var/html/templates/permissions.tpl | 67 + .../var/html/templates/popup/_close.tpl | 3 + .../html/templates/popup/_reload_parent.tpl | 4 + .../htmlUI/var/html/templates/popup/login.tpl | 22 + .../var/html/templates/popup/logout.tpl | 20 + .../var/html/templates/popup/signover.tpl | 20 + .../var/html/templates/script/basics.js.tpl | 49 + .../var/html/templates/script/clock.js.tpl | 168 + .../htmlUI/var/html/templates/search.tpl | 35 + .../var/html/templates/smarty-static.tpl | 156 + .../htmlUI/var/html/templates/statusbar.tpl | 30 + .../htmlUI/var/html/templates/styles.css | 147 + .../htmlUI/var/html/templates/subjects.tpl | 87 + .../htmlUI/var/html/templates/systemPrefs.tpl | 5 + .../htmlUI/var/html/templates/tree.tpl | 20 + .../htmlUI/var/html/templates/uploadform.tpl | 7 + .../htmlUI/var/html/templates/userinfo.tpl | 11 + .../modules/htmlUI/var/html/ui_browser.php | 155 + .../modules/htmlUI/var/html/ui_handler.php | 97 + livesupport/modules/htmlUI/var/index.php | 4 + livesupport/modules/htmlUI/var/rules.html | 93 + .../modules/htmlUI/var/ui_base.inc.php | 186 + .../modules/htmlUI/var/ui_browser.class.php | 557 ++ .../modules/htmlUI/var/ui_browser_init.php | 44 + .../modules/htmlUI/var/ui_fmask.inc.php | 744 ++ .../modules/htmlUI/var/ui_handler.class.php | 517 ++ .../modules/htmlUI/var/ui_handler_init.php | 21 + 213 files changed, 32511 insertions(+) create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/SmartyDynamic__example_8php-source.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/SmartyDynamic__example_8php.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/SmartyExtensions_8inc_8php-source.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/SmartyExtensions_8inc_8php.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/SmartyStatic__example_8php-source.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/SmartyStatic__example_8php.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/annotated.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/classes.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/classuiBase-members.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/classuiBase.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/classuiBase.png create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/classuiBrowser-members.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/classuiBrowser.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/classuiBrowser.png create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/classuiHandler-members.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/classuiHandler.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/classuiHandler.png create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/conf_8php-source.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/conf_8php.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/dir_000000.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/dir_000001.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/dirs.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/doxygen.css create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/doxygen.png create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/files.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/functions.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/functions_func.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/functions_vars.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/globals.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/globals_enum.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/globals_func.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/globals_vars.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/hierarchy.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/html_2index_8php-source.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/html_2index_8php.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/index.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/index_8php-source.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/index_8php.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/ui__base_8inc_8php-source.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/ui__base_8inc_8php.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/ui__browser_8class_8php-source.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/ui__browser_8class_8php.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/ui__browser_8php-source.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/ui__browser_8php.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/ui__browser__init_8php-source.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/ui__browser__init_8php.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/ui__fmask_8inc_8php-source.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/ui__fmask_8inc_8php.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/ui__handler_8class_8php-source.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/ui__handler_8class_8php.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/ui__handler_8php-source.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/ui__handler_8php.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/ui__handler__init_8php-source.html create mode 100644 livesupport/modules/htmlUI/doc/doxygen/html/ui__handler__init_8php.html create mode 100644 livesupport/modules/htmlUI/etc/doxygen.config create mode 100644 livesupport/modules/htmlUI/index.php create mode 100644 livesupport/modules/htmlUI/var/Smarty-2.6.6.tar.gz create mode 100644 livesupport/modules/htmlUI/var/SmartyExtensions.inc.php create mode 100644 livesupport/modules/htmlUI/var/conf.php create mode 100644 livesupport/modules/htmlUI/var/elements.txt create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/BUGS create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/COPYING.lib create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/ChangeLog create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/FAQ create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/INSTALL create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/NEWS create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/README create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/RELEASE_NOTES create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/TODO create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/demo/configs/test.conf create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/demo/index.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/demo/templates/footer.tpl create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/demo/templates/header.tpl create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/demo/templates/index.tpl create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/Config_File.class.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/Smarty.class.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/Smarty_Compiler.class.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/debug.tpl create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.assemble_plugin_filepath.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.assign_smarty_interface.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.create_dir_structure.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.display_debug_console.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.get_include_path.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.get_microtime.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.get_php_resource.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.is_secure.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.is_trusted.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.load_plugins.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.load_resource_plugin.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.process_cached_inserts.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.process_compiled_include.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.read_cache_file.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.rm_auto.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.rmdir.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.run_insert_handler.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.smarty_include_php.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.write_cache_file.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.write_compiled_include.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.write_compiled_resource.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.write_file.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/block.textformat.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/compiler.assign.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.assign_debug_info.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.config_load.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.counter.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.cycle.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.debug.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.eval.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.fetch.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_checkboxes.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_image.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_options.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_radios.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_select_date.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_select_time.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_table.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.mailto.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.math.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.popup.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.popup_init.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.capitalize.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.cat.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.count_characters.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.count_paragraphs.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.count_sentences.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.count_words.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.date_format.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.debug_print_var.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.default.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.escape.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.indent.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.lower.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.nl2br.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.regex_replace.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.replace.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.spacify.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.string_format.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.strip.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.strip_tags.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.truncate.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.upper.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.wordwrap.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/outputfilter.trimwhitespace.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/shared.escape_special_chars.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/shared.make_timestamp.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/misc/smarty_icon.README create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/misc/smarty_icon.gif create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/unit_test/README create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/unit_test/config.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/unit_test/configs/globals_double_quotes.conf create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/unit_test/configs/globals_single_quotes.conf create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/unit_test/smarty_unit_test.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/unit_test/smarty_unit_test_gui.php create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/assign_var.tpl create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/constant.tpl create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/index.tpl create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/parse_math.tpl create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/parse_obj_meth.tpl create mode 100644 livesupport/modules/htmlUI/var/html/Smarty/unit_test/test_cases.php create mode 100644 livesupport/modules/htmlUI/var/html/SmartyDynamic_example.php create mode 100644 livesupport/modules/htmlUI/var/html/SmartyStatic_example.php create mode 100644 livesupport/modules/htmlUI/var/html/clock.php create mode 100644 livesupport/modules/htmlUI/var/html/img/a_Fernsehturm.jpg create mode 100644 livesupport/modules/htmlUI/var/html/img/logo.jpg create mode 100644 livesupport/modules/htmlUI/var/html/img/logo1.jpg create mode 100644 livesupport/modules/htmlUI/var/html/index.php create mode 100644 livesupport/modules/htmlUI/var/html/rightmouseclick.html create mode 100644 livesupport/modules/htmlUI/var/html/templates/examples/smarty-dynamic-fancygroup.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/examples/smarty-dynamic-green.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/examples/smarty-dynamic.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/filedata.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/footer.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/form_parts/dynForm_plain.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/form_parts/dynForm_sections.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/form_parts/error.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/form_parts/required.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/form_parts/requirednote.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/header.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/login.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/main.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/masterpanel.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/menu_top.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/metadataform.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/newfileform.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/objects.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/path.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/permissions.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/popup/_close.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/popup/_reload_parent.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/popup/login.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/popup/logout.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/popup/signover.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/script/basics.js.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/script/clock.js.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/search.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/smarty-static.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/statusbar.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/styles.css create mode 100644 livesupport/modules/htmlUI/var/html/templates/subjects.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/systemPrefs.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/tree.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/uploadform.tpl create mode 100644 livesupport/modules/htmlUI/var/html/templates/userinfo.tpl create mode 100644 livesupport/modules/htmlUI/var/html/ui_browser.php create mode 100644 livesupport/modules/htmlUI/var/html/ui_handler.php create mode 100644 livesupport/modules/htmlUI/var/index.php create mode 100644 livesupport/modules/htmlUI/var/rules.html create mode 100644 livesupport/modules/htmlUI/var/ui_base.inc.php create mode 100644 livesupport/modules/htmlUI/var/ui_browser.class.php create mode 100644 livesupport/modules/htmlUI/var/ui_browser_init.php create mode 100644 livesupport/modules/htmlUI/var/ui_fmask.inc.php create mode 100644 livesupport/modules/htmlUI/var/ui_handler.class.php create mode 100644 livesupport/modules/htmlUI/var/ui_handler_init.php diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/SmartyDynamic__example_8php-source.html b/livesupport/modules/htmlUI/doc/doxygen/html/SmartyDynamic__example_8php-source.html new file mode 100644 index 000000000..2c8ef2e40 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/SmartyDynamic__example_8php-source.html @@ -0,0 +1,113 @@ + + +LiveSupport - htmlUI module: SmartyDynamic_example.php Source File + + + +
Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members
+ +

SmartyDynamic_example.php

Go to the documentation of this file.
00001 <?php
+00011 require_once 'HTML/QuickForm.php';
+00012 require_once 'HTML/QuickForm/Renderer/Array.php';
+00013 // fix this if your Smarty is somewhere else
+00014 require_once 'Smarty/libs/Smarty.class.php';
+00015 
+00016 $form = new HTML_QuickForm('frmTest', 'post');
+00017 
+00018 $form->setDefaults(array(
+00019     'itxtTest'  => 'Test Text Box',
+00020     'itxaTest'  => 'Hello World',
+00021     'iselTest'  => array('B', 'C'),
+00022     'name'      => array('first' => 'Thomas', 'last' => 'Schulz'),
+00023     'iradYesNo' => 'Y',
+00024     'ichkABCD'  => array('A'=>true,'D'=>true)
+00025 ));
+00026 
+00027 $form->addElement('header', '', 'Normal Elements');
+00028 
+00029 $form->addElement('hidden', 'ihidTest', 'hiddenField');
+00030 
+00031 $form->addElement('text', 'itxtTest', array('Test Text', 'note' => 'Note for Testtext element.'));
+00032 
+00033 $form->addElement('textarea', 'itxaTest', 'Test TextArea', 'cols="40" rows="2"');
+00034 
+00035 // will be later assigned to style green
+00036 $form->addElement('password', 'ipwdTest', 'Test Password');
+00037 $select =& $form->addElement(
+00038     'select',
+00039     'iselTest',
+00040     array('Test Select', 'note' => 'We recommend to check at least two categories!'),
+00041     array('A'=>'A * * * * (luxory)', 'B'=>'B * * *','C'=>'C * *','D'=>'D * (simple)')
+00042  );
+00043 $select->setSize(4);
+00044 $select->setMultiple(true);
+00045 
+00046 $form->addElement('submit', 'isubTest', 'Test Submit');
+00047 
+00048 $form->addElement('header', '', 'Grouped Elements');
+00049 
+00050 $checkbox[] = &HTML_QuickForm::createElement('checkbox', 'A', null, 'A');
+00051 $checkbox[] = &HTML_QuickForm::createElement('checkbox', 'B', null, 'B');
+00052 $checkbox[] = &HTML_QuickForm::createElement('checkbox', 'C', null, 'C');
+00053 $checkbox[] = &HTML_QuickForm::createElement('checkbox', 'D', null, 'D');
+00054 $form->addGroup($checkbox, 'ichkABCD', 'ABCD', array('&nbsp;', '<br />'));
+00055 
+00056 // will be later assigned to style fancygroup
+00057 $radio[] = &HTML_QuickForm::createElement('radio', null, null, 'Yes', 'Y');
+00058 $radio[] = &HTML_QuickForm::createElement('radio', null, null, 'No', 'N');
+00059 $form->addGroup($radio, 'iradYesNo', 'Yes/No');
+00060 
+00061 // will be later assigned to style fancygroup
+00062 $name['first'] = &HTML_QuickForm::createElement('text', 'first', 'First:');
+00063 $name['first']->setSize(20);
+00064 $name['last'] = &HTML_QuickForm::createElement('text', 'last', 'Last:');
+00065 $name['last']->setSize(30);
+00066 $form->addGroup($name, 'name', 'Name');
+00067 
+00068 // add some 'required' rules to show "stars" and (possible) errors...
+00069 $form->addRule('itxtTest', 'Test Text is a required field', 'required');
+00070 $form->addRule('itxaTest', 'Test TextArea is a required field', 'required');
+00071 $form->addGroupRule('iradYesNo', 'Check Yes or No', 'required');
+00072 $form->addGroupRule('name', array('last' => array(array('Last name is required', 'required'))));
+00073 
+00074 // try to validate the form
+00075 if ($form->validate()) {
+00076     $form->freeze();
+00077 }
+00078 
+00079 $renderer =& new HTML_QuickForm_Renderer_Array(true, true);
+00080 
+00081 // give some elements aditional style informations
+00082 $renderer->setElementStyle(array(
+00083     'ipwdTest'  => 'green',
+00084     'iradYesNo' => 'fancygroup',
+00085     'name'      => 'fancygroup'
+00086 ));
+00087 
+00088 $form->accept($renderer);
+00089 
+00090 // setup a template object
+00091 $tpl =& new Smarty;
+00092 $tpl->template_dir = './templates';
+00093 $tpl->compile_dir  = './templates_c';
+00094 
+00095 // assign array with form data
+00096 $tpl->assign('form', $renderer->toArray());
+00097 
+00098 // capture the array stucture
+00099 // (only for showing in sample template)
+00100 ob_start();
+00101 print_r($renderer->toArray());
+00102 $tpl->assign('dynamic_array', ob_get_contents());
+00103 ob_end_clean();
+00104 
+00105 // render and display the template
+00106 $tpl->display('smarty-dynamic.tpl');
+00107 
+00108 ?>
+

Generated on Wed Jan 12 13:58:47 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/SmartyDynamic__example_8php.html b/livesupport/modules/htmlUI/doc/doxygen/html/SmartyDynamic__example_8php.html new file mode 100644 index 000000000..66eea7df4 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/SmartyDynamic__example_8php.html @@ -0,0 +1,276 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: SmartyDynamic_example.php File Reference + + + +
Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members
+ +

SmartyDynamic_example.php File Reference

+

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + +

Variables

 $form = new HTML_QuickForm('frmTest', 'post')
 $select
 $checkbox [] = &HTML_QuickForm::createElement('checkbox', 'A', null, 'A')
 $radio [] = &HTML_QuickForm::createElement('radio', null, null, 'Yes', 'Y')
 $name ['first'] = &HTML_QuickForm::createElement('text', 'first', 'First:')
 $renderer = & new HTML_QuickForm_Renderer_Array(true, true)
 $tpl = & new Smarty
$tpl template_dir = './templates'
$tpl compile_dir = './templates_c'
+


Variable Documentation

+

+ + + + +
+ + + + +
$checkbox[] = &HTML_QuickForm::createElement('checkbox', 'A', null, 'A')
+
+ + + + + +
+   + + +

+ +

+Definition at line 53 of file SmartyDynamic_example.php.

+

+ + + + +
+ + + + +
$form = new HTML_QuickForm('frmTest', 'post')
+
+ + + + + +
+   + + +

+ +

+Definition at line 16 of file SmartyDynamic_example.php. +

+Referenced by uiBase::_parseArr2Form(), uiHandler::_validateForm(), uiBrowser::getAddSubjectForm(), uiBrowser::getChangePasswdForm(), uiBrowser::getMetadataForm(), uiBrowser::getNewFileForm(), uiBrowser::getSearchForm(), uiBrowser::getSubj2GroupForm(), uiBrowser::loginform(), and uiBrowser::systemPrefs().

+

+ + + + +
+ + + + +
$name['last'] = &HTML_QuickForm::createElement('text', 'first', 'First:')
+
+ + + + + +
+   + + +

+ +

+Definition at line 64 of file SmartyDynamic_example.php.

+

+ + + + +
+ + + + +
$radio[] = &HTML_QuickForm::createElement('radio', null, null, 'Yes', 'Y')
+
+ + + + + +
+   + + +

+ +

+Definition at line 58 of file SmartyDynamic_example.php. +

+Referenced by uiBase::_parseArr2Form().

+

+ + + + +
+ + + + +
$renderer = & new HTML_QuickForm_Renderer_Array(true, true)
+
+ + + + + +
+   + + +

+ +

+Definition at line 79 of file SmartyDynamic_example.php. +

+Referenced by uiBrowser::loginform(), and uiBrowser::systemPrefs().

+

+ + + + +
+ + + + +
$select
+
+ + + + + +
+   + + +

+Initial value:

& $form->addElement(
+    'select',
+    'iselTest',
+    array('Test Select', 'note' => 'We recommend to check at least two categories!'),
+    array('A'=>'A * * * * (luxory)', 'B'=>'B * * *','C'=>'C * *','D'=>'D * (simple)')
+ )
+
+

+Definition at line 37 of file SmartyDynamic_example.php.

+

+ + + + +
+ + + + +
$tpl = & new Smarty
+
+ + + + + +
+   + + +

+ +

+Definition at line 91 of file SmartyDynamic_example.php.

+

+ + + + +
+ + + + +
$tpl compile_dir = './templates_c'
+
+ + + + + +
+   + + +

+ +

+Definition at line 93 of file SmartyDynamic_example.php.

+

+ + + + +
+ + + + +
$tpl template_dir = './templates'
+
+ + + + + +
+   + + +

+ +

+Definition at line 92 of file SmartyDynamic_example.php.

+


Generated on Wed Jan 12 13:58:48 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/SmartyExtensions_8inc_8php-source.html b/livesupport/modules/htmlUI/doc/doxygen/html/SmartyExtensions_8inc_8php-source.html new file mode 100644 index 000000000..31e3411bb --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/SmartyExtensions_8inc_8php-source.html @@ -0,0 +1,59 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: SmartyExtensions.inc.php Source File + + + +
Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members
+ +

SmartyExtensions.inc.php

Go to the documentation of this file.
00001 <?php
+00002 ## some constants ########################
+00003 $Smarty->assign('UI_BROWSER', UI_BROWSER);
+00004 $Smarty->assign('UI_HANDLER', UI_HANDLER);
+00005 
+00006 // --- Smarty Extensions ---
+00016 function S_str_repeat($param)
+00017 {
+00018     extract($param);
+00019     return str_repeat($str, intval($count));
+00020 
+00021 }
+00022 $Smarty->register_function('str_repeat', 'S_str_repeat');
+00023 
+00032 function S_urlencode($param)
+00033 {
+00034     extract($param);
+00035     return urlencode($str);
+00036 }
+00037 $Smarty->register_function('urlencode',  'S_urlencode');
+00038 
+00047 function S_htmlspecialchars($param)
+00048 {
+00049     extract($param);
+00050     return htmlspecialchars($str);
+00051 }
+00052 $Smarty->register_function('htmlspecialchars', 'S_htmlspecialchars');
+00053 
+00061 function S_system($param)
+00062 {
+00063     extract($param);
+00064     eval($code);
+00065 }
+00066 $Smarty->register_function('system', 'S_system');
+00067 
+00075 function S_tra($param)
+00076 {
+00077     global $uiBrowser;
+00078 
+00079     foreach($param as $v) {
+00080         echo $uiBrowser->tra($v);
+00081     }
+00082 }
+00083 $Smarty->register_function('tra', 'S_tra');
+00084 ?>
+

Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/SmartyExtensions_8inc_8php.html b/livesupport/modules/htmlUI/doc/doxygen/html/SmartyExtensions_8inc_8php.html new file mode 100644 index 000000000..d35dd75b9 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/SmartyExtensions_8inc_8php.html @@ -0,0 +1,232 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: SmartyExtensions.inc.php File Reference + + + +
Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members
+ +

SmartyExtensions.inc.php File Reference

+

+Go to the source code of this file. + + + + + + + + + + + + + + + + + +

Functions

 S_str_repeat ($param)
 str_repeat
 S_urlencode ($param)
 urlencode
 S_htmlspecialchars ($param)
 htmlspecialchars
 S_system ($param)
 system
 S_tra ($param)
 tra
+


Function Documentation

+

+ + + + +
+ + + + + + + + + +
S_htmlspecialchars param  ) 
+
+ + + + + +
+   + + +

+htmlspecialchars +

+convert special chars in given string to html-entitys.

+

Parameters:
+ + +
str string, string to convert
+
+
Returns:
string, converted string
+ +

+Definition at line 47 of file SmartyExtensions.inc.php.

+

+ + + + +
+ + + + + + + + + +
S_str_repeat param  ) 
+
+ + + + + +
+   + + +

+str_repeat +

+Repeate given string.

+

Parameters:
+ + + +
str string, string to repeate
count numeric, how often to repeate (converted to type integer)
+
+
Returns:
string, repeated string
+ +

+Definition at line 16 of file SmartyExtensions.inc.php.

+

+ + + + +
+ + + + + + + + + +
S_system param  ) 
+
+ + + + + +
+   + + +

+system +

+Execute some PHP-code.

+

Parameters:
+ + +
code string, code to execute
+
+ +

+Definition at line 61 of file SmartyExtensions.inc.php.

+

+ + + + +
+ + + + + + + + + +
S_tra param  ) 
+
+ + + + + +
+   + + +

+tra +

+Translate given string.

+

Parameters:
+ + +
void array, array of strings to be outputted translated
+
+ +

+Definition at line 75 of file SmartyExtensions.inc.php. +

+References $uiBrowser.

+

+ + + + +
+ + + + + + + + + +
S_urlencode param  ) 
+
+ + + + + +
+   + + +

+urlencode +

+Encode given string to use in URL.

+

Parameters:
+ + +
str string, string to encode
+
+
Returns:
string, encoded string
+ +

+Definition at line 32 of file SmartyExtensions.inc.php.

+


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/SmartyStatic__example_8php-source.html b/livesupport/modules/htmlUI/doc/doxygen/html/SmartyStatic__example_8php-source.html new file mode 100644 index 000000000..fe49e8016 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/SmartyStatic__example_8php-source.html @@ -0,0 +1,142 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: SmartyStatic_example.php Source File + + + +
Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members
+ +

SmartyStatic_example.php

Go to the documentation of this file.
00001 <?php
+00011 require_once 'HTML/QuickForm.php';
+00012 require_once 'HTML/QuickForm/Renderer/ArraySmarty.php';
+00013 // fix this if your Smarty is somewhere else
+00014 require_once 'Smarty/libs/Smarty.class.php';
+00015 
+00016 // Form name will be used to find the placeholders.
+00017 
+00018 $form = new HTML_QuickForm('form', 'POST');
+00019 
+00020 // Fills with some defaults values
+00021 
+00022 $defaultValues['company']  = 'Mamasam';
+00023 $defaultValues['country']  = array();
+00024 $defaultValues['name']     = array('first'=>'Bertrand', 'last'=>'Mansion');
+00025 $defaultValues['phone']    = array('513', '123', '4567');
+00026 $form->setDefaults($defaultValues);
+00027 
+00028 // Hidden
+00029 
+00030 $form->addElement('hidden', 'session', '1234567890');
+00031 
+00032 // Personal information
+00033 
+00034 $form->addElement('header', 'personal', 'Personal Information');
+00035 
+00036 $form->addElement('hidden', 'ihidTest', 'hiddenField');
+00037 $form->addElement('text', 'email', 'Your email:');
+00038 $form->addElement('password', 'pass', array('Your password:', 'note'=>'Please, choose a 8-10 characters password.'), 'size=10');
+00039 $name['last'] = &HTML_QuickForm::createElement('text', 'first', 'First', 'size=10');
+00040 $name['first'] = &HTML_QuickForm::createElement('text', 'last', 'Last', 'size=10');
+00041 $form->addGroup($name, 'name', 'Name:', ',&nbsp;');
+00042 $areaCode = &HTML_QuickForm::createElement('text', '', null,'size=4 maxlength=3');
+00043 $phoneNo1 = &HTML_QuickForm::createElement('text', '', null, 'size=4 maxlength=3');
+00044 $phoneNo2 = &HTML_QuickForm::createElement('text', '', null, 'size=5 maxlength=4');
+00045 $form->addGroup(array($areaCode, $phoneNo1, $phoneNo2), 'phone', 'Telephone:', '-');
+00046 
+00047 // Company information
+00048 
+00049 $form->addElement('header', 'company_info', 'Company Information');
+00050 
+00051 $form->addElement('text', 'company', 'Company:', 'size=20');
+00052 
+00053 $str[] = &HTML_QuickForm::createElement('text', '', null, 'size=20');
+00054 $str[] = &HTML_QuickForm::createElement('text', '', null, 'size=20');
+00055 $form->addGroup($str, 'street', 'Street:', '<br />');
+00056 
+00057 $addr['zip'] = &HTML_QuickForm::createElement('text', 'zip', 'Zip', 'size=6 maxlength=10');
+00058 $addr['city'] = &HTML_QuickForm::createElement('text', 'city', 'City', 'size=15');
+00059 $form->addGroup($addr, 'address', 'Zip, city:');
+00060 
+00061 $select = array('' => 'Please select...', 'AU' => 'Australia', 'FR' => 'France', 'DE' => 'Germany', 'IT' => 'Italy');
+00062 $form->addElement('select', 'country', 'Country:', $select);
+00063 
+00064 $checkbox[] = &HTML_QuickForm::createElement('checkbox', 'A', null, 'A');
+00065 $checkbox[] = &HTML_QuickForm::createElement('checkbox', 'B', null, 'B');
+00066 $checkbox[] = &HTML_QuickForm::createElement('checkbox', 'C', null, 'C');
+00067 $checkbox[] = &HTML_QuickForm::createElement('checkbox', 'D', null, 'D');
+00068 $form->addGroup($checkbox, 'destination', 'Destination:', array('&nbsp;', '<br />'));
+00069 
+00070 // Other elements
+00071 
+00072 $form->addElement('checkbox', 'news', '', " Check this box if you don't want to receive our newsletter.");
+00073 
+00074 $form->addElement('reset', 'reset', 'Reset');
+00075 $form->addElement('submit', 'submit', 'Register');
+00076 
+00077 // Adds some validation rules
+00078 
+00079 $form->addRule('email', 'Email address is required', 'required');
+00080 $form->addGroupRule('name', 'Name is required', 'required');
+00081 $form->addRule('pass', 'Password must be between 8 to 10 characters', 'rangelength', array(8, 10));
+00082 $form->addRule('country', 'Country is a required field', 'required');
+00083 $form->addGroupRule('destination', 'Please check at least two boxes', 'required', null, 2);
+00084 $form->addGroupRule('phone', 'Please fill all phone fields', 'required');
+00085 $form->addGroupRule('phone', 'Values must be numeric', 'numeric');
+00086 
+00087 $AddrRules['zip'][0] = array('Zip code is required', 'required');
+00088 $AddrRules['zip'][1] = array('Zip code is numeric only', 'numeric');
+00089 $AddrRules['city'][0] = array('City is required', 'required');
+00090 $AddrRules['city'][1] = array('City is letters only', 'lettersonly');
+00091 $form->addGroupRule('address', $AddrRules);
+00092 
+00093 // Tries to validate the form
+00094 if ($form->validate()) {
+00095     // Form is validated, then freezes the data
+00096     $form->freeze();
+00097 }
+00098 
+00099 // setup a template object
+00100 $tpl =& new Smarty;
+00101 $tpl->template_dir = './templates';
+00102 $tpl->compile_dir  = './templates_c';
+00103 
+00104 $renderer =& new HTML_QuickForm_Renderer_ArraySmarty($tpl, true);
+00105 
+00106 $renderer->setRequiredTemplate(
+00107    '{if $error}
+00108         <font color="red">{$label|upper}</font>
+00109     {else}
+00110         {$label}
+00111         {if $required}
+00112             <font color="red" size="1">*</font>
+00113         {/if}
+00114     {/if}'
+00115     );
+00116 
+00117 $renderer->setErrorTemplate(
+00118    '{if $error}
+00119         <font color="orange" size="1">{$error}</font><br />
+00120     {/if}{$html}'
+00121     );
+00122 
+00123 $form->accept($renderer);
+00124 
+00125 // assign array with form data
+00126 $tpl->assign('form', $renderer->toArray());
+00127 
+00128 // capture the array stucture
+00129 ob_start();
+00130 print_r($renderer->toArray());
+00131 $tpl->assign('static_array', ob_get_contents());
+00132 ob_end_clean();
+00133 
+00134 // render and display the template
+00135 $tpl->display('smarty-static.tpl');
+00136 
+00137 ?>
+

Generated on Wed Jan 12 13:58:47 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/SmartyStatic__example_8php.html b/livesupport/modules/htmlUI/doc/doxygen/html/SmartyStatic__example_8php.html new file mode 100644 index 000000000..322c5b905 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/SmartyStatic__example_8php.html @@ -0,0 +1,426 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: SmartyStatic_example.php File Reference + + + +
Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members
+ +

SmartyStatic_example.php File Reference

+

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Variables

 $form = new HTML_QuickForm('form', 'POST')
 $defaultValues ['company'] = 'Mamasam'
 $name ['last'] = &HTML_QuickForm::createElement('text', 'first', 'First', 'size=10')
 $areaCode = &HTML_QuickForm::createElement('text', '', null,'size=4 maxlength=3')
 $phoneNo1 = &HTML_QuickForm::createElement('text', '', null, 'size=4 maxlength=3')
 $phoneNo2 = &HTML_QuickForm::createElement('text', '', null, 'size=5 maxlength=4')
 $str [] = &HTML_QuickForm::createElement('text', '', null, 'size=20')
 $addr ['zip'] = &HTML_QuickForm::createElement('text', 'zip', 'Zip', 'size=6 maxlength=10')
 $select = array('' => 'Please select...', 'AU' => 'Australia', 'FR' => 'France', 'DE' => 'Germany', 'IT' => 'Italy')
 $checkbox [] = &HTML_QuickForm::createElement('checkbox', 'A', null, 'A')
 $AddrRules ['zip'][0] = array('Zip code is required', 'required')
 $tpl = & new Smarty
$tpl template_dir = './templates'
$tpl compile_dir = './templates_c'
 $renderer = & new HTML_QuickForm_Renderer_ArraySmarty($tpl, true)
+


Variable Documentation

+

+ + + + +
+ + + + +
$addr['city'] = &HTML_QuickForm::createElement('text', 'zip', 'Zip', 'size=6 maxlength=10')
+
+ + + + + +
+   + + +

+ +

+Definition at line 58 of file SmartyStatic_example.php.

+

+ + + + +
+ + + + +
$AddrRules['city'][1] = array('Zip code is required', 'required')
+
+ + + + + +
+   + + +

+ +

+Definition at line 90 of file SmartyStatic_example.php.

+

+ + + + +
+ + + + +
$areaCode = &HTML_QuickForm::createElement('text', '', null,'size=4 maxlength=3')
+
+ + + + + +
+   + + +

+ +

+Definition at line 42 of file SmartyStatic_example.php.

+

+ + + + +
+ + + + +
$checkbox[] = &HTML_QuickForm::createElement('checkbox', 'A', null, 'A')
+
+ + + + + +
+   + + +

+ +

+Definition at line 67 of file SmartyStatic_example.php.

+

+ + + + +
+ + + + +
$defaultValues['phone'] = 'Mamasam'
+
+ + + + + +
+   + + +

+ +

+Definition at line 25 of file SmartyStatic_example.php.

+

+ + + + +
+ + + + +
$form = new HTML_QuickForm('form', 'POST')
+
+ + + + + +
+   + + +

+ +

+Definition at line 18 of file SmartyStatic_example.php.

+

+ + + + +
+ + + + +
$name['first'] = &HTML_QuickForm::createElement('text', 'first', 'First', 'size=10')
+
+ + + + + +
+   + + +

+ +

+Definition at line 40 of file SmartyStatic_example.php.

+

+ + + + +
+ + + + +
$phoneNo1 = &HTML_QuickForm::createElement('text', '', null, 'size=4 maxlength=3')
+
+ + + + + +
+   + + +

+ +

+Definition at line 43 of file SmartyStatic_example.php.

+

+ + + + +
+ + + + +
$phoneNo2 = &HTML_QuickForm::createElement('text', '', null, 'size=5 maxlength=4')
+
+ + + + + +
+   + + +

+ +

+Definition at line 44 of file SmartyStatic_example.php.

+

+ + + + +
+ + + + +
$renderer = & new HTML_QuickForm_Renderer_ArraySmarty($tpl, true)
+
+ + + + + +
+   + + +

+ +

+Definition at line 104 of file SmartyStatic_example.php.

+

+ + + + +
+ + + + +
$select = array('' => 'Please select...', 'AU' => 'Australia', 'FR' => 'France', 'DE' => 'Germany', 'IT' => 'Italy')
+
+ + + + + +
+   + + +

+ +

+Definition at line 61 of file SmartyStatic_example.php.

+

+ + + + +
+ + + + +
$str[] = &HTML_QuickForm::createElement('text', '', null, 'size=20')
+
+ + + + + +
+   + + +

+ +

+Definition at line 54 of file SmartyStatic_example.php.

+

+ + + + +
+ + + + +
$tpl = & new Smarty
+
+ + + + + +
+   + + +

+ +

+Definition at line 100 of file SmartyStatic_example.php.

+

+ + + + +
+ + + + +
$tpl compile_dir = './templates_c'
+
+ + + + + +
+   + + +

+ +

+Definition at line 102 of file SmartyStatic_example.php.

+

+ + + + +
+ + + + +
$tpl template_dir = './templates'
+
+ + + + + +
+   + + +

+ +

+Definition at line 101 of file SmartyStatic_example.php.

+


Generated on Wed Jan 12 13:58:48 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/annotated.html b/livesupport/modules/htmlUI/doc/doxygen/html/annotated.html new file mode 100644 index 000000000..bc75cfa93 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/annotated.html @@ -0,0 +1,17 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: Class List + + + +
Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members
+

LiveSupport - htmlUI module Class List

Here are the classes, structs, unions and interfaces with brief descriptions: + + + +
uiBaseUiBase class
uiBrowser
uiHandlerUiHandler class
+
Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/classes.html b/livesupport/modules/htmlUI/doc/doxygen/html/classes.html new file mode 100644 index 000000000..b39f70bed --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/classes.html @@ -0,0 +1,16 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: Alphabetical List + + + +
Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members
+

LiveSupport - htmlUI module Class Index

U

+ +
  U  
+
uiBase   uiBrowser   uiHandler   

U

+


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/classuiBase-members.html b/livesupport/modules/htmlUI/doc/doxygen/html/classuiBase-members.html new file mode 100644 index 000000000..5fe113a44 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/classuiBase-members.html @@ -0,0 +1,15 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: Member List + + + +
Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members
+

uiBase Member List

This is the complete list of members for uiBase, including all inherited members.

+ + +
_parseArr2Form(&$form, &$mask, $side='client')uiBase
tra($input)uiBase


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/classuiBase.html b/livesupport/modules/htmlUI/doc/doxygen/html/classuiBase.html new file mode 100644 index 000000000..805c41ec7 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/classuiBase.html @@ -0,0 +1,141 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: uiBase Class Reference + + + +
Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members
+

uiBase Class Reference

uiBase class +More... +

+

Inheritance diagram for uiBase: +

+ +uiBrowser +uiHandler + +List of all members. + + + + + + + + +

Public Member Functions

 tra ($input)
 tra
 _parseArr2Form (&$form, &$mask, $side='client')
 _parseArr2Form
+

Detailed Description

+uiBase class +

+LiveSupport HTML User Interface module +

+ +

+Definition at line 17 of file ui_base.inc.php.


Member Function Documentation

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
uiBase::_parseArr2Form &$  form,
&$  mask,
side = 'client'
+
+ + + + + +
+   + + +

+_parseArr2Form +

+Add elements/rules/groups to an given HTML_QuickForm object

+

Parameters:
+ + + + +
form object, reference to HTML_QuickForm object
mask array, reference to array defining to form elements
side string, side where the validation should beeing
+
+ +

+Definition at line 45 of file ui_base.inc.php. +

+References tra(). +

+Referenced by uiHandler::_validateForm(), uiBrowser::getAddSubjectForm(), uiBrowser::getMetadataForm(), uiBrowser::getNewFileForm(), uiBrowser::getSearchForm(), uiBrowser::loginform(), and uiBrowser::systemPrefs().

+

+ + + + +
+ + + + + + + + + +
uiBase::tra input  ) 
+
+ + + + + +
+   + + +

+tra +

+Translate the given string using localisation files.

+

Parameters:
+ + +
input string, string to translate
+
+
Returns:
string, translated string
+ +

+Definition at line 28 of file ui_base.inc.php. +

+Referenced by _parseArr2Form(), uiHandler::addSubj(), uiHandler::delete(), and uiHandler::storeSystemPrefs().

+


The documentation for this class was generated from the following file: +
Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/classuiBase.png b/livesupport/modules/htmlUI/doc/doxygen/html/classuiBase.png new file mode 100644 index 0000000000000000000000000000000000000000..0e8225480e4079b7a4e928a213e84e6aed2f4dcb GIT binary patch literal 439 zcmV;o0Z9IdP);|N zYX#@Vc5oy^DW#gk^B!JJ+z#LQm(+B>Aa$Fj3sM)|L8X)$rly^-gSwwrsZvTQrIh)o z}PYMdG}k9sLixjrJkpVfjtzl_gt<~8JDVLj`mdbJH>KPq)3VjA96}w zhBC3D<~$CUIAlovl2%dCp=3r9zDvdL;{2A=R#aH4R8V~7la@kURN^cyX?24OCFKKM zDm7TBIju`cq%QnV6g^bs*A&*&Qd`>~DvIj{J<3{fUa@%xAASrd4RWB$4*JXgag_SE hRPzjKqW|z};~S2&03RTAfH(jE002ovPDHLkV1kfIy|(}W literal 0 HcmV?d00001 diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/classuiBrowser-members.html b/livesupport/modules/htmlUI/doc/doxygen/html/classuiBrowser-members.html new file mode 100644 index 000000000..73b9bf058 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/classuiBrowser-members.html @@ -0,0 +1,36 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: Member List + + + + +

uiBrowser Member List

This is the complete list of members for uiBrowser, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + +
$alertMsguiBrowser
_parseArr2Form(&$form, &$mask, $side='client')uiBase
alertMsg()uiBrowser
getAddSubjectForm($mask)uiBrowser
getChangePasswdForm($uid)uiBrowser
getFile($id)uiBrowser
getGroups($id)uiBrowser
getInfo($id)uiBrowser
getMdata($id)uiBrowser
getMetadataForm($id, &$mask)uiBrowser
getNewFileData($id)uiBrowser
getNewFileForm($id, $mask)uiBrowser
getPermissions($id)uiBrowser
getSearchForm($id, &$mask)uiBrowser
getSearchRes($id, $search)uiBrowser
getStructure($id, $homedir=FALSE)uiBrowser
getSubj2GroupForm($id)uiBrowser
getSubjects()uiBrowser
getUserInfo()uiBrowser
loginform(&$Smarty, &$mask)uiBrowser
systemPrefs(&$mask)uiBrowser
tra($input)uiBase
uiBrowser($config)uiBrowser


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/classuiBrowser.html b/livesupport/modules/htmlUI/doc/doxygen/html/classuiBrowser.html new file mode 100644 index 000000000..63237a03d --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/classuiBrowser.html @@ -0,0 +1,938 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: uiBrowser Class Reference + + + + +

uiBrowser Class Reference

Inheritance diagram for uiBrowser: +

+ +uiBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

 uiBrowser ($config)
 uiBrowser
 alertMsg ()
 alertMsg
 loginform (&$Smarty, &$mask)
 loginform
 getUserInfo ()
 getUserInfo
 getStructure ($id, $homedir=FALSE)
 getStructure
 getNewFileForm ($id, $mask)
 getNewFileForm
 getSearchForm ($id, &$mask)
 getSearchForm
 getSubjects ()
 getSubjects
 getAddSubjectForm ($mask)
 addSubjectForm
 getChangePasswdForm ($uid)
 getChangePasswdForm
 getGroups ($id)
 getGroups
 getSubj2GroupForm ($id)
 getSubj2GroupForm
 getPermissions ($id)
 getPermissions
 getNewFileData ($id)
 getNewFileData
 getSearchRes ($id, $search)
 getSearchRes
 getFile ($id)
 getFile
 getMdata ($id)
 getMdata
 getInfo ($id)
 getInfo
 getMetadataForm ($id, &$mask)
 getMetaDataForm
 systemPrefs (&$mask)

Public Attributes

 $alertMsg
+

Constructor & Destructor Documentation

+

+ + + + +
+ + + + + + + + + +
uiBrowser::uiBrowser config  ) 
+
+ + + + + +
+   + + +

+uiBrowser +

+Initialize a new Browser Class including:

    +
  • database initialation
  • GreenBox initialation
+

+

Parameters:
+ + +
$config array, configurartion data
+
+ +

+Definition at line 15 of file ui_browser.class.php. +

+References $_REQUEST, and $config.

+


Member Function Documentation

+

+ + + + +
+ + + + + + + + +
uiBrowser::alertMsg  ) 
+
+ + + + + +
+   + + +

+alertMsg +

+takes error message from session var

+

Returns:
string
+ +

+Definition at line 38 of file ui_browser.class.php. +

+References alertMsg(). +

+Referenced by alertMsg(), and getFile().

+

+ + + + +
+ + + + + + + + + +
uiBrowser::getAddSubjectForm mask  ) 
+
+ + + + + +
+   + + +

+addSubjectForm +

+create a form to add GreenBox subjects (users/groups)

+

Returns:
string (html)
+ +

+Definition at line 193 of file ui_browser.class.php. +

+References uiBase::_parseArr2Form().

+

+ + + + +
+ + + + + + + + + +
uiBrowser::getChangePasswdForm uid  ) 
+
+ + + + + +
+   + + +

+getChangePasswdForm +

+create a form to change user-passwords in GreenBox

+

Returns:
string (html)
+ +

+Definition at line 214 of file ui_browser.class.php. +

+References changePasswd.

+

+ + + + +
+ + + + + + + + + +
uiBrowser::getFile id  ) 
+
+ + + + + +
+   + + +

+getFile +

+Call access method and show access path. Example only - not really useable. TODO: resource should be released by release method call

+

Parameters:
+ + +
id int, local id of accessed file
+
+ +

+Definition at line 353 of file ui_browser.class.php. +

+References alertMsg().

+

+ + + + +
+ + + + + + + + + +
uiBrowser::getGroups id  ) 
+
+ + + + + +
+   + + +

+getGroups +

+get a list of groups where user is member of

+$id int local user ID

Returns:
array
+ +

+Definition at line 241 of file ui_browser.class.php. +

+Referenced by getSubj2GroupForm().

+

+ + + + +
+ + + + + + + + + +
uiBrowser::getInfo id  ) 
+
+ + + + + +
+   + + +

+getInfo +

+Call getid3 library to analyze media file and show some results

+

Parameters:
+ + +
$id int local ID of file
+
+ +

+Definition at line 380 of file ui_browser.class.php.

+

+ + + + +
+ + + + + + + + + +
uiBrowser::getMdata id  ) 
+
+ + + + + +
+   + + +

+getMdata +

+Show file's metadata as XML

+

Parameters:
+ + +
id int, local id of stored file
+
+
Returns:
array
+ +

+Definition at line 368 of file ui_browser.class.php.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
uiBrowser::getMetadataForm id,
&$  mask
+
+ + + + + +
+   + + +

+getMetaDataForm +

+create a form to edit Metadata

+

Parameters:
+ + +
id int
+
+
Returns:
string (html)
+ +

+Definition at line 402 of file ui_browser.class.php. +

+References uiBase::_parseArr2Form(), and editMetaData.

+

+ + + + +
+ + + + + + + + + +
uiBrowser::getNewFileData id  ) 
+
+ + + + + +
+   + + +

+getNewFileData +

+get basic data about Folder to store file in

+

Parameters:
+ + +
$id int local ID of folder
+
+
Returns:
array
+ +

+Definition at line 313 of file ui_browser.class.php.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
uiBrowser::getNewFileForm id,
mask
+
+ + + + + +
+   + + +

+getNewFileForm +

+create a form for file-upload

+

Parameters:
+ + +
int local $id of directory to store file in
+
+string (html) +

+Definition at line 139 of file ui_browser.class.php. +

+References uiBase::_parseArr2Form(), and newfile.

+

+ + + + +
+ + + + + + + + + +
uiBrowser::getPermissions id  ) 
+
+ + + + + +
+   + + +

+getPermissions +

+get permissions for local object ID

+

Parameters:
+ + +
$id int local ID (file/folder)
+
+
Returns:
array
+ +

+Definition at line 293 of file ui_browser.class.php. +

+References subjects.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
uiBrowser::getSearchForm id,
&$  mask
+
+ + + + + +
+   + + +

+getSearchForm +

+create a form for searching in StorageServer

+

Parameters:
+ + +
int local ID of start-directory
+
+
Returns:
string (html)
+ +

+Definition at line 160 of file ui_browser.class.php. +

+References uiBase::_parseArr2Form(), and search.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
uiBrowser::getSearchRes id,
search
+
+ + + + + +
+   + + +

+getSearchRes +

+get Search Result

+

Parameters:
+ + + +
$id int local ID (file/folder) to search in
$serach string
+
+
Returns:
array
+ +

+Definition at line 330 of file ui_browser.class.php. +

+References search.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
uiBrowser::getStructure id,
homedir = FALSE
+
+ + + + + +
+   + + +

+getStructure +

+get directory-structure

+

Parameters:
+ + + +
int local ID of start-directory
boolean $homedir TRUE: get homedir of current user
+
+array tree of directory with subs +

+Definition at line 99 of file ui_browser.class.php. +

+References $_REQUEST.

+

+ + + + +
+ + + + + + + + + +
uiBrowser::getSubj2GroupForm id  ) 
+
+ + + + + +
+   + + +

+getSubj2GroupForm +

+creates a form to assign groups to a user

+

Parameters:
+ + +
$id int local user ID
+
+
Returns:
string (html)
+ +

+Definition at line 262 of file ui_browser.class.php. +

+References addSubj2Group, and getGroups().

+

+ + + + +
+ + + + + + + + +
uiBrowser::getSubjects  ) 
+
+ + + + + +
+   + + +

+getSubjects +

+get all GreenBox subjects (users/groups)

+

Returns:
array subj=>unique id of subject, loggedAs=>corresponding login name
+ +

+Definition at line 178 of file ui_browser.class.php.

+

+ + + + +
+ + + + + + + + +
uiBrowser::getUserInfo  ) 
+
+ + + + + +
+   + + +

+getUserInfo +

+get info about logged in user

+

Returns:
array uname=>user Name, uid=>user ID
+ +

+Definition at line 83 of file ui_browser.class.php.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
uiBrowser::loginform &$  Smarty,
&$  mask
+
+ + + + + +
+   + + +

+loginform +

+create a login-form

+

Parameters:
+ + +
string $faillogin login name of failed login process
+
+
Returns:
string (html)
+ +

+Definition at line 57 of file ui_browser.class.php. +

+References uiBase::_parseArr2Form().

+

+ + + + +
+ + + + + + + + + +
uiBrowser::systemPrefs &$  mask  ) 
+
+ + + + + +
+   + + +

+ +

+Definition at line 416 of file ui_browser.class.php. +

+References uiBase::_parseArr2Form(), and systemPrefs(). +

+Referenced by systemPrefs().

+


Member Data Documentation

+

+ + + + +
+ + + + +
uiBrowser::$alertMsg
+
+ + + + + +
+   + + +

+ +

+Definition at line 3 of file ui_browser.class.php.

+


The documentation for this class was generated from the following file: +
Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/classuiBrowser.png b/livesupport/modules/htmlUI/doc/doxygen/html/classuiBrowser.png new file mode 100644 index 0000000000000000000000000000000000000000..03a41ffeb680f6290f07c53b2935867e1d8ad922 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^u0R~X!VDz$?pSIBq$C1-LR|m<{|{vT|9@cq{DcWW z78oBmaG?6o|0h5$V@Z%-FoVOh8)-n!B~KT}kcv5PCwuc9R^V|-yu9_T^bFyUx2?M# z{c~TD{QNqb!Kxt5EaSw7GnPv#yX@G#t1bFdNk*Hn(oQ>-nC68pYj~2q4liO$X4UV@ z?>VdNy2^N(>!hO{Z*?|n8N4}v*yP;d6I+X~e!cH={`Som8*^(9#eA~!Iae3Kzxn!3 zzh^0aY4&Wfjttj-Y~XQmxvt(eYpGG7T>#q=ziI(R56xcQ#S9W_s(-vPK9elA>)3p! zYiB&Jm2kVdnV96(rxlz%llOW}!)cqsIayZM&EGwGKBI5@XBNNU-i1D!kM9Kfj=|H_ K&t;ucLK6Vyf`^;{ literal 0 HcmV?d00001 diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/classuiHandler-members.html b/livesupport/modules/htmlUI/doc/doxygen/html/classuiHandler-members.html new file mode 100644 index 000000000..e8d63c797 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/classuiHandler-members.html @@ -0,0 +1,38 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: Member List + + + + +

uiHandler Member List

This is the complete list of members for uiHandler, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
$alertMsguiHandler
$redirUrluiHandler
_parseArr2Form(&$form, &$mask, $side='client')uiBase
_validateForm(&$formdata, &$mask)uiHandler
addPerm($subj, $permAction, $id, $allowDeny)uiHandler
addSubj(&$formdata, &$mask)uiHandler
addSubj2Group($login, $gname, $reid)uiHandler
copy($newPath, $id)uiHandler
delete($id, $delOverride=FALSE)uiHandler
getFile($id)uiHandler
getInfo($id)uiHandler
getMdata($id)uiHandler
login(&$formdata, &$mask)uiHandler
logout()uiHandler
move($newPath, $id)uiHandler
newFolder($newname, $id)uiHandler
passwd($uid, $oldpass, $pass, $pass2)uiHandler
removePerm($permid, $oid)uiHandler
removeSubj($login)uiHandler
removeSubjFromGr($login, $gname, $reid)uiHandler
rename($newname, $id)uiHandler
storeSystemPrefs(&$formdata, &$mask)uiHandler
tra($input)uiBase
uiHandler($config)uiHandler
upload(&$formdata, $id, &$mask)uiHandler


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/classuiHandler.html b/livesupport/modules/htmlUI/doc/doxygen/html/classuiHandler.html new file mode 100644 index 000000000..1cfa10354 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/classuiHandler.html @@ -0,0 +1,1139 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: uiHandler Class Reference + + + + +

uiHandler Class Reference

uiHandler class +More... +

+

Inheritance diagram for uiHandler: +

+ +uiBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

 uiHandler ($config)
 login (&$formdata, &$mask)
 login
 logout ()
 logout
 upload (&$formdata, $id, &$mask)
 upload
 newFolder ($newname, $id)
 newFolder
 rename ($newname, $id)
 rename
 move ($newPath, $id)
 move
 copy ($newPath, $id)
 copy
 delete ($id, $delOverride=FALSE)
 delete
 getFile ($id)
 getFile
 getMdata ($id)
 getMdata
 getInfo ($id)
 getInfo
 addSubj (&$formdata, &$mask)
 addSubj
 removeSubj ($login)
 removeSubj
 passwd ($uid, $oldpass, $pass, $pass2)
 passwd
 addPerm ($subj, $permAction, $id, $allowDeny)
 addPerm
 removePerm ($permid, $oid)
 removePerm
 addSubj2Group ($login, $gname, $reid)
 addSubj2Group
 removeSubjFromGr ($login, $gname, $reid)
 Remove subject from group.
 storeSystemPrefs (&$formdata, &$mask)
 _validateForm (&$formdata, &$mask)

Public Attributes

 $redirUrl
 $alertMsg
+

Detailed Description

+uiHandler class +

+LiveSupport HTML User Interface module +

+ +

+Definition at line 7 of file ui_handler.class.php.


Constructor & Destructor Documentation

+

+ + + + +
+ + + + + + + + + +
uiHandler::uiHandler config  ) 
+
+ + + + + +
+   + + +

+ +

+Definition at line 11 of file ui_handler.class.php. +

+References $_REQUEST, $config, and login().

+


Member Function Documentation

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
uiHandler::_validateForm &$  formdata,
&$  mask
+
+ + + + + +
+   + + +

+ +

+Definition at line 429 of file ui_handler.class.php. +

+References uiBase::_parseArr2Form().

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
uiHandler::addPerm subj,
permAction,
id,
allowDeny
+
+ + + + + +
+   + + +

+addPerm +

+Add new permission record

+

Parameters:
+ + + + + +
subj int, local user/group id
permAction string, type of action from set predefined in conf.php
id int, local id of file/object
allowDeny char, A or D
+
+ +

+Definition at line 347 of file ui_handler.class.php. +

+References permissions.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
uiHandler::addSubj &$  formdata,
&$  mask
+
+ + + + + +
+   + + +

+addSubj +

+Create new user or group (empty pass => create group)

+

Parameters:
+ + +
formdata array('login', 'pass')
+
+ +

+Definition at line 266 of file ui_handler.class.php. +

+References login(), subjects, and uiBase::tra().

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
uiHandler::addSubj2Group login,
gname,
reid
+
+ + + + + +
+   + + +

+addSubj2Group +

+Add {login} and direct/indirect members to {gname} and to groups, where {gname} is [in]direct member

+

Parameters:
+ + + + +
login string
gname string
reid string, local id of managed group, just needed for redirect
+
+ +

+Definition at line 384 of file ui_handler.class.php. +

+References groups, login(), and subjects.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
uiHandler::copy newPath,
id
+
+ + + + + +
+   + + +

+copy +

+Copy file to another folder TODO: format of destinantion path should be properly defined

+

Parameters:
+ + + +
newPath string, destination relative path
id int, destination folder id
+
+ +

+Definition at line 166 of file ui_handler.class.php.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
uiHandler::delete id,
delOverride = FALSE
+
+ + + + + +
+   + + +

+delete +

+Delete of stored file

+

Parameters:
+ + + +
id int, local id of deleted file or folder
delOverride int, local id od folder which can deleted if not empty
+
+ +

+Definition at line 187 of file ui_handler.class.php. +

+References uiBase::tra().

+

+ + + + +
+ + + + + + + + + +
uiHandler::getFile id  ) 
+
+ + + + + +
+   + + +

+getFile +

+Call access method and show access path. Example only - not really useable. TODO: resource should be released by release method call

+

Parameters:
+ + +
id int, local id of accessed file
+
+ +

+Definition at line 215 of file ui_handler.class.php.

+

+ + + + +
+ + + + + + + + + +
uiHandler::getInfo id  ) 
+
+ + + + + +
+   + + +

+getInfo +

+Call getid3 library to analyze media file and show some results

+

Parameters:
+ + +
@param 
+
+ +

+Definition at line 244 of file ui_handler.class.php.

+

+ + + + +
+ + + + + + + + + +
uiHandler::getMdata id  ) 
+
+ + + + + +
+   + + +

+getMdata +

+Show file's metadata as XML

+

Parameters:
+ + +
id int, local id of stored file
+
+ +

+Definition at line 229 of file ui_handler.class.php.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
uiHandler::login &$  formdata,
&$  mask
+
+ + + + + +
+   + + +

+login +

+Login to the storageServer. It set sessid to the cookie with name defined in ../conf.php

+

Parameters:
+ + + +
login string, username
pass string, password
+
+ +

+Definition at line 33 of file ui_handler.class.php. +

+References login(). +

+Referenced by addSubj(), addSubj2Group(), login(), removeSubj(), removeSubjFromGr(), and uiHandler().

+

+ + + + +
+ + + + + + + + +
uiHandler::logout  ) 
+
+ + + + + +
+   + + +

+logout +

+Logut from storageServer, takes sessid from cookie +

+Definition at line 56 of file ui_handler.class.php.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
uiHandler::move newPath,
id
+
+ + + + + +
+   + + +

+move +

+Move file to another folder TODO: format of destinantion path should be properly defined

+

Parameters:
+ + + +
newPath string, destination relative path
id int, destination folder id
+
+ +

+Definition at line 144 of file ui_handler.class.php.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
uiHandler::newFolder newname,
id
+
+ + + + + +
+   + + +

+newFolder +

+Create new folder in the storage

+

Parameters:
+ + + +
newname string, name for the new folder
id int, destination folder id
+
+ +

+Definition at line 112 of file ui_handler.class.php.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
uiHandler::passwd uid,
oldpass,
pass,
pass2
+
+ + + + + +
+   + + +

+passwd +

+Change password for specified user

+

Parameters:
+ + + + + +
uid int, local user id
oldpass string, old user password
pass string, new password
pass2 string, retype of new password
+
+ +

+Definition at line 313 of file ui_handler.class.php. +

+References subjects.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
uiHandler::removePerm permid,
oid
+
+ + + + + +
+   + + +

+removePerm +

+Remove permission record

+

Parameters:
+ + +
permid int, local id of permission record
+
+ +

+Definition at line 365 of file ui_handler.class.php. +

+References permissions.

+

+ + + + +
+ + + + + + + + + +
uiHandler::removeSubj login  ) 
+
+ + + + + +
+   + + +

+removeSubj +

+Remove existing user or group

+

Parameters:
+ + +
login string, login name of removed user
+
+ +

+Definition at line 290 of file ui_handler.class.php. +

+References login(), and subjects.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
uiHandler::removeSubjFromGr login,
gname,
reid
+
+ + + + + +
+   + + +

+Remove subject from group. +

+

Parameters:
+ + + + +
login string
gname string
reid string, local id of managed group, just needed for redirect
+
+ +

+Definition at line 404 of file ui_handler.class.php. +

+References groups, login(), and subjects.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
uiHandler::rename newname,
id
+
+ + + + + +
+   + + +

+rename +

+Change the name of file or folder

+

Parameters:
+ + + +
newname string, new name for the file or folder
id int, destination folder id
+
+ +

+Definition at line 127 of file ui_handler.class.php.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
uiHandler::storeSystemPrefs &$  formdata,
&$  mask
+
+ + + + + +
+   + + +

+ +

+Definition at line 418 of file ui_handler.class.php. +

+References systemPrefs, and uiBase::tra().

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
uiHandler::upload &$  formdata,
id,
&$  mask
+
+ + + + + +
+   + + +

+upload +

+Provides file upload and store it to the storage

+

Parameters:
+ + + + + +
filename string, name for the uploaded file
mediafile file uploded by HTTP, raw binary media file
mdatafile file uploded by HTTP, metadata XML file
id int, destination folder id
+
+ +

+Definition at line 74 of file ui_handler.class.php.

+


Member Data Documentation

+

+ + + + +
+ + + + +
uiHandler::$alertMsg
+
+ + + + + +
+   + + +

+ +

+Definition at line 9 of file ui_handler.class.php.

+

+ + + + +
+ + + + +
uiHandler::$redirUrl
+
+ + + + + +
+   + + +

+ +

+Definition at line 8 of file ui_handler.class.php.

+


The documentation for this class was generated from the following file: +
Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/classuiHandler.png b/livesupport/modules/htmlUI/doc/doxygen/html/classuiHandler.png new file mode 100644 index 0000000000000000000000000000000000000000..b324c6f6977f47ad7b00464ec8ed819fcaca5f07 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^&OjW%!VDxgEW26?q$C1-LR|m<{|{vT|9@cq{DcWW z78oBmaG?6o|0h5$V@Z%-FoVOh8)-n!8BZ6-kcv5PF9-59EAX&A_;&R9zdH>68*;>N zP5y3wi0egx!t0m{gV{$VTJ&`j7R(kE-__?PGtGiOB680rvyZo8R0T7gU69qO4bRV(n3~{lKtf + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: conf.php Source File + + + + + +

conf.php

Go to the documentation of this file.
00001 <?php
+00002 /*------------------------------------------------------------------------------
+00003 
+00004     Copyright (c) 2004 Media Development Loan Fund
+00005 
+00006     This file is part of the LiveSupport project.
+00007     http://livesupport.campware.org/
+00008     To report bugs, send an e-mail to bugs@campware.org
+00009 
+00010     LiveSupport is free software; you can redistribute it and/or modify
+00011     it under the terms of the GNU General Public License as published by
+00012     the Free Software Foundation; either version 2 of the License, or
+00013     (at your option) any later version.
+00014 
+00015     LiveSupport is distributed in the hope that it will be useful,
+00016     but WITHOUT ANY WARRANTY; without even the implied warranty of
+00017     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+00018     GNU General Public License for more details.
+00019 
+00020     You should have received a copy of the GNU General Public License
+00021     along with LiveSupport; if not, write to the Free Software
+00022     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+00023 
+00024 
+00025     Author   : $Author: sebastian $
+00026     Version  : $Revision: 1.1 $
+00027     Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/htmlUI/doc/doxygen/html/Attic/conf_8php-source.html,v $
+00028 
+00029 ------------------------------------------------------------------------------*/
+00030 
+00049 $config = array(
+00050     /* ================================================== basic configuration */
+00051     'dsn'           => array(
+00052         'username'      => 'test',
+00053         'password'      => 'test',
+00054         'hostspec'      => 'localhost',
+00055         'phptype'       => 'pgsql',
+00056         'database'      => 'LiveSupport-test',
+00057     ),
+00058     'tblNamePrefix' => 'ls_',
+00059     'authCookieName'=> 'lssid',
+00060     #'storageDir'    =>  dirname(getcwd()).'/stor',
+00061     #'bufferDir'     =>  dirname(getcwd()).'/stor/buffer',
+00062     #'transDir'      =>  dirname(getcwd()).'/trans',
+00063     #'accessDir'     =>  dirname(getcwd()).'/access',
+00064     'storageDir'    =>  dirname(__FILE__).'/../../storageServer/var/stor',
+00065     'bufferDir'     =>  dirname(__FILE__).'/../../storageServer/var/stor/buffer',
+00066     'transDir'      =>  dirname(__FILE__).'/../../storageServer/var/trans',
+00067     'accessDir'     =>  dirname(__FILE__).'/../../storageServer/var/access',
+00068 
+00069     /* ==================================================== URL configuration */
+00070     'storageUrlPath'        => '/livesupportStorageServer',
+00071     'storageXMLRPC'         => 'xmlrpc/xrLocStor.php',
+00072     'storageUrlHost'        => 'localhost',
+00073     'storageUrlPort'        => 80,
+00074 
+00075     /* ================================================ archive configuration */
+00076     'archiveUrlPath'        => '/livesupportArchiveServer',
+00077     'archiveXMLRPC'         => 'xmlrpc/xrArchive.php',
+00078     'archiveUrlHost'        => 'localhost',
+00079     'archiveUrlPort'        => 80,
+00080     'archiveAccountLogin'   => 'root',
+00081     'archiveAccountPass'    => 'q',
+00082 
+00083     /* ==================================== aplication-specific configuration */
+00084     'objtypes'      => array(
+00085         'RootNode'      => array('Folder'),
+00086         'Storage'       => array('Folder', 'File', 'Replica'),
+00087         'Folder'        => array('Folder', 'File', 'Replica'),
+00088         'File'          => array(),
+00089         'Replica'       => array(),
+00090     ),
+00091     'allowedActions'=> array(
+00092         'RootNode'      => array('classes', 'subjects'),
+00093         'Folder'        => array('editPrivs', 'write', 'read'),
+00094         'File'          => array('editPrivs', 'write', 'read'),
+00095         'Replica'       => array('editPrivs', 'write', 'read'),
+00096         '_class'        => array('editPrivs', 'write', 'read'),
+00097     ),
+00098     'allActions'    =>  array(
+00099         'editPrivs', 'write', 'read', 'classes', 'subjects'
+00100     ),
+00101 
+00102     /* ============================================== auxiliary configuration */
+00103     'RootNode'        => 'RootNode',
+00104     'tmpRootPass'   => 'q',
+00105 );
+00106 
+00107 
+00108 
+00109 
+00110 define('UI_HANDLER', 'ui_handler.php');
+00111 define('UI_BROWSER', 'ui_browser.php');
+00112 define('UI_FORM_STANDARD_METHOD', 'POST');
+00113 define('UI_INPUT_STANDARD_SIZE', 20);
+00114 define('UI_INPUT_STANDARD_MAXLENGTH', 50);
+00115 define('UI_INPUT_GBOBJECT_MAXFILESIZE', 10000);
+00116 define('UI_QFORM_REQUIRED',     'templates/form_parts/required.tpl');
+00117 define('UI_QFORM_REQUIREDNOTE', 'templates/form_parts/requirednote.tpl');
+00118 define('UI_QFORM_ERROR',        'templates/form_parts/required.tpl');
+00119 ?>
+

Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/conf_8php.html b/livesupport/modules/htmlUI/doc/doxygen/html/conf_8php.html new file mode 100644 index 000000000..c2d076139 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/conf_8php.html @@ -0,0 +1,326 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: conf.php File Reference + + + + + +

conf.php File Reference

+

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + +

Enumerations

enum  UI_HANDLER
enum  UI_BROWSER
enum  UI_FORM_STANDARD_METHOD
enum  UI_INPUT_STANDARD_SIZE
enum  UI_INPUT_STANDARD_MAXLENGTH
enum  UI_INPUT_GBOBJECT_MAXFILESIZE
enum  UI_QFORM_REQUIRED
enum  UI_QFORM_REQUIREDNOTE
enum  UI_QFORM_ERROR

Variables

 $config
 configuration structure:
+


Enumeration Type Documentation

+

+ + + + +
+ + + + +
enum UI_BROWSER
+
+ + + + + +
+   + + +

+ +

+Definition at line 111 of file conf.php.

+

+ + + + +
+ + + + +
enum UI_FORM_STANDARD_METHOD
+
+ + + + + +
+   + + +

+ +

+Definition at line 112 of file conf.php.

+

+ + + + +
+ + + + +
enum UI_HANDLER
+
+ + + + + +
+   + + +

+ +

+Definition at line 110 of file conf.php.

+

+ + + + +
+ + + + +
enum UI_INPUT_GBOBJECT_MAXFILESIZE
+
+ + + + + +
+   + + +

+ +

+Definition at line 115 of file conf.php.

+

+ + + + +
+ + + + +
enum UI_INPUT_STANDARD_MAXLENGTH
+
+ + + + + +
+   + + +

+ +

+Definition at line 114 of file conf.php.

+

+ + + + +
+ + + + +
enum UI_INPUT_STANDARD_SIZE
+
+ + + + + +
+   + + +

+ +

+Definition at line 113 of file conf.php.

+

+ + + + +
+ + + + +
enum UI_QFORM_ERROR
+
+ + + + + +
+   + + +

+ +

+Definition at line 118 of file conf.php.

+

+ + + + +
+ + + + +
enum UI_QFORM_REQUIRED
+
+ + + + + +
+   + + +

+ +

+Definition at line 116 of file conf.php.

+

+ + + + +
+ + + + +
enum UI_QFORM_REQUIREDNOTE
+
+ + + + + +
+   + + +

+ +

+Definition at line 117 of file conf.php.

+


Variable Documentation

+

+ + + + +
+ + + + +
$config
+
+ + + + + +
+   + + +

+configuration structure: +

+

+
dsn
+
datasource setting
+
tblNamePrefix
+
prefix for table names in the database
+
authCookieName
+
secret token cookie name
+
storageDir
+
main directory for storing binary media files
+
bufferDir
+
directory for temporary files
+
transDir
+
directory for incomplete transferred files
+
accessDir
+
directory for symlinks to accessed files
+
storageUrlPath
+
path-URL-part of storageServer base dir
+
storageXMLRPC
+
XMLRPC server script address relative to storageUrlPath
+
storageUrlHost, storageUrlPort
+
host and port of storageServer
+
archiveUrlPath
+
path-URL-part of archiveServer base dir
+
archiveXMLRPC
+
XMLRPC server script address relative to archiveUrlPath
+
archiveUrlHost, archiveUrlPort
+
host and port of archiveServer
+
+ +

+Definition at line 49 of file conf.php. +

+Referenced by uiBrowser::uiBrowser(), and uiHandler::uiHandler().

+


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/dir_000000.html b/livesupport/modules/htmlUI/doc/doxygen/html/dir_000000.html new file mode 100644 index 000000000..a5f4e9c74 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/dir_000000.html @@ -0,0 +1,39 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: var/ Directory Reference + + + + + +

var Directory Reference

+ + + + + + + + + + + + + + + + + + + + + + + +

Directories

directory  html

Files

file  conf.php [code]
file  index.php [code]
file  SmartyExtensions.inc.php [code]
file  ui_base.inc.php [code]
file  ui_browser.class.php [code]
file  ui_browser_init.php [code]
file  ui_fmask.inc.php [code]
file  ui_handler.class.php [code]
file  ui_handler_init.php [code]
+
Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/dir_000001.html b/livesupport/modules/htmlUI/doc/doxygen/html/dir_000001.html new file mode 100644 index 000000000..b8952f801 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/dir_000001.html @@ -0,0 +1,24 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: var/html/ Directory Reference + + + + + +

html Directory Reference

+ + + + + + + + +

Files

file  html/index.php [code]
file  ui_browser.php [code]
file  ui_handler.php [code]
+
Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/dirs.html b/livesupport/modules/htmlUI/doc/doxygen/html/dirs.html new file mode 100644 index 000000000..46cb033e7 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/dirs.html @@ -0,0 +1,18 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: Directory Hierarchy + + + + +

LiveSupport - htmlUI module Directories

This directory hierarchy is sorted roughly, but not completely, alphabetically: +
Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/doxygen.css b/livesupport/modules/htmlUI/doc/doxygen/html/doxygen.css new file mode 100644 index 000000000..e5272cd12 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/doxygen.css @@ -0,0 +1,297 @@ +BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { + font-family: Geneva, Arial, Helvetica, sans-serif; +} +BODY,TD { + font-size: 90%; +} +H1 { + text-align: center; + font-size: 160%; +} +H2 { + font-size: 120%; +} +H3 { + font-size: 110%; +} +CAPTION { font-weight: bold } +DIV.qindex { + width: 100%; + background-color: #eeeeff; + border: 1px solid #b0b0b0; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.nav { + width: 100%; + background-color: #eeeeff; + border: 1px solid #b0b0b0; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +A.qindex { + text-decoration: none; + font-weight: bold; + color: #1A419D; +} +A.qindex:visited { + text-decoration: none; + font-weight: bold; + color: #1A419D +} +A.qindex:hover { + text-decoration: none; + background-color: #ddddff; +} +A.qindexHL { + text-decoration: none; + font-weight: bold; + background-color: #6666cc; + color: #ffffff; + border: 1px double #9295C2; +} +A.qindexHL:hover { + text-decoration: none; + background-color: #6666cc; + color: #ffffff; +} +A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff } +A.el { text-decoration: none; font-weight: bold } +A.elRef { font-weight: bold } +A.code:link { text-decoration: none; font-weight: normal; color: #0000FF} +A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF} +A.codeRef:link { font-weight: normal; color: #0000FF} +A.codeRef:visited { font-weight: normal; color: #0000FF} +A:hover { text-decoration: none; background-color: #f2f2ff } +DL.el { margin-left: -1cm } +.fragment { + font-family: monospace +} +PRE.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + margin-top: 4px; + margin-bottom: 4px; + margin-left: 2px; + margin-right: 8px; + padding-left: 6px; + padding-right: 6px; + padding-top: 4px; + padding-bottom: 4px; +} +DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } +TD.md { background-color: #F4F4FB; font-weight: bold; } +TD.mdPrefix { + background-color: #F4F4FB; + color: #606060; + font-size: 80%; +} +TD.mdname1 { background-color: #F4F4FB; font-weight: bold; color: #602020; } +TD.mdname { background-color: #F4F4FB; font-weight: bold; color: #602020; width: 600px; } +DIV.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; +} +DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% } +BODY { + background: white; + color: black; + margin-right: 20px; + margin-left: 20px; +} +TD.indexkey { + background-color: #eeeeff; + font-weight: bold; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TD.indexvalue { + background-color: #eeeeff; + font-style: italic; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TR.memlist { + background-color: #f0f0f0; +} +P.formulaDsp { text-align: center; } +IMG.formulaDsp { } +IMG.formulaInl { vertical-align: middle; } +SPAN.keyword { color: #008000 } +SPAN.keywordtype { color: #604020 } +SPAN.keywordflow { color: #e08000 } +SPAN.comment { color: #800000 } +SPAN.preprocessor { color: #806020 } +SPAN.stringliteral { color: #002080 } +SPAN.charliteral { color: #008080 } +.mdTable { + border: 1px solid #868686; + background-color: #F4F4FB; +} +.mdRow { + padding: 8px 10px; +} +.mdescLeft { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.mdescRight { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.memItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplParams { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + color: #606060; + background-color: #FAFAFA; + font-size: 80%; +} +.search { color: #003399; + font-weight: bold; +} +FORM.search { + margin-bottom: 0px; + margin-top: 0px; +} +INPUT.search { font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #eeeeff; +} +TD.tiny { font-size: 75%; +} +a { + color: #252E78; +} +a:visited { + color: #3D2185; +} +.dirtab { padding: 4px; + border-collapse: collapse; + border: 1px solid #b0b0b0; +} +TH.dirtab { background: #eeeeff; + font-weight: bold; +} +HR { height: 1px; + border: none; + border-top: 1px solid black; +} diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/doxygen.png b/livesupport/modules/htmlUI/doc/doxygen/html/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..f0a274bbaffdd67f6d784c894d9cf28729db0e14 GIT binary patch literal 1281 zcmaJ>ZA?>F7(Vx-ms?uoS`b@hdRtpo6o^%HU>M$hfGrBvQnk$LE?p^P!kn&ikhyq! zX~V@&tPF5Qt@V?oTL96Bi%aRiwbe1)9DWQI#?)=HxS7QSw`J`5fAJ*eJbB;uNuKA& zdERDo*{Y<(If(#(B$Lr#;nB(8Y#ia=ZCeW?JfPLuQY`=@cW$k}Rivq|vbxGrRq1Tl9;+(gNt?}UtVKM2`T5t1jLzuL@0UIs`S#vlhl4)^ zLgSYrPj@$+`|j?eSbXTmiHGkWxV8V}BzNR?pl9k_s4pDu9vd5a_UzZEPk)}Ad{AV_ zzddrjrh4=Imr`E06;LY{)YYt?o}L~H@7C}F^WB!Ra=v`Q0bj{>5&$66CWF>mf6vjP z2N>RRY6ZYa=K`76>+|_)Xdwko+7wv}7cN|btOhWb(*{sta~6b?S8Omrxw}!4`NhGr zZVpNqpu1@BE`QGWNTpEpcJVW5izu~2B^GlM?1(OPg)zwW;QcP@Ltcclm>XbJL9C|j z=9!2?ua=uIlf0%AndzHsRC}IyTL$EhAee(fdKB`?27KeS^2M8M_7b~PiCFO&r5LC7 z7gl1*a<8;SjNaw#h=843_AV9iZbWQOAp5YOC^&_F*9K0> zB|6%IDb?aM#3viTxkLU4aXg&@+CkNTOnQ1iMP*^?b|^lJy$4C)Zk4isV!|RZ*XhXh zw8q3$=*0LeGC!XI_Wc?dkT~3+*Gu%%yIqP+Wr3H$=&ROMQU6q}Ag^P~>c5vAEO;a- z_dK-3PPeKar%)6$j~vI2#*-YH!1h6HYVtwCX5_wM`iF#UKz&&@9Oo5w3%XGYrX zW>dY~)SG-((Yim%`InwgTvyRC?e=Wh^8KCao!R6Eg&TpVWUY1sN~4G}V?nFnEGo-; zHZ_$eW9-GnC%^WS9b z@p;-$oH#MtC0v>Q$HX%4^JdFdO$0cbv-W)Q TtK}Eh@>>I#ipmV1>S*>q-hkC} literal 0 HcmV?d00001 diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/files.html b/livesupport/modules/htmlUI/doc/doxygen/html/files.html new file mode 100644 index 000000000..c4bfdf393 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/files.html @@ -0,0 +1,26 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: File Index + + + + +

LiveSupport - htmlUI module File List

Here is a list of all files with brief descriptions: + + + + + + + + + + + + +
conf.php [code]
index.php [code]
html/index.php [code]
SmartyExtensions.inc.php [code]
ui_base.inc.php [code]
ui_browser.class.php [code]
ui_browser.php [code]
ui_browser_init.php [code]
ui_fmask.inc.php [code]
ui_handler.class.php [code]
ui_handler.php [code]
ui_handler_init.php [code]
+
Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/functions.html b/livesupport/modules/htmlUI/doc/doxygen/html/functions.html new file mode 100644 index 000000000..1006d4015 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/functions.html @@ -0,0 +1,88 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: Class Members + + + + + +
$ | _ | a | c | d | g | l | m | n | p | r | s | t | u
+ +

+ +

+Here is a list of all class members with links to the classes they belong to:

- $ -

+

- _ -

+

- a -

+

- c -

+

- d -

+

- g -

+

- l -

+

- m -

+

- n -

+

- p -

+

- r -

+

- s -

+

- t -

+

- u -

+
Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/functions_func.html b/livesupport/modules/htmlUI/doc/doxygen/html/functions_func.html new file mode 100644 index 000000000..6d666e3d9 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/functions_func.html @@ -0,0 +1,84 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: Class Members - Functions + + + + + +
_ | a | c | d | g | l | m | n | p | r | s | t | u
+ +

+ +

+

- _ -

+

- a -

+

- c -

+

- d -

+

- g -

+

- l -

+

- m -

+

- n -

+

- p -

+

- r -

+

- s -

+

- t -

+

- u -

+
Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/functions_vars.html b/livesupport/modules/htmlUI/doc/doxygen/html/functions_vars.html new file mode 100644 index 000000000..f9903d818 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/functions_vars.html @@ -0,0 +1,19 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: Class Members - Variables + + + + + + +

+

+
Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/globals.html b/livesupport/modules/htmlUI/doc/doxygen/html/globals.html new file mode 100644 index 000000000..dd3c8f3de --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/globals.html @@ -0,0 +1,103 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: File Members + + + + + +
$ | _ | a | b | c | d | e | g | i | l | m | n | p | r | s | u
+ +

+ +

+Here is a list of all file members with links to the files they belong to:

- $ -

+

- _ -

+

- a -

+

- b -

+

- c -

+

- d -

+

- e -

+

- g -

+

- i -

+

- l -

+

- m -

+

- n -

+

- p -

+

- r -

+

- s -

+

- u -

+
Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/globals_enum.html b/livesupport/modules/htmlUI/doc/doxygen/html/globals_enum.html new file mode 100644 index 000000000..6234836f3 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/globals_enum.html @@ -0,0 +1,26 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: File Members - Enumerations + + + + + + +

+

+
Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/globals_func.html b/livesupport/modules/htmlUI/doc/doxygen/html/globals_func.html new file mode 100644 index 000000000..828412468 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/globals_func.html @@ -0,0 +1,23 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: File Members - Functions + + + + + + +

+

+
Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/globals_vars.html b/livesupport/modules/htmlUI/doc/doxygen/html/globals_vars.html new file mode 100644 index 000000000..24f84ae29 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/globals_vars.html @@ -0,0 +1,88 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: File Members - Variables + + + + + +
$ | _ | a | b | c | d | e | g | i | l | m | n | p | r | s | u
+ +

+ +

+

- $ -

+

- _ -

+

- a -

+

- b -

+

- c -

+

- d -

+

- e -

+

- g -

+

- i -

+

- l -

+

- m -

+

- n -

+

- p -

+

- r -

+

- s -

+

- u -

+
Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/hierarchy.html b/livesupport/modules/htmlUI/doc/doxygen/html/hierarchy.html new file mode 100644 index 000000000..7d45d2798 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/hierarchy.html @@ -0,0 +1,19 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: Hierarchical Index + + + + +

LiveSupport - htmlUI module Class Hierarchy

This inheritance list is sorted roughly, but not completely, alphabetically: +
Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/html_2index_8php-source.html b/livesupport/modules/htmlUI/doc/doxygen/html/html_2index_8php-source.html new file mode 100644 index 000000000..64a212725 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/html_2index_8php-source.html @@ -0,0 +1,18 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: index.php Source File + + + + + +

html/index.php

Go to the documentation of this file.
00001 <?php
+00002 require_once dirname(__FILE__).'/../conf.php';
+00003 header('LOCATION: '.HTMLUI_BROWSER);
+00004 ?>
+

Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/html_2index_8php.html b/livesupport/modules/htmlUI/doc/doxygen/html/html_2index_8php.html new file mode 100644 index 000000000..48c6514b6 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/html_2index_8php.html @@ -0,0 +1,19 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: index.php File Reference + + + + + +

html/index.php File Reference

+

+Go to the source code of this file. + +
+


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/index.html b/livesupport/modules/htmlUI/doc/doxygen/html/index.html new file mode 100644 index 000000000..745161c7a --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/index.html @@ -0,0 +1,14 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: Main Page + + + + +

LiveSupport - htmlUI module Documentation

+

+

1.0


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/index_8php-source.html b/livesupport/modules/htmlUI/doc/doxygen/html/index_8php-source.html new file mode 100644 index 000000000..20b3eace6 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/index_8php-source.html @@ -0,0 +1,18 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: index.php Source File + + + + + +

index.php

Go to the documentation of this file.
00001 <?php
+00002 require_once dirname(__FILE__).'/conf.php';
+00003 header('LOCATION: '.UI_BROWSER);
+00004 ?>
+

Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/index_8php.html b/livesupport/modules/htmlUI/doc/doxygen/html/index_8php.html new file mode 100644 index 000000000..89f0743d6 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/index_8php.html @@ -0,0 +1,19 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: index.php File Reference + + + + + +

index.php File Reference

+

+Go to the source code of this file. + +
+


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/ui__base_8inc_8php-source.html b/livesupport/modules/htmlUI/doc/doxygen/html/ui__base_8inc_8php-source.html new file mode 100644 index 000000000..2064b470b --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/ui__base_8inc_8php-source.html @@ -0,0 +1,92 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: ui_base.inc.php Source File + + + + + +

ui_base.inc.php

Go to the documentation of this file.
00001 <?php
+00002 function errCallBack($err)
+00003 {
+00004     echo "<pre>gm:\n".$err->getMessage()."\ndi:\n".$err->getDebugInfo()."\nui:\n".$err->getUserInfo()."\n";
+00005     echo "<hr>BackTrace:\n";
+00006     print_r($err->backtrace);
+00007     echo "</pre>\n";
+00008     exit;
+00009 }
+00010 
+00017 class uiBase
+00018 {
+00019     // --- basic funtionality ---
+00028     function tra($input)
+00029     {
+00030         // just a dummy function yet
+00031 
+00032         return $input;
+00033     }
+00034 
+00035 
+00045     function _parseArr2Form(&$form, &$mask, $side='client')
+00046     {
+00047         foreach($mask as $k=>$v) {
+00048             ## add elements ########################
+00049             if ($v['type']=='radio') {
+00050                 foreach($v['options'] as $rk=>$rv) {
+00051                     $radio[] =& $form->createElement($v['type'], NULL, NULL, $rv, $rk);
+00052                 }
+00053                 $form->addGroup($radio, $v['element'], $this->tra($v['label']));
+00054                 unset($radio);
+00055 
+00056             } elseif (isset($v['type'])) {
+00057                 $elem[$v['element']] =& $form->createElement($v['type'], $v['element'], $this->tra($v['label']), ($v['attributes']?$v['attributes']:(($v[type]=='text'||$v['type']=='file')?array('size'=>UI_INPUT_STANDARD_SIZE, 'maxlength'=>UI_INPUT_STANDARD_MAXLENGTH):NULL)));
+00058                 if($v['type']=='select') {
+00059                     $elem[$v['element']]->loadArray($v['options']);
+00060                     $elem[$v['element']]->setMultiple($v['multiple']);
+00061                 };
+00062                 if (!$v['groupit']) $form->addElement($elem[$v['element']]);
+00063             }
+00064             ## add required rule ###################
+00065             if ($v['required']) {
+00066                 $form->addRule($v['element'], ($v['errormsg']?$this->tra($v['errormsg']):$this->tra('please enter value for').' '.$this->tra($v['label'])), 'required', NULL, $side);
+00067             }
+00068             ## add constant value ##################
+00069             if (isset($v['constant'])) {
+00070                 $form->setConstants(array($v['element']=>$v['constant']));
+00071             }
+00072             ## add default value ###################
+00073             if (isset($v['default'])) {
+00074                 $form->setDefaults(array($v['element']=>$v['default']));
+00075             }
+00076             ## add other rules #####################
+00077             if ($v['rule']) {
+00078                 $form->addRule($v['element'], $this->tra($v['errormsg']), $v['rule'] , NULL, $side);
+00079             }
+00080             ## add group ###########################
+00081             if (is_array($v['group'])) {
+00082                 foreach($v['group'] as $val) {
+00083                     $groupthose[] =& $elem[$val];
+00084                 }
+00085                 $form->addGroup($groupthose, $v['name'], $this->tra($v['label']), $v['seperator'], $v['appendName']);
+00086                 unset($groupthose);
+00087             }
+00088             ## check error on type file ##########
+00089             if ($v['type']=='file') {
+00090                 if ($_POST[$v['element']]['error']) {
+00091                     $form->setElementError($v['element'], ($v['errormsg']?$this->tra($v['errormsg']):$this->tra('please enter value for').' '.$this->tra($v['label'])));
+00092                 }
+00093             }
+00094         }
+00095 
+00096         reset($mask);
+00097 
+00098         $form->validate();
+00099     }
+00100 }
+00101 ?>
+

Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/ui__base_8inc_8php.html b/livesupport/modules/htmlUI/doc/doxygen/html/ui__base_8inc_8php.html new file mode 100644 index 000000000..2e0bedd19 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/ui__base_8inc_8php.html @@ -0,0 +1,53 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: ui_base.inc.php File Reference + + + + + +

ui_base.inc.php File Reference

+

+Go to the source code of this file. + + + + +

Functions

 errCallBack ($err)
+


Function Documentation

+

+ + + + +
+ + + + + + + + + +
errCallBack err  ) 
+
+ + + + + +
+   + + +

+ +

+Definition at line 2 of file ui_base.inc.php.

+


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser_8class_8php-source.html b/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser_8class_8php-source.html new file mode 100644 index 000000000..2cfec689a --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser_8class_8php-source.html @@ -0,0 +1,288 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: ui_browser.class.php Source File + + + + + +

ui_browser.class.php

Go to the documentation of this file.
00001 <?php
+00002 class uiBrowser extends uiBase {
+00003     var $alertMsg;
+00004 
+00005     // --- class constructor ---
+00015     function uiBrowser($config)
+00016     {
+00017         $dbc = DB::connect($config['dsn'], TRUE);
+00018         $dbc->setFetchMode(DB_FETCHMODE_ASSOC);
+00019         $this->gb = &new GreenBox(&$dbc, $config);
+00020         $this->id = (!$_REQUEST['id'] ? $this->gb->storId : $_REQUEST['id']);
+00021         $this->sessid = $_REQUEST[$config['authCookieName']];
+00022         $this->userid = $this->gb->getSessUserId($this->sessid);
+00023         $this->login  = $this->gb->getSessLogin($this->sessid);
+00024         $this->InputTextStandardAttrib = array('size'     =>UI_INPUT_STANDARD_SIZE,
+00025                                                'maxlength'=>UI_INPUT_STANDARD_MAXLENGTH);
+00026 
+00027     }
+00028 
+00029     // --- error handling ---
+00038     function alertMsg()
+00039     {
+00040         if ($_SESSION['alertMsg']) {
+00041             $this->alertMsg = $_SESSION['alertMsg'];
+00042             unset($_SESSION['alertMsg']);
+00043             return $this->alertMsg;
+00044         }
+00045         return false;
+00046     }
+00047 
+00048     // --- template feed ---
+00057     function loginform(&$Smarty, &$mask)
+00058     {
+00059         $form = new HTML_QuickForm('loginbox', UI_STANDARD_FORM_METHOD, UI_HANDLER);
+00060         $form->setRequiredNote(file_get_contents(UI_QFORM_REQUIREDNOTE));
+00061         $this->_parseArr2Form($form, $mask);
+00062 
+00063         ## using Static Smarty Renderer
+00064         $renderer =& new HTML_QuickForm_Renderer_ArraySmarty($Smarty, true);
+00065         $renderer->setRequiredTemplate(file_get_contents(UI_QFORM_REQUIRED));
+00066         $renderer->setErrorTemplate(file_get_contents(UI_QFORM_ERROR));
+00067 
+00068         $form->accept($renderer);
+00069 
+00070         return $renderer->toArray();
+00071     }
+00072 
+00073 
+00074 
+00075 
+00083     function getUserInfo()
+00084     {
+00085         return array('uname'=>$this->gb->getSessLogin($this->sessid),
+00086                      'uid'  =>$this->gb->getSessUserId($this->sessid));
+00087     }
+00088 
+00099     function getStructure($id, $homedir=FALSE)
+00100     {
+00101         if ($homedir) {
+00102             $id = $this->gb->getObjId($this->login, $this->gb->storId);
+00103             $data['id'] = $id;
+00104         } else {
+00105             $data['id'] = $id;
+00106         }
+00107 
+00108         $data=array_merge($data, array(
+00109                 'pathdata'  => $this->gb->getPath($id, $this->sessid),
+00110                 'listdata'  => ($this->gb->getObjType($id)=='Folder'?
+00111                     $this->gb->listFolder($id, $this->sessid):array()
+00112                 ),
+00113                 'tree'  => ($_REQUEST['tree']=='Y'),
+00114                 'showPath'  => true,
+00115                 'showTree'  => true,
+00116             ));
+00117             if($_REQUEST['tree']=='Y'){
+00118                 $data['treedata'] = $this->gb->getSubTree($id, $this->sessid);
+00119             }
+00120 
+00121         if(PEAR::isError($data['listdata'])){
+00122             $data['msg'] = $data['listdata']->getMessage();
+00123             $data['listdata'] = array();
+00124         }
+00125 
+00126         return $data;
+00127     }
+00128 
+00129 
+00139     function getNewFileForm($id, $mask)
+00140     {
+00141         $form = new HTML_QuickForm('newfile', UI_STANDARD_FORM_METHOD, UI_HANDLER);
+00142         $form->setConstants(array('id'=>$id));
+00143         $form->addElement('hidden', 'id');
+00144 
+00145         $this->_parseArr2Form($form, $mask);
+00146 
+00147         return $form->toHTML();
+00148     }
+00149 
+00150 
+00160     function getSearchForm($id, &$mask)
+00161     {
+00162         $form = new HTML_QuickForm('search', UI_STANDARD_FORM_METHOD, UI_BROWSER);
+00163         $form->setConstants(array('id'=>$id));
+00164         $form->addElement('hidden', 'id');
+00165 
+00166         $this->_parseArr2Form($form, $mask);
+00167 
+00168         return $form->toHTML();
+00169     }
+00170 
+00178     function getSubjects()
+00179     {
+00180         return array('subj'       => $this->gb->getSubjectsWCnt(),
+00181                      'loggedAs'   => $this->login
+00182                     );
+00183     }
+00184 
+00185 
+00193     function getAddSubjectForm($mask)
+00194     {
+00195         $form = new HTML_QuickForm('addSubject', UI_STANDARD_FORM_METHOD, UI_HANDLER);
+00196         #$form->setConstants(array('act'=>'addSubj'));
+00197         #$form->addElement('hidden', 'act');
+00198         #$form->addElement('text', 'login', $this->tra('Add Subject with Name'), $this->InputTextStandardAttrib);
+00199         #$form->addElement('password', 'pass', $this->tra('and Password'), $this->InputTextStandardAttrib);
+00200         #$form->addElement('submit', NULL, $this->tra('Add'));
+00201         #$form->addRule('login', $this->tra('enter a Subject Name'), 'required', null, 'client');
+00202         #$form->addRule('pass', $this->tra('enter a Password'), 'required', null, 'client');
+00203         $this->_parseArr2Form($form, $mask);
+00204         return $form->toHTML();
+00205     }
+00206 
+00214     function getChangePasswdForm($uid)
+00215     {
+00216         $form = new HTML_QuickForm('changePasswd', UI_STANDARD_FORM_METHOD, UI_HANDLER);
+00217         $form->setConstants(array('act'=>'changePasswd',
+00218                                   'uid'=>$uid));
+00219         $form->addElement('hidden', 'act');
+00220         $form->addElement('hidden', 'uid');
+00221         $form->addElement('text', 'oldpass', $this->tra('Old Password'), $this->InputTextStandardAttrib);
+00222         $form->addElement('text', 'pass', $this->tra('new Password'), $this->InputTextStandardAttrib);
+00223         $form->addElement('text', 'pass2', $this->tra('retype new Password'), $this->InputTextStandardAttrib);
+00224         $form->addElement('submit', NULL, $this->tra('Change'));
+00225         $form->addRule('oldpass', $this->tra('enter Old Password'), 'required', null, 'client');
+00226         $form->addRule('pass', $this->tra('enter new Password'), 'required', null, 'client');
+00227         $form->addRule('pass2', $this->tra('retype new Password'), 'required', null, 'client');
+00228         $form->addRule(array('pass', 'pass2'), 'The passwords do not match', 'compare', null, 'client');
+00229 
+00230         return $form->toHTML();
+00231     }
+00232 
+00241     function getGroups($id)
+00242     {
+00243         return array(
+00244             'rows'      => $this->gb->listGroup($id),
+00245             'id'        => $id,
+00246             'loggedAs'  => $this->login,
+00247             'gname'     => $this->gb->getSubjName($id),
+00248             'subj'      => $this->gb->getSubjects()
+00249         );
+00250     }
+00251 
+00252 
+00262     function getSubj2GroupForm($id)
+00263     {
+00264         $g = $this->getGroups($id);
+00265         foreach($g['subj'] as $s) {
+00266             $this->logins[($s['login'])]=$s['login'];
+00267         }
+00268 
+00269         $form = new HTML_QuickForm('addSubj2Group', UI_STANDARD_FORM_METHOD, UI_HANDLER);
+00270         $form->setConstants(array('act'=>'addSubj2Group',
+00271                                   'reid'=>$g['id'],
+00272                                   'gname'=>$g['gname']));
+00273         $form->addElement('hidden', 'act');
+00274         $form->addElement('hidden', 'reid');
+00275         $form->addElement('hidden', 'gname');
+00276         $s =& $form->createElement('select', 'login', 'Add Group: ');
+00277         $s->loadArray($this->logins, NULL);
+00278         $form->addElement($s);
+00279         $form->addElement('submit', NULL, $this->tra('Do'));
+00280 
+00281         return $form->toHTML();
+00282     }
+00283 
+00293     function getPermissions($id)
+00294     {
+00295         return array('pathdata'  => $this->gb->getPath($id),
+00296                      'perms'     => $this->gb->getObjPerms($id),
+00297                      'actions'   => $this->gb->getAllowedActions($this->gb->getObjType($id)),
+00298                      'subjects'  => $this->gb->getSubjects(),
+00299                      'id'        => $id,
+00300                      'loggedAs'  => $this->login
+00301                      );
+00302     }
+00303 
+00313     function getNewFileData($id)
+00314     {
+00315         return array('pathdata'  => $this->gb->getPath($id, $this->sessid),
+00316                      'showEdit'  => true,
+00317                      'id'    => $id,
+00318                       );
+00319     }
+00320 
+00330     function getSearchRes($id, $search)
+00331     {
+00332         foreach ($this->gb->localSearch($search, $this->sessid) as $rec) {
+00333                 $res = array('items' => array('gunid'  => $rec,
+00334                                               'par_id' => $this->gb->_idFromGunid($rec)));
+00335             }
+00336 
+00337         return array('search'   => $res,
+00338                      'showSRes' => true,
+00339                      'id'       => $id
+00340                      );
+00341 
+00342     }
+00343 
+00353     function getFile($id)
+00354     {
+00355         $r = $this->gb->access($id, $this->sessid);
+00356         if(PEAR::isError($r)) $_SESSION['alertMsg'] = $r->getMessage();
+00357         else print_r($r);
+00358     }
+00359 
+00368     function getMdata($id)
+00369     {
+00370         return($this->gb->getMdata($id, $this->sessid));
+00371     }
+00372 
+00380     function getInfo($id)
+00381     {
+00382         $ia = $this->gb->analyzeFile($id, $this->sessid);
+00383 
+00384         return "fileformat: {$ia['fileformat']}<br>
+00385                 channels: {$ia['audio']['channels']}<br>
+00386                 sample_rate: {$ia['audio']['sample_rate']}<br>
+00387                 bits_per_sample: {$ia['audio']['bits_per_sample']}<br>
+00388                 channelmode: {$ia['audio']['channelmode']}<br>
+00389                 title: {$ia['id3v1']['title']}<br>
+00390                 artist: {$ia['id3v1']['artist']}<br>
+00391                 comment: {$ia['id3v1']['comment']}";
+00392     }
+00393 
+00402     function getMetadataForm($id, &$mask)
+00403     {
+00404         $form = new HTML_QuickForm('editMetaData', UI_STANDARD_FORM_METHOD, UI_HANDLER);
+00405         $form->setConstants(array('act'=>'editMetaData',
+00406                                   'id'=>$id));
+00407         $form->addElement('hidden', 'act');
+00408         $form->addElement('hidden', 'id');
+00409 
+00410         $this->_parseArr2Form($form, $mask);
+00411 
+00412         return $form->toHTML();
+00413     }
+00414 
+00415 
+00416     function systemPrefs(&$mask)
+00417     {
+00418         $form = new HTML_QuickForm('systemPrefs', UI_STANDARD_FORM_METHOD, UI_HANDLER);
+00419         $form->setConstants(array('act'=>'systemPrefs'));
+00420         $form->addElement('hidden', 'act');
+00421 
+00422         $this->_parseArr2Form($form, $mask);
+00423 
+00424         ## using Static Smarty Renderer
+00425         $renderer =& new HTML_QuickForm_Renderer_Array(true, true);
+00426         $form->accept($renderer);
+00427 
+00428         return $renderer->toArray();
+00429     }
+00430 }
+00431 ?>
+

Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser_8class_8php.html b/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser_8class_8php.html new file mode 100644 index 000000000..a0fa826b9 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser_8class_8php.html @@ -0,0 +1,19 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: ui_browser.class.php File Reference + + + + + +

ui_browser.class.php File Reference

+

+Go to the source code of this file. + +
+


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser_8php-source.html b/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser_8php-source.html new file mode 100644 index 000000000..45472bf87 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser_8php-source.html @@ -0,0 +1,125 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: ui_browser.php Source File + + + + + +

ui_browser.php

Go to the documentation of this file.
00001 <?php
+00002 require_once dirname(__FILE__).'/../ui_browser_init.php';
+00003 
+00004 if (!$uiBrowser->sessid) {
+00005     $Smarty->assign('loginform', $uiBrowser->loginform($Smarty, $ui_fmask['login']));
+00006     $Smarty->display('login.tpl');
+00007     die();
+00008 }
+00009 
+00010 
+00011 
+00012 switch($_REQUEST['act']){
+00013     case "getHomeDir":
+00014     default:
+00015         $Smarty->assign('structure', $uiBrowser->getStructure($uiBrowser->id, $_REQUEST['act']=='getHomeDir' ? TRUE : FALSE));
+00016         $Smarty->assign('showPath', TRUE);
+00017 
+00018         if ($_REQUEST['tree']=='Y') {
+00019             $Smarty->assign('showTree', TRUE);
+00020         } else {
+00021             $Smarty->assign('showObjects', TRUE);
+00022         }
+00023         $Smarty->assign('delOverride', $_REQUEST['delOverride']);
+00024         $Smarty->assign('obj_types', array('Folder'=>'D', 'File'=>'F', 'Replica'=>'R'));
+00025         break;
+00026 
+00027     case "permissions":
+00028         $Smarty->assign('structure', $uiBrowser->getStructure($uiBrowser->id, $_REQUEST['act']=='getHomeDir' ? TRUE : FALSE));
+00029         $Smarty->assign('showPath', TRUE);
+00030 
+00031         $Smarty->assign('perms', $uiBrowser->getPermissions($uiBrowser->id));
+00032         $Smarty->assign('showPermissions', TRUE);
+00033     break;
+00034 
+00035     case "newfile":
+00036         $Smarty->assign('structure', $uiBrowser->getStructure($uiBrowser->id, $_REQUEST['act']=='getHomeDir' ? TRUE : FALSE));
+00037         $Smarty->assign('showPath', TRUE);
+00038 
+00039         $Smarty->assign('newfiledata', $uiBrowser->getNewFileData($uiBrowser->id));
+00040         $Smarty->assign('newfileform', $uiBrowser->getNewFileForm($uiBrowser->id, $ui_fmask['upload']));
+00041         $Smarty->assign('showNewFileForm', TRUE);
+00042         break;
+00043 
+00044     case "sform":
+00045         $Smarty->assign('searchform', $uiBrowser->getSearchForm($uiBrowser->id, $ui_fmask['search']));
+00046         $Smarty->assign('showSearchForm', TRUE);
+00047 
+00048         break;
+00049 
+00050     case "search":
+00051         $Smarty->assign('searchres', $uiBrowser->getSearchRes($uiBrwoser->id, $_REQUEST['search']));
+00052         $Smarty->assign('showSearchRes', TRUE);
+00053         $Smarty->assign('searchform', $uiBrowser->getSearchForm($uiBrwoser->id, $ui_fmask['search']));
+00054         $Smarty->assign('showSearchForm', TRUE);
+00055 
+00056         break;
+00057 
+00058     case "subjects":
+00059     case "addUser":
+00060     case "addGroup":
+00061         $Smarty->assign('subjects', $uiBrowser->getSubjects());
+00062         switch($_REQUEST['act']) {
+00063             case "addUser":  $Smarty->assign('addSubjectForm', $uiBrowser->getAddSubjectForm($ui_fmask['addUser']));  break;
+00064             case "addGroup": $Smarty->assign('addSubjectForm', $uiBrowser->getAddSubjectForm($ui_fmask['addGroup'])); break;
+00065         }
+00066         $Smarty->assign('showSubjects', TRUE);
+00067     break;
+00068 
+00069     case "passwd":
+00070         $Smarty->assign('changePassForm', $uiBrowser->getChangePasswdForm($_REQUEST['uid']));
+00071         $Smarty->assign('showSubjects', TRUE);
+00072     break;
+00073 
+00074     case "groups":
+00075         $Smarty->assign('groups', $uiBrowser->getGroups($uiBrowser->id));
+00076         $Smarty->assign('addSubj2GroupForm', $uiBrowser->getSubj2GroupForm($uiBrowser->id));
+00077         $Smarty->assign('showSubjects', TRUE);
+00078     break;
+00079 
+00080     case "getFile":
+00081         $Smarty->assign('fData', $uiBrowser->getFile($uiBrowser->id));
+00082         $Smarty->assign('showFile', TRUE);
+00083     break;
+00084 
+00085     case "getMdata":
+00086         $Smarty->assign('fMetaData', $uiBrowser->getMdata($uiBrowser->id));
+00087         $Smarty->assign('showFile', TRUE);
+00088     break;
+00089 
+00090     case "getInfo":
+00091         $Smarty->assign('fInfo', $uiBrowser->getInfo($uiBrowser->id));
+00092         $Smarty->assign('showFile', TRUE);
+00093     break;
+00094 
+00095     case "editMetaData":
+00096         $Smarty->assign('mDataForm', $uiBrowser->getMetaDataForm($uiBrowser->id, $ui_fmask['mData']));
+00097         $Smarty->assign('showMetaDataForm', TRUE);
+00098     break;
+00099 
+00100     case "systemPrefs":
+00101         $Smarty->assign('dynform', $uiBrowser->systemPrefs($ui_fmask['systemPrefs']));
+00102         $Smarty->assign('showSystemPrefs', TRUE);
+00103     break;
+00104 }
+00105 ## end gbHtmlBrowse.php
+00106 
+00107 $Smarty->assign('userinfo', $uiBrowser->getUserInfo());
+00108 $Smarty->assign('logouthref', UI_HANDLER.'?act=logout');
+00109 
+00110 $Smarty->display('main.tpl');
+00111 ?>
+

Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser_8php.html b/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser_8php.html new file mode 100644 index 000000000..2935f3326 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser_8php.html @@ -0,0 +1,413 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: ui_browser.php File Reference + + + + + +

ui_browser.php File Reference

+

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Variables

 break
case permissions
case newfile
case sform
case search
case subjects
case addGroup
case passwd
case groups
case getFile
case getMdata
case getInfo
case editMetaData
case systemPrefs
+


Variable Documentation

+

+ + + + +
+ + + + +
case addGroup
+
+ + + + + +
+   + + +

+ +

+Definition at line 64 of file ui_browser.php.

+

+ + + + +
+ + + + +
break
+
+ + + + + +
+   + + +

+ +

+Definition at line 103 of file ui_browser.php.

+

+ + + + +
+ + + + +
case editMetaData
+
+ + + + + +
+   + + +

+ +

+Definition at line 96 of file ui_browser.php. +

+Referenced by uiBrowser::getMetadataForm().

+

+ + + + +
+ + + + +
case getFile
+
+ + + + + +
+   + + +

+ +

+Definition at line 81 of file ui_browser.php.

+

+ + + + +
+ + + + +
case getInfo
+
+ + + + + +
+   + + +

+ +

+Definition at line 91 of file ui_browser.php.

+

+ + + + +
+ + + + +
case getMdata
+
+ + + + + +
+   + + +

+ +

+Definition at line 86 of file ui_browser.php.

+

+ + + + +
+ + + + +
case groups
+
+ + + + + +
+   + + +

+ +

+Definition at line 75 of file ui_browser.php. +

+Referenced by uiHandler::addSubj2Group(), and uiHandler::removeSubjFromGr().

+

+ + + + +
+ + + + +
case newfile
+
+ + + + + +
+   + + +

+ +

+Definition at line 36 of file ui_browser.php. +

+Referenced by uiBrowser::getNewFileForm().

+

+ + + + +
+ + + + +
case passwd
+
+ + + + + +
+   + + +

+ +

+Definition at line 70 of file ui_browser.php.

+

+ + + + +
+ + + + +
case permissions
+
+ + + + + +
+   + + +

+ +

+Definition at line 28 of file ui_browser.php. +

+Referenced by uiHandler::addPerm(), and uiHandler::removePerm().

+

+ + + + +
+ + + + +
case search
+
+ + + + + +
+   + + +

+ +

+Definition at line 51 of file ui_browser.php. +

+Referenced by uiBrowser::getSearchForm(), and uiBrowser::getSearchRes().

+

+ + + + +
+ + + + +
case sform
+
+ + + + + +
+   + + +

+ +

+Definition at line 45 of file ui_browser.php.

+

+ + + + +
+ + + + +
case subjects
+
+ + + + + +
+   + + +

+ +

+Definition at line 61 of file ui_browser.php. +

+Referenced by uiHandler::addSubj(), uiHandler::addSubj2Group(), uiBrowser::getPermissions(), uiHandler::passwd(), uiHandler::removeSubj(), and uiHandler::removeSubjFromGr().

+

+ + + + +
+ + + + +
case systemPrefs
+
+ + + + + +
+   + + +

+ +

+Definition at line 101 of file ui_browser.php. +

+Referenced by uiHandler::storeSystemPrefs().

+


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser__init_8php-source.html b/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser__init_8php-source.html new file mode 100644 index 000000000..13fbc288a --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser__init_8php-source.html @@ -0,0 +1,54 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: ui_browser_init.php Source File + + + + + +

ui_browser_init.php

Go to the documentation of this file.
00001 <?php
+00002 session_start();
+00003 require_once dirname(__FILE__).'/conf.php';
+00004 require_once dirname(__FILE__).'/ui_fmask.inc.php';
+00005 
+00006 // LS classes/functions
+00007 require_once dirname(__FILE__).'/ui_base.inc.php';
+00008 require_once dirname(__FILE__).'/ui_browser.class.php';
+00009 require_once dirname(__FILE__).'/../../storageServer/var/GreenBox.php';
+00010 
+00011 // well known classes
+00012 require_once dirname(__FILE__).'/html/Smarty/libs/Smarty.class.php';
+00013 
+00014 require_once 'DB.php';
+00015 require_once 'HTML/QuickForm.php';
+00016 require_once 'HTML/QuickForm/Renderer/ArraySmarty.php';
+00017 
+00018 #PEAR::setErrorHandling(PEAR_ERROR_TRIGGER, E_USER_WARNING);
+00019 #PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'errCallBack');
+00020 PEAR::setErrorHandling(PEAR_ERROR_RETURN);
+00021 #PEAR::setErrorHandling(PEAR_ERROR_PRINT);
+00022 
+00023 // some global vars/objects
+00024 $Smarty = new Smarty;
+00025 require_once  dirname(__FILE__).'/SmartyExtensions.inc.php';
+00026 $uiBrowser = new uiBrowser($config);
+00027 $uiBase    = new uiBase();
+00028 
+00029 ## some basic things
+00030 $Smarty->assign('alertMsg', $uiBrowser->alertMsg());
+00031 $Smarty->assign('GLOBALS', $GLOBALS);  ## ??? should i do this ####
+00032 
+00033 ## retransfer incomplete formdata from SESSION to POST-data
+00034 if(is_array($_SESSION['retransferFormData'])){
+00035     foreach($_SESSION['retransferFormData'] as $k=>$v){
+00036         $_POST[$k] = $v;
+00037     }
+00038     unset($_SESSION['retransferFormData']);
+00039 }
+00040 ?>
+

Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser__init_8php.html b/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser__init_8php.html new file mode 100644 index 000000000..c1bcabc3d --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/ui__browser__init_8php.html @@ -0,0 +1,104 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: ui_browser_init.php File Reference + + + + + +

ui_browser_init.php File Reference

+

+Go to the source code of this file. + + + + + + + + +

Variables

 $Smarty = new Smarty
 $uiBrowser = new uiBrowser($config)
 $uiBase = new uiBase()
+


Variable Documentation

+

+ + + + +
+ + + + +
$Smarty = new Smarty
+
+ + + + + +
+   + + +

+ +

+Definition at line 24 of file ui_browser_init.php.

+

+ + + + +
+ + + + +
$uiBase = new uiBase()
+
+ + + + + +
+   + + +

+ +

+Definition at line 27 of file ui_browser_init.php.

+

+ + + + +
+ + + + +
$uiBrowser = new uiBrowser($config)
+
+ + + + + +
+   + + +

+ +

+Definition at line 26 of file ui_browser_init.php. +

+Referenced by S_tra().

+


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/ui__fmask_8inc_8php-source.html b/livesupport/modules/htmlUI/doc/doxygen/html/ui__fmask_8inc_8php-source.html new file mode 100644 index 000000000..93db35e52 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/ui__fmask_8inc_8php-source.html @@ -0,0 +1,302 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: ui_fmask.inc.php Source File + + + + + +

ui_fmask.inc.php

Go to the documentation of this file.
00001 <?php
+00002 $ui_fmask = array(
+00003     /* ===================== list of system preferences which can be adjusted */
+00004     'systemPrefs'   => array(
+00005         array(
+00006             'element'   => 'basics',
+00007             'type'  => 'header',
+00008             'label' => 'Basic Settings',
+00009         ),
+00010         array(
+00011             'element'   => 'maxfilesize',
+00012             'type'  => 'text',
+00013             'label' => 'Maximum File Size for Upload',
+00014             'required'  =>TRUE,
+00015         ),
+00016         array(
+00017             'rule'     => 'numeric',
+00018             'element'  => 'maxfilesize',
+00019             'errormsg' => 'Value for Maximum File Size must be numeric'
+00020         ),
+00021         array(
+00022             'element' => 'stationname',
+00023             'type'    => 'text',
+00024             'label'   => 'Staion Name',
+00025             'required'=>TRUE
+00026         ),
+00027         array(
+00028             'element'   => 'stationurl',
+00029             'type'  => 'text',
+00030             'label' => 'Station URL',
+00031             'required'  =>TRUE
+00032         ),
+00033         array(
+00034             'element'   => 'stationurl2',
+00035             'type'  => 'text',
+00036             'label' => 'Station URL2',
+00037             'required'  =>TRUE
+00038         ),
+00039         array(
+00040             'element' => 'upload',
+00041             'type'  => 'header',
+00042             'label' => 'Upload'
+00043         ),
+00044         array(
+00045             'element'   => 'stationlogo',
+00046             'type'  => 'file',
+00047             'label' => 'Station Logo',
+00048             'required'  =>FALSE
+00049         ),
+00050         array(
+00051             'element'   =>'submit',
+00052             'type'      =>'submit',
+00053             'label'     =>'Submit'
+00054         )
+00055     ),
+00056 
+00057     /* =========================================================== Matadata-Mask */
+00058     'mData' =>  array(
+00059         array(
+00060             'element' => 'title',
+00061             'type'    => 'text',
+00062             'label'   => 'Title',
+00063             'required'=> TRUE,
+00064             'groupit' => TRUE
+00065         ),
+00066         array(
+00067             'element' =>'alternative',
+00068             'type'    =>'text',
+00069             'label'   =>'Alternative Title',
+00070             'required'=>FALSE
+00071         ),
+00072         array(
+00073             'element' =>'description',
+00074             'type'    =>'textarea',
+00075             'label'   =>'Description',
+00076             'required'=>TRUE
+00077         ),
+00078         array(
+00079             'element' =>'genre',
+00080             'type'    =>'select',
+00081             'label'   =>'Genre(s)',
+00082             'required'=>TRUE,
+00083             'multiple'=>TRUE,
+00084             'options' =>array(
+00085                 'rock'      =>'Rock',
+00086                 'blues'     =>'Blues',
+00087                 'jazz'      =>'Jazz',
+00088                 'pop'       =>'Pop',
+00089                 'house'     =>'House',
+00090                 'industrial'=>'Industrial',
+00091                 )
+00092         ),
+00093         array(
+00094             'element' =>'decade',
+00095             'type'    =>'select',
+00096             'label'   =>'Decade',
+00097             'required'=>FALSE,
+00098             'multiple'=>FALSE,
+00099             'options' =>array(
+00100                 '1960'  =>'60\'s',
+00101                 '1970'  =>'70\'s',
+00102                 '1980'  =>'80\'s',
+00103                 '1990'  =>'90\'s'
+00104             )
+00105         ),
+00106         array(
+00107             'element'   =>'licence',
+00108             'type'      =>'radio',
+00109             'label'     =>'Licence exists',
+00110             'required'  =>TRUE,
+00111             'options'   =>array(
+00112                 'yes'    =>'Yes',
+00113                 'no'     =>'No'
+00114             )
+00115         ),
+00116         array(
+00117             'group'     =>'licencegrp',
+00118             'elements'  =>array('licence'),
+00119             'label'     =>'grplkabel'
+00120         ),
+00121         array(
+00122             'element'   =>'full_processed',
+00123             'type'      =>'checkbox',
+00124             'label'     =>'Full processed',
+00125             'required'  =>FALSE
+00126         ),
+00127         array(
+00128             'element'   =>'reset',
+00129             'type'      =>'reset',
+00130             'label'     =>'Reset',
+00131             'groupit'   =>TRUE
+00132         ),
+00133         array(
+00134             'element'   =>'submit',
+00135             'type'      =>'submit',
+00136             'label'     =>'Submit',
+00137             'groupit'   =>TRUE
+00138         ),
+00139         array(
+00140             'group'     => array('reset', 'submit'),
+00141             'name'      => NULL,
+00142             'label'     => NULL,
+00143             'seperator' => '&nbsp;&nbsp;',
+00144             'appendName'=> NULL
+00145         )
+00146     ),
+00147     'addUser' => array(
+00148         array(
+00149             'element'   => 'act',
+00150             'type'      => 'hidden',
+00151             'constant'  => 'addUser'
+00152         ),
+00153         array(
+00154             'element'   => 'login',
+00155             'type'      => 'text',
+00156             'label'     => 'Username',
+00157             'required'  => TRUE
+00158         ),
+00159         array(
+00160             'element'   =>'pass',
+00161             'type'      =>'password',
+00162             'label'     =>'Users Password',
+00163             'required'  =>TRUE
+00164         ),
+00165         array(
+00166             'element'   =>'pass2',
+00167             'type'      =>'password',
+00168             'label'     =>'Repeat Password',
+00169             'required'  =>TRUE
+00170         ),
+00171         array(
+00172             'rule'      =>'compare',
+00173             'element'   =>array('pass','pass2'),
+00174             'errormsg'  =>'Passwords didn´t match'
+00175         ),
+00176         array(
+00177             'element'   =>'submit',
+00178             'type'      =>'submit',
+00179             'label'     =>'Submit'
+00180         )
+00181     ),
+00182     'addGroup' => array(
+00183         array(
+00184             'element'   => 'act',
+00185             'type'      => 'hidden',
+00186             'constant'  => 'addGroup'
+00187         ),
+00188         array(
+00189             'element'   => 'login',
+00190             'type'      => 'text',
+00191             'label'     => 'Group Name',
+00192             'required'  => TRUE
+00193         ),
+00194         array(
+00195             'element'   =>'submit',
+00196             'type'      =>'submit',
+00197             'label'     =>'Submit'
+00198         )
+00199     ),
+00200     'login' => array(
+00201         array(
+00202             'element'   => 'act',
+00203             'type'      => 'hidden',
+00204             'constant'  => 'login'
+00205         ),
+00206         array(
+00207             'element'   => 'login',
+00208             'type'      => 'text',
+00209             'label'     => 'Username',
+00210             'required'  => TRUE
+00211         ),
+00212         array(
+00213             'element'   => 'pass',
+00214             'type'      => 'password',
+00215             'label'     => 'Password',
+00216             'required'  => TRUE
+00217         ),
+00218         array(
+00219             'element'   => 'submit',
+00220             'type'      => 'submit',
+00221             'label'     => 'Submit'
+00222         )
+00223     ),
+00224 
+00225 
+00226         #$form->setConstants(array('id'=>$id));
+00227         #$form->addElement('hidden', 'id');
+00228 
+00229         #$form->addRule('filename', $this->tra('enter a Filename'), 'required', null, 'client');
+00230         #$form->addRule('mediafile', $this->tra('select a Media-file'), 'required', null, 'client');
+00231         #$form->addRule('mdatafile', $this->tra('select a Metadata-file'), 'required', null, 'client');
+00232 
+00233     'upload'    => array(
+00234         array(
+00235             'element'   => 'act',
+00236             'type'      => 'hidden',
+00237             'constant'  => 'upload'
+00238         ),
+00239         array(
+00240             'element'   => 'MAX_FILE_SIZE',
+00241             'type'      => 'hidden',
+00242             'constant'  => UI_INPUT_GBOBJECT_MAXFILESIZE
+00243         ),
+00244         array(
+00245             'element'   => 'filename',
+00246             'type'      => 'text',
+00247             'label'     => 'Filename',
+00248             'required'  => TRUE
+00249         ),
+00250         array(
+00251             'element'   => 'mediafile',
+00252             'type'      => 'file',
+00253             'label'     => 'Mediafile',
+00254             'required'  => TRUE,
+00255             'errormsg'  => 'please select Media file'
+00256         ),
+00257         array(
+00258             'element'   => 'mdatafile',
+00259             'type'      => 'file',
+00260             'label'     => 'Metadata',
+00261             'required'  => TRUE,
+00262             'errormsg'  => 'please select Metadata file'
+00263         ),
+00264         array(
+00265             'element'   => 'submit',
+00266             'type'      => 'submit',
+00267             'label'     => 'Submit'
+00268         )
+00269     ),
+00270     'search'    => array(
+00271     array(
+00272             'element'   => 'act',
+00273             'type'      => 'hidden',
+00274             'constant'  => 'search'
+00275         ),
+00276         array(
+00277             'element'   => 'search',
+00278             'type'      => 'text',
+00279             'label'     => 'Searchstring',
+00280             'required'  => TRUE
+00281         ),
+00282         array(
+00283             'element'   => 'submit',
+00284             'type'      => 'submit',
+00285             'label'     => 'Submit'
+00286         )
+00287     )
+00288 );
+

Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/ui__fmask_8inc_8php.html b/livesupport/modules/htmlUI/doc/doxygen/html/ui__fmask_8inc_8php.html new file mode 100644 index 000000000..8cd052a01 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/ui__fmask_8inc_8php.html @@ -0,0 +1,48 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: ui_fmask.inc.php File Reference + + + + + +

ui_fmask.inc.php File Reference

+

+Go to the source code of this file. + + + + +

Variables

 $ui_fmask
+


Variable Documentation

+

+ + + + +
+ + + + +
$ui_fmask
+
+ + + + + +
+   + + +

+ +

+Definition at line 2 of file ui_fmask.inc.php.

+


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler_8class_8php-source.html b/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler_8class_8php-source.html new file mode 100644 index 000000000..11ef76c8d --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler_8class_8php-source.html @@ -0,0 +1,312 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: ui_handler.class.php Source File + + + + + +

ui_handler.class.php

Go to the documentation of this file.
00001 <?php
+00007 class uiHandler extends uiBase {
+00008     var $redirUrl;
+00009     var $alertMsg;
+00010 
+00011     function uiHandler($config)
+00012     {
+00013         $dbc = DB::connect($config['dsn'], TRUE);
+00014         $dbc->setFetchMode(DB_FETCHMODE_ASSOC);
+00015         $this->gb = &new GreenBox(&$dbc, $config);
+00016         $this->id = (!$_REQUEST['id'] ? $this->gb->storId : $_REQUEST['id']);
+00017         $this->sessid = $_REQUEST[$config['authCookieName']];
+00018         $this->userid = $this->gb->getSessUserId($this->sessid);
+00019         $this->login  = $this->gb->getSessLogin ($this->sessid);
+00020         $this->config = $config;
+00021     }
+00022 
+00023     // --- authentication ---
+00033     function login(&$formdata, &$mask)
+00034     {    $formdata['xxx'] = 'yyy';
+00035         $this->redirUrl = UI_BROWSER;
+00036         if ($this->_validateForm($formdata, $mask)) {
+00037             $sessid = $this->gb->login($formdata['login'], $formdata['pass']);
+00038             if($sessid && !PEAR::isError($sessid)){
+00039                 setcookie($this->config['authCookieName'], $sessid);
+00040 
+00041                 $fid = $this->gb->getObjId($formdata['login'], $this->gb->storId);
+00042                 if(!PEAR::isError($fid)) $this->redirUrl.="?id=$fid";
+00043             }else{
+00044                 $this->alertMsg = 'Login failed.';
+00045             }
+00046         }
+00047 
+00048     }
+00049 
+00056     function logout()
+00057     {
+00058         $this->gb->logout($this->sessid);
+00059         setcookie($this->config['authCookieName'], '');
+00060         $this->redirUrl = UI_BROWSER;
+00061     }
+00062 
+00063     // --- files ---
+00074     function upload(&$formdata, $id, &$mask)
+00075     {
+00076         if ($this->_validateForm($formdata, $mask)) {
+00077             $tmpgunid = md5(
+00078                 microtime().$_SERVER['SERVER_ADDR'].rand()."org.mdlf.livesupport"
+00079             );
+00080             $ntmp = $this->gb->bufferDir.'/'.$tmpgunid;
+00081             #        $ntmp = tempnam(""{$gb->bufferDir}", 'gbTmp_');
+00082             $mdtmp = "";
+00083             move_uploaded_file($formdata['mediafile']['tmp_name'], $ntmp);
+00084             chmod($ntmp, 0664);
+00085             if($formdata['mdatafile']['tmp_name']){
+00086                 $mdtmp = "$ntmp.xml";
+00087                 if(move_uploaded_file($formdata['mdatafile']['tmp_name'], $mdtmp)){
+00088                     chmod($mdtmp, 0664);
+00089                 }
+00090             }
+00091             $r = $this->gb->putFile($id, $formdata['filename'], $ntmp, $mdtmp, $this->sessid);
+00092             if(PEAR::isError($r)) $this->alertMsg = $r->getMessage();
+00093             else{
+00094             #            $gb->updateMetadataDB($gb->_pathFromId($r), $mdata, $sessid);
+00095                 @unlink($ntmp);
+00096                 @unlink($mdtmp);
+00097             }
+00098             $this->redirUrl = UI_BROWSER."?id=".$id;
+00099          } else {
+00100             $this->redirUrl = UI_BROWSER."?act=newfile&id=".$id;
+00101          }
+00102     }
+00103 
+00112     function newFolder($newname, $id)
+00113     {
+00114         $r = $this->gb->createFolder($id, $newname, $this->sessid);
+00115         if(PEAR::isError($r)) $this->alertMsg = $r->getMessage();
+00116         $this->redirUrl = UI_BROWSER.'?id='.$id;
+00117     }
+00118 
+00127     function rename($newname, $id)
+00128     {
+00129         $parid = $this->gb->getparent($this->id);
+00130         $r = $this->gb->renameFile($id, $newname, $this->sessid);
+00131         if(PEAR::isError($r)) $this->alertMsg = $r->getMessage();
+00132         $this->redirUrl = UI_BROWSER."?id=$parid";
+00133     }
+00134 
+00144     function move($newPath, $id)
+00145     {
+00146         $newPath = urlencode($newPath);
+00147         $did = $this->gb->getObjIdFromRelPath($id, $newPath);
+00148         $parid = $this->gb->getparent($id);
+00149         $r = $this->gb->moveFile($id, $did, $this->sessid);
+00150         if(PEAR::isError($r)){
+00151             $this->alertMsg = $r->getMessage();
+00152             $this->redirUrl  = UI_BROWSER."?id=$parid";
+00153         }
+00154         else $this->redirUrl = UI_BROWSER."?id=$did";
+00155     }
+00156 
+00166     function copy($newPath, $id)
+00167     {
+00168         $newPath = urldecode($newPath);
+00169         $did = $this->gb->getObjIdFromRelPath($id, $newPath);
+00170         $parid = $this->gb->getparent($id);
+00171         $r = $this->gb->copyFile($id, $did, $this->sessid);
+00172         if(PEAR::isError($r)){
+00173             $this->alertMsg = $r->getMessage();
+00174             $this->redirUrl  = UI_BROWSER."?id=$parid";
+00175         }
+00176         else $this->redirUrl = UI_BROWSER."?id=$did";
+00177     }
+00178 
+00187     function delete($id, $delOverride=FALSE)
+00188     {
+00189         $parid = $this->gb->getparent($id);
+00190 
+00191         ## add emtyness-test here ###
+00192         if (!($delOverride==$id) && (count($this->gb->getObjType($id)=='Folder'?
+00193                       $this->gb->listFolder($id, $this->sessid):NULL))) {
+00194             $this->alertMsg = $this->tra("Folder is not empty. You can override this protection by clicking DEL again");
+00195             $this->redirUrl = UI_BROWSER."?id=$parid&delOverride=$id";
+00196             return;
+00197         }
+00198         #############################
+00199 
+00200         $r = $this->gb->deleteFile($id, $this->sessid);
+00201         if(PEAR::isError($r)) $this->alertMsg = $r->getMessage();
+00202         $this->redirUrl = UI_BROWSER."?id=$parid";
+00203     }
+00204 
+00205 
+00215     function getFile($id)
+00216     {
+00217         $r = $this->gb->access($id, $this->sessid);
+00218         if(PEAR::isError($r)) $this->alertMsg = $r->getMessage();
+00219         else echo $r;
+00220     }
+00221 
+00229     function getMdata($id)
+00230     {
+00231         header("Content-type: text/xml");
+00232         $r = $this->gb->getMdata($id, $this->sessid);
+00233         print_r($r);
+00234     }
+00235 
+00244     function getInfo($id)
+00245     {
+00246         header("Content-type: text/plain");
+00247         $ia = $this->gb->analyzeFile($id, $this->sessid);
+00248         echo"fileformat: {$ia['fileformat']}\n";
+00249         echo"channels: {$ia['audio']['channels']}\n";
+00250         echo"sample_rate: {$ia['audio']['sample_rate']}\n";
+00251         echo"bits_per_sample: {$ia['audio']['bits_per_sample']}\n";
+00252         echo"channelmode: {$ia['audio']['channelmode']}\n";
+00253         echo"title: {$ia['id3v1']['title']}\n";
+00254         echo"artist: {$ia['id3v1']['artist']}\n";
+00255         echo"comment: {$ia['id3v1']['comment']}\n";
+00256     }
+00257 
+00258    // --- subjs ----
+00266     function addSubj(&$formdata, &$mask)
+00267     {
+00268         $this->redirUrl = UI_BROWSER.'?act='.$_REQUEST['act'];
+00269 
+00270         ## first validate the form data
+00271         if ($this->_validateForm($formdata, $mask)) {
+00272             if($this->gb->checkPerm($this->userid, 'subjects')){
+00273                 $res = $this->gb->addSubj($formdata['login'], ($formdata['pass']=='' ? NULL:$formdata['pass'] ));
+00274                 $this->alertMsg = $this->tra('Subject "'.$formdata['login'].'" added.');
+00275             } else {
+00276                 $this->alertMsg = $this->tra('Access denied.');
+00277                 return;
+00278             }
+00279         }
+00280         if(PEAR::isError($res)) $this->alertMsg = $res->getMessage();
+00281     }
+00282 
+00290     function removeSubj($login)
+00291     {
+00292         $this->redirUrl = UI_BROWSER.'?act=subjects';
+00293 
+00294         if($this->gb->checkPerm($this->userid, 'subjects')){
+00295             $res = $this->gb->removeSubj($login);
+00296         }else{
+00297             $this->alertMsg='Access denied.';
+00298             return;
+00299         }
+00300         if(PEAR::isError($res)) $this->alertMsg = $res->getMessage();
+00301     }
+00302 
+00313     function passwd($uid, $oldpass, $pass, $pass2)
+00314     {
+00315         $this->redirUrl = UI_BROWSER.'?act=subjects';
+00316         $ulogin = $this->gb->getSubjName($uid);
+00317 
+00318         if($this->userid != $uid &&
+00319             ! $this->gb->checkPerm($this->userid, 'subjects')){
+00320             $this->alertMsg='Access denied..';
+00321             return;
+00322         }
+00323         if(FALSE === $this->gb->authenticate($ulogin, $oldpass)){
+00324             $this->alertMsg='Wrong old pasword.';
+00325             return;
+00326         }
+00327         if($pass !== $pass2){
+00328             $this->alertMsg = "Passwords do not match. ".
+00329                 "($pass/$pass2)";
+00330             $this->redirUrl = UI_BROWSER.'?act=subjects';
+00331             return;
+00332         }
+00333         $this->gb->passwd($ulogin, $oldpass, $pass);
+00334     }
+00335 
+00336     // --- perms ---
+00347     function addPerm($subj, $permAction, $id, $allowDeny)
+00348     {
+00349         if($this->gb->checkPerm($this->userid, 'editPerms', $id)){
+00350             $this->gb->addPerm($subj, $permAction,
+00351                 $id, $allowDeny);
+00352         }else{
+00353             $this->alertMsg='Access denied.';
+00354         }
+00355         $this->redirUrl = UI_BROWSER.'?id='.$id.'&act=permissions';
+00356     }
+00357 
+00365     function removePerm($permid, $oid)
+00366     {
+00367         if($this->gb->checkPerm($this->userid, 'editPerms', $oid))
+00368             $this->gb->removePerm($permid);
+00369         else $this->alertMsg='Access denied.';
+00370         $this->redirUrl = UI_BROWSER.'?act=permissions&id='.$id;
+00371     }
+00372 
+00373 
+00384     function addSubj2Group($login, $gname, $reid)
+00385     {
+00386         if($this->gb->checkPerm($this->userid, 'subjects')){
+00387             $res = $this->gb->addSubj2Gr($login, $gname);
+00388         }else{
+00389             $this->alertMsg='Access denied.';
+00390             return;
+00391         }
+00392         if(PEAR::isError($res)) $this->alertMsg = $res->getMessage();
+00393 
+00394         $this->redirUrl = UI_BROWSER.'?act=groups&id='.$reid;
+00395     }
+00396 
+00404     function removeSubjFromGr($login, $gname, $reid)
+00405     {
+00406         if($this->gb->checkPerm($this->userid, 'subjects')){
+00407             $res = $this->gb->removeSubjFromGr($login, $gname);
+00408         }else{
+00409             $this->alertMsg='Access denied.';
+00410             return;
+00411         }
+00412         if(PEAR::isError($res)) $this->alertMsg = $res->getMessage();
+00413 
+00414         $this->redirUrl = UI_BROWSER.'?act=groups&id='.$reid;
+00415     }
+00416 
+00417 
+00418     function storeSystemPrefs(&$formdata, &$mask)
+00419     {
+00420         ## first validate the form data
+00421         if ($this->_validateForm($formdata, $mask)) {
+00422             $this->alertMsg = $this->tra('Settings saved');
+00423             $this->redirUrl = UI_BROWSER;
+00424             return;
+00425         }
+00426         $this->redirUrl = UI_BROWSER.'?act=systemPrefs';
+00427     }
+00428 
+00429     function _validateForm(&$formdata, &$mask)
+00430     {
+00431         $form = new HTML_QuickForm('validation', UI_STANDARD_FORM_METHOD, UI_HANDLER);
+00432         $this->_parseArr2Form($form, $mask, 'server');
+00433         if (!$form->validate()) {
+00434             $_SESSION['retransferFormData'] = $formdata;
+00435             return FALSE;
+00436         }
+00437         ## test for uploadet files ####
+00438         foreach($mask as $k) {
+00439             if ($k['type']=='file') {
+00440                 if ($formdata[$k['element']]['error']) {
+00441                     $_SESSION['retransferFormData'] = $formdata;
+00442                     return FALSE;
+00443                 }
+00444             }
+00445         }
+00446         reset($mask);
+00447         return TRUE;
+00448     }
+00449 
+00450 }
+00451 
+00452 ?>
+

Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler_8class_8php.html b/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler_8class_8php.html new file mode 100644 index 000000000..35e811cf9 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler_8class_8php.html @@ -0,0 +1,19 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: ui_handler.class.php File Reference + + + + + +

ui_handler.class.php File Reference

+

+Go to the source code of this file. + +
+


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler_8php-source.html b/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler_8php-source.html new file mode 100644 index 000000000..375714e9b --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler_8php-source.html @@ -0,0 +1,95 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: ui_handler.php Source File + + + + + +

ui_handler.php

Go to the documentation of this file.
00001 <?php
+00002 require dirname(__FILE__).'/../ui_handler_init.php';
+00003 
+00004 switch($_REQUEST['act']){
+00005 
+00006     case "login";
+00007         $uiHandler->login($_REQUEST, $ui_fmask["login"]);
+00008     break;
+00009 
+00010     case "logout";
+00011         $uiHandler->logout();
+00012     break;
+00013 
+00014     case "upload":
+00015         $uiHandler->upload(array_merge($_REQUEST, $_FILES), $uiHandler->id, $ui_fmask["upload"]);
+00016     break;
+00017 
+00018     case "newFolder":
+00019         $uiHandler->newFolder($_REQUEST["newname"], $uiHandler->id);
+00020     break;
+00021 
+00022     case "rename":
+00023         $uiHandler->rename($_REQUEST["newname"], $uiHandler->id);
+00024     break;
+00025 
+00026     case "move":
+00027         $uiHandler->move($_REQUEST["newPath"], $uiHandler->id);
+00028     break;
+00029 
+00030     case "copy":
+00031         $uiHandler->copy($_REQUEST["newPath"], $uiHandler->id);
+00032     break;
+00033 
+00034     case "delete":
+00035         $uiHandler->delete($uiHandler->id, $_REQUEST["delOverride"]);
+00036     break;
+00037 
+00038     case "addUser":
+00039         $uiHandler->addSubj($_REQUEST, $ui_fmask["addUser"]);
+00040     break;
+00041 
+00042     case "addGroup":
+00043         $uiHandler->addSubj($_REQUEST, $ui_fmask["addGroup"]);
+00044     break;
+00045 
+00046     case "removeSubj":
+00047         $uiHandler->removeSubj($_REQUEST["login"]);
+00048     break;
+00049 
+00050     case "changePasswd":
+00051         $uiHandler->passwd($_REQUEST["uid"], $_REQUEST["oldpass"], $_REQUEST["pass"], $_REQUEST["pass2"]);
+00052     break;
+00053 
+00054     case "addPerm":
+00055         $uiHandler->addPerm($_REQUEST["subj"], $_REQUEST["permAction"], $uiHandler->id, $_REQUEST["allowDeny"]);
+00056     break;
+00057 
+00058     case "removePerm":
+00059         $uiHandler->removePerm($_REQUEST["permid"], $_REQUEST["oid"]);
+00060     break;
+00061 
+00062     case "addSubj2Group":
+00063         $uiHandler->addSubj2Group($_REQUEST["login"], $_REQUEST["gname"], $_REQUEST["reid"]);
+00064     break;
+00065 
+00066     case "removeSubjFromGr":
+00067         $uiHandler->removeSubjFromGr($_REQUEST["login"], $_REQUEST["gname"], $_REQUEST["reid"]);
+00068     break;
+00069 
+00070     case "systemPrefs":
+00071         $uiHandler->storeSystemPrefs($_REQUEST, $ui_fmask["systemPrefs"]);
+00072     break;
+00073 
+00074     default:
+00075         $_SESSION["alertMsg"] = $uiHandler->tra("Unknown method: ").$_REQUEST["act"];
+00076         header("Location: ".UI_BROWSER);
+00077         die();
+00078 }
+00079 if ($uiHandler->alertMsg) $_SESSION['alertMsg'] = $uiHandler->alertMsg;
+00080 header('Location: '.$uiHandler->redirUrl);
+00081 ?>
+

Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler_8php.html b/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler_8php.html new file mode 100644 index 000000000..d577c5dfa --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler_8php.html @@ -0,0 +1,621 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: ui_handler.php File Reference + + + + + +

ui_handler.php File Reference

+

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Variables

 break
case logout
case upload
case $_FILES
case $uiHandler id
case $uiHandler $ui_fmask ["upload"]
case newFolder
case rename
case move
case copy
case delete
case $_REQUEST ["delOverride"]
case addUser
case addGroup
case removeSubj
case changePasswd
case addPerm
case removePerm
case addSubj2Group
case removeSubjFromGr
case systemPrefs
default __pad0__
+


Variable Documentation

+

+ + + + +
+ + + + +
case $_FILES
+
+ + + + + +
+   + + +

+ +

+Definition at line 15 of file ui_handler.php.

+

+ + + + +
+ + + + +
case $_REQUEST["reid"]
+
+ + + + + +
+   + + +

+ +

+Definition at line 67 of file ui_handler.php. +

+Referenced by uiBrowser::getStructure(), uiBrowser::uiBrowser(), and uiHandler::uiHandler().

+

+ + + + +
+ + + + +
case $ui_fmask["systemPrefs"]
+
+ + + + + +
+   + + +

+ +

+Definition at line 71 of file ui_handler.php.

+

+ + + + +
+ + + + +
default __pad0__
+
+ + + + + +
+   + + +

+ +

+Definition at line 75 of file ui_handler.php.

+

+ + + + +
+ + + + +
case addGroup
+
+ + + + + +
+   + + +

+ +

+Definition at line 43 of file ui_handler.php.

+

+ + + + +
+ + + + +
case addPerm
+
+ + + + + +
+   + + +

+ +

+Definition at line 55 of file ui_handler.php.

+

+ + + + +
+ + + + +
case addSubj2Group
+
+ + + + + +
+   + + +

+ +

+Definition at line 63 of file ui_handler.php. +

+Referenced by uiBrowser::getSubj2GroupForm().

+

+ + + + +
+ + + + +
case addUser
+
+ + + + + +
+   + + +

+ +

+Definition at line 39 of file ui_handler.php.

+

+ + + + +
+ + + + +
break
+
+ + + + + +
+   + + +

+ +

+Definition at line 72 of file ui_handler.php.

+

+ + + + +
+ + + + +
case changePasswd
+
+ + + + + +
+   + + +

+ +

+Definition at line 51 of file ui_handler.php. +

+Referenced by uiBrowser::getChangePasswdForm().

+

+ + + + +
+ + + + +
case copy
+
+ + + + + +
+   + + +

+ +

+Definition at line 31 of file ui_handler.php.

+

+ + + + +
+ + + + +
case delete
+
+ + + + + +
+   + + +

+ +

+Definition at line 35 of file ui_handler.php.

+

+ + + + +
+ + + + +
case uiHandler id
+
+ + + + + +
+   + + +

+ +

+Definition at line 55 of file ui_handler.php.

+

+ + + + +
+ + + + +
case logout
+
+ + + + + +
+   + + +

+ +

+Definition at line 10 of file ui_handler.php.

+

+ + + + +
+ + + + +
case move
+
+ + + + + +
+   + + +

+ +

+Definition at line 27 of file ui_handler.php.

+

+ + + + +
+ + + + +
case newFolder
+
+ + + + + +
+   + + +

+ +

+Definition at line 19 of file ui_handler.php.

+

+ + + + +
+ + + + +
case removePerm
+
+ + + + + +
+   + + +

+ +

+Definition at line 59 of file ui_handler.php.

+

+ + + + +
+ + + + +
case removeSubj
+
+ + + + + +
+   + + +

+ +

+Definition at line 47 of file ui_handler.php.

+

+ + + + +
+ + + + +
case removeSubjFromGr
+
+ + + + + +
+   + + +

+ +

+Definition at line 67 of file ui_handler.php.

+

+ + + + +
+ + + + +
case rename
+
+ + + + + +
+   + + +

+ +

+Definition at line 23 of file ui_handler.php.

+

+ + + + +
+ + + + +
case systemPrefs
+
+ + + + + +
+   + + +

+ +

+Definition at line 71 of file ui_handler.php.

+

+ + + + +
+ + + + +
case upload
+
+ + + + + +
+   + + +

+ +

+Definition at line 15 of file ui_handler.php.

+


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler__init_8php-source.html b/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler__init_8php-source.html new file mode 100644 index 000000000..9f4de0b30 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler__init_8php-source.html @@ -0,0 +1,35 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: ui_handler_init.php Source File + + + + + +

ui_handler_init.php

Go to the documentation of this file.
00001 <?php
+00002 session_start();
+00003 require_once dirname(__FILE__).'/conf.php';
+00004 require_once dirname(__FILE__).'/ui_fmask.inc.php';
+00005 
+00006 // LS classes/functions
+00007 require_once dirname(__FILE__).'/../../storageServer/var/GreenBox.php';
+00008 require_once dirname(__FILE__).'/ui_base.inc.php';
+00009 require_once dirname(__FILE__).'/ui_handler.class.php';
+00010 
+00011 // well known classes
+00012 require_once 'DB.php';
+00013 require_once 'HTML/QuickForm.php';
+00014 
+00015 #PEAR::setErrorHandling(PEAR_ERROR_TRIGGER, E_USER_WARNING);
+00016 #PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'errCallBack');
+00017 PEAR::setErrorHandling(PEAR_ERROR_RETURN);
+00018 #PEAR::setErrorHandling(PEAR_ERROR_PRINT);
+00019 
+00020 $uiHandler = new uiHandler($config);
+00021 ?>
+

Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler__init_8php.html b/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler__init_8php.html new file mode 100644 index 000000000..ae3d17e97 --- /dev/null +++ b/livesupport/modules/htmlUI/doc/doxygen/html/ui__handler__init_8php.html @@ -0,0 +1,48 @@ + + +LiveSupport&nbsp;-&nbsp;htmlUI&nbsp;module: ui_handler_init.php File Reference + + + + + +

ui_handler_init.php File Reference

+

+Go to the source code of this file. + + + + +

Variables

 $uiHandler = new uiHandler($config)
+


Variable Documentation

+

+ + + + +
+ + + + +
$uiHandler = new uiHandler($config)
+
+ + + + + +
+   + + +

+ +

+Definition at line 20 of file ui_handler_init.php.

+


Generated on Wed Jan 12 16:22:49 2005 for LiveSupport - htmlUI module by  + +doxygen 1.4.0
+ + diff --git a/livesupport/modules/htmlUI/etc/doxygen.config b/livesupport/modules/htmlUI/etc/doxygen.config new file mode 100644 index 000000000..c0ea361ff --- /dev/null +++ b/livesupport/modules/htmlUI/etc/doxygen.config @@ -0,0 +1,1214 @@ +# Doxyfile 1.4.0 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = LiveSupport - htmlUI module + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/doxygen + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. + +SHOW_DIRECTORIES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the progam writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = var \ + var/html + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm + +FILE_PATTERNS = *.php + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = var/html/SmartyStatic_example.php \ + var/html/SmartyDynamic_example.php + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = NO + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that a graph may be further truncated if the graph's +# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH +# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), +# the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/livesupport/modules/htmlUI/index.php b/livesupport/modules/htmlUI/index.php new file mode 100644 index 000000000..92007e2f7 --- /dev/null +++ b/livesupport/modules/htmlUI/index.php @@ -0,0 +1,4 @@ + diff --git a/livesupport/modules/htmlUI/var/Smarty-2.6.6.tar.gz b/livesupport/modules/htmlUI/var/Smarty-2.6.6.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..e59e81e7f5e09b9a4ceb8518b559903a612d6877 GIT binary patch literal 137589 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'UI_BROWSER', UI_BROWSER); +$Smarty->assign('UI_HANDLER', UI_HANDLER); + +// --- Smarty Extensions --- +/** + * str_repeat + * + * Repeate given string. + * + * @param str string, string to repeate + * @param count numeric, how often to repeate (converted to type integer) + * @return string, repeated string + */ +function S_str_repeat($param) +{ + extract($param); + return str_repeat($str, intval($count)); + +} +$Smarty->register_function('str_repeat', 'S_str_repeat'); + + /** + * urlencode + * + * Encode given string to use in URL. + * + * @param str string, string to encode + * @return string, encoded string + */ +function S_urlencode($param) +{ + extract($param); + return urlencode($str); +} +$Smarty->register_function('urlencode', 'S_urlencode'); + +/** + * htmlspecialchars + * + * convert special chars in given string to html-entitys. + * + * @param str string, string to convert + * @return string, converted string + */ +function S_htmlspecialchars($param) +{ + extract($param); + return htmlspecialchars($str); +} +$Smarty->register_function('htmlspecialchars', 'S_htmlspecialchars'); + +/** + * system + * + * Execute some PHP-code. + * + * @param code string, code to execute + */ +function S_system($param) +{ + extract($param); + eval($code); +} +$Smarty->register_function('system', 'S_system'); + +/** + * tra + * + * Translate given string. + * + * @param void array, array of strings to be outputted translated + */ +function S_tra($param) +{ + global $uiBrowser; + + echo $uiBrowser->tra($param[0], $param[1], $param[2], $param[3], $param[4], $param[5], $param[6], $param[7], $param[8], $param[9]); +} +$Smarty->register_function('tra', 'S_tra'); +?> \ No newline at end of file diff --git a/livesupport/modules/htmlUI/var/conf.php b/livesupport/modules/htmlUI/var/conf.php new file mode 100644 index 000000000..44dfab8bc --- /dev/null +++ b/livesupport/modules/htmlUI/var/conf.php @@ -0,0 +1,125 @@ + + *

dsn
datasource setting + *
tblNamePrefix
prefix for table names in the database + *
authCookieName
secret token cookie name + *
storageDir
main directory for storing binary media files + *
bufferDir
directory for temporary files + *
transDir
directory for incomplete transferred files + *
accessDir
directory for symlinks to accessed files + *
storageUrlPath
path-URL-part of storageServer base dir + *
storageXMLRPC
XMLRPC server script address relative to storageUrlPath + *
storageUrlHost, storageUrlPort
host and port of storageServer + *
archiveUrlPath
path-URL-part of archiveServer base dir + *
archiveXMLRPC
XMLRPC server script address relative to archiveUrlPath + *
archiveUrlHost, archiveUrlPort
host and port of archiveServer + * + */ +$config = array( + /* ================================================== basic configuration */ + 'dsn' => array( + 'username' => 'test', + 'password' => 'test', + 'hostspec' => 'localhost', + 'phptype' => 'pgsql', + 'database' => 'LiveSupport-test', + ), + 'tblNamePrefix' => 'ls_', + 'authCookieName'=> 'lssid', + #'storageDir' => dirname(getcwd()).'/stor', + #'bufferDir' => dirname(getcwd()).'/stor/buffer', + #'transDir' => dirname(getcwd()).'/trans', + #'accessDir' => dirname(getcwd()).'/access', + 'storageDir' => dirname(__FILE__).'/../../storageServer/var/stor', + 'bufferDir' => dirname(__FILE__).'/../../storageServer/var/stor/buffer', + 'transDir' => dirname(__FILE__).'/../../storageServer/var/trans', + 'accessDir' => dirname(__FILE__).'/../../storageServer/var/access', + + /* ==================================================== URL configuration */ + 'storageUrlPath' => '/livesupportStorageServer', + 'storageXMLRPC' => 'xmlrpc/xrLocStor.php', + 'storageUrlHost' => 'localhost', + 'storageUrlPort' => 80, + + /* ================================================ archive configuration */ + 'archiveUrlPath' => '/livesupportArchiveServer', + 'archiveXMLRPC' => 'xmlrpc/xrArchive.php', + 'archiveUrlHost' => 'localhost', + 'archiveUrlPort' => 80, + 'archiveAccountLogin' => 'root', + 'archiveAccountPass' => 'q', + + 'objtypes' => array( + 'RootNode' => array('Folder'), + 'Storage' => array('Folder', 'File', 'Replica'), + 'Folder' => array('Folder', 'File', 'Replica'), + 'File' => array(), + 'audioclip' => array(), + 'playlist' => array(), + 'Replica' => array(), + ), + 'allowedActions'=> array( + 'RootNode' => array('classes', 'subjects'), + 'Folder' => array('editPrivs', 'write', 'read'), + 'File' => array('editPrivs', 'write', 'read'), + 'audioclip' => array('editPrivs', 'write', 'read'), + 'playlist' => array('editPrivs', 'write', 'read'), + 'Replica' => array('editPrivs', 'write', 'read'), + '_class' => array('editPrivs', 'write', 'read'), + ), + 'allActions' => array( + 'editPrivs', 'write', 'read', 'classes', 'subjects' + ), + + /* ============================================== auxiliary configuration */ + 'RootNode' => 'RootNode', + 'tmpRootPass' => 'q', +); + + + + +define('UI_HANDLER', 'ui_handler.php'); +define('UI_BROWSER', 'ui_browser.php'); +define('UI_FORM_STANDARD_METHOD', 'POST'); +define('UI_INPUT_STANDARD_SIZE', 20); +define('UI_INPUT_STANDARD_MAXLENGTH', 50); +define('UI_TEXTAREA_STANDART_ROWS', 5); +define('UI_TEXTAREA_STANDART_COLS', 17); +define('UI_QFORM_REQUIRED', 'templates/form_parts/required.tpl'); +define('UI_QFORM_REQUIREDNOTE', 'templates/form_parts/requirednote.tpl'); +define('UI_QFORM_ERROR', 'templates/form_parts/error.tpl'); +define('UI_SEARCH_MAX_ROWS', 8); +define('UI_SEARCH_MIN_ROWS', 2); +?> \ No newline at end of file diff --git a/livesupport/modules/htmlUI/var/elements.txt b/livesupport/modules/htmlUI/var/elements.txt new file mode 100644 index 000000000..9c2af78ec --- /dev/null +++ b/livesupport/modules/htmlUI/var/elements.txt @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/livesupport/modules/htmlUI/var/html/Smarty/BUGS b/livesupport/modules/htmlUI/var/html/Smarty/BUGS new file mode 100644 index 000000000..9f1a80f31 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/BUGS @@ -0,0 +1,7 @@ +Smarty is supported only in PHP 4.0.6 or later. + +Smarty versions previous to 2.0 require the PEAR libraries. Be sure to include +the path to the PEAR libraries in your php include_path. Config_file.class.php +uses the PEAR library for its error handling routines. PEAR comes with the PHP +distribution. Unix users check /usr/local/lib/php, windows users check +C:/php/pear. diff --git a/livesupport/modules/htmlUI/var/html/Smarty/COPYING.lib b/livesupport/modules/htmlUI/var/html/Smarty/COPYING.lib new file mode 100644 index 000000000..3b204400c --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/COPYING.lib @@ -0,0 +1,458 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/livesupport/modules/htmlUI/var/html/Smarty/ChangeLog b/livesupport/modules/htmlUI/var/html/Smarty/ChangeLog new file mode 100644 index 000000000..bfa06cefe --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/ChangeLog @@ -0,0 +1,6908 @@ +2004-10-02 Messju Mohr + + * NEWS: + fixed nocache-handling with nested includes. there was a logical error + in the replacement of internal nocache-tags to dynamic content that + lead to false results with deeply nested includes or with + nocache-blocks inside nocache-blocks. + + many thanks to Lars Jankowfsky for providing big help on reproducing + and tracking down this bug! + +2004-10-01 Messju Mohr + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + - better header for compiled includes (more in line with compiled + templates) + + - reuse cache_serials if a file is compiled more than once in one + process (force_compile) + + - don't print nocache-delimiters wenn already inside + process_cached_inserts() + +2004-09-29 Messju Mohr + + * libs/Smarty.class.php: + switched from @count() to !empty() . this was pointed out a few times + by a few people with buggy error-handlers + + * libs/Smarty_Compiler.class.php: + added some property declarations + +2004-09-28 Messju Mohr + + * libs/Smarty.class.php: + bumped up version number to reflect incompatibility in tempfiles of + 'core' vs. 'internals' + +2004-09-24 Messju Mohr + + * libs/plugins/function.html_select_date.php: + fixed $start_year when no value for the year in $time is given. + +2004-09-21 Messju Mohr + + * libs/plugins/function.html_table.php: + fixed handling of "inner"-attribute + + * libs/Smarty_Compiler.class.php: + fixed handling of object derefence inside backticks + +2004-09-20 Monte Ohrt + + * libs/debug.tpl: + add tags + +2004-09-18 boots + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/plugins/function.config_load.php + libs/plugins/function.debug.php + libs/plugins/function.fetch.php + libs/plugins/function.html_image.php: + Fixed \\r\\n line endings mistakenly introduced in last commit. d'oh. + +2004-09-16 boots + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.assemble_plugin_filepath.php + libs/core/core.assign_smarty_interface.php + libs/core/core.create_dir_structure.php + libs/core/core.display_debug_console.php + libs/core/core.get_include_path.php + libs/core/core.get_microtime.php + libs/core/core.get_php_resource.php + libs/core/core.is_secure.php + libs/core/core.is_trusted.php + libs/core/core.load_plugins.php + libs/core/core.load_resource_plugin.php + libs/core/core.process_cached_inserts.php + libs/core/core.process_compiled_include.php + libs/core/core.read_cache_file.php + libs/core/core.rm_auto.php + libs/core/core.rmdir.php + libs/core/core.run_insert_handler.php + libs/core/core.smarty_include_php.php + libs/core/core.write_cache_file.php + libs/core/core.write_compiled_include.php + libs/core/core.write_compiled_resource.php + libs/core/core.write_file.php + libs/plugins/function.config_load.php + libs/plugins/function.debug.php + libs/plugins/function.fetch.php + libs/plugins/function.html_image.php: + Moved /libs/core to /libs/internals and created new constant, + SMARTY_CORE_DIR which defaults to SMARTY_DIR/internals. This should help + CVS and rsynch users butupgrades will require changes and this may affect + 3rd party plugins that use the /core dir. + +2004-09-15 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + moved $this->_num_const_regexp out of $this->_var_regexp and added it + to the places that affect $this->_var_regexp + + this should fix some problems parsing plugin-names endings with digits + +2004-09-14 Messju Mohr + + * libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + update files to 2.6.6-dev + +2004-09-13 Messju Mohr + + * NEWS: + fixed typo + +2004-09-13 Monte Ohrt + + * (Smarty_2_6_5) + NEWS: + update NEWS file with parsing correction note + +2004-09-11 Messju Mohr + + * libs/plugins/function.debug.php: + removed notice from {debug} + thanks to Peter Billen for pointing this one out! + +2004-09-11 Monte Ohrt + + * libs/Smarty_Compiler.class.php: + fix more object calling syntax issues + +2004-09-10 Messju Mohr + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + added $smarty->security_settings['ALLOW_CONSTANTS'] + including test-cases for them + +2004-09-09 Monte Ohrt + + * libs/Smarty_Compiler.class.php: + break down regex to digestable chunks, fix multiple param problem with + method calls, + add object method testing to unit_test cases + + * libs/Smarty_Compiler.class.php: + update code comment with more examples + + * libs/Smarty_Compiler.class.php: + allow objects in arbitrary param positions + + * libs/Smarty_Compiler.class.php: + fix object parameter regex, allow one level of object indirection + + * libs/Smarty_Compiler.class.php: + fix compile problem with numeric constants and math operator matching + +2004-09-07 Monte Ohrt + + * libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + update files to 2.6.5-dev + + * (Smarty_2_6_4) + NEWS: + update NEWS file with 2.6.4 header + +2004-08-31 Monte Ohrt + + * libs/Smarty_Compiler.class.php: + fix preg_quote + + * libs/Smarty_Compiler.class.php: + fix math in object params, clean up some regex on the way, change + preg_ delimiters to ~ to avoid character clashes with ! and % + +2004-08-30 Monte Ohrt + + * NEWS + libs/Smarty_Compiler.class.php: + add $smarty.ldelim and $smarty.rdelim to smarty special var + +2004-08-29 Messju Mohr + + * NEWS + libs/core/core.write_file.php: + tempnam() seems to be borken on many installation. + + now we try tempnam first and if that fails we generate our own + temp-filename with uniqid() + +2004-08-23 Monte Ohrt + + * libs/plugins/modifier.capitalize.php: + dont use constant, use static var instead + + * libs/plugins/modifier.capitalize.php: + implement optional param to capitalize for digit behavior + + * libs/plugins/modifier.capitalize.php: + another commit to capitalize, taking special chars into account + +2004-08-23 Messju Mohr + + * libs/Smarty_Compiler.class.php: + cleaned up attribute-handling in Smarty_Compiler::_compile_foreach_start() + +2004-08-23 Monte Ohrt + + * NEWS + libs/plugins/function.html_select_date.php + libs/plugins/modifier.capitalize.php: + fix capitalize modifier to not rely on buggy ucwords() func + +2004-08-20 Monte Ohrt + + * libs/plugins/function.html_select_date.php: + update version + + * NEWS + libs/plugins/function.html_select_date.php: + make time param work with negative timestamps, force year range to include + given date unless explicitly set + +2004-08-19 Monte Ohrt + + * NEWS + libs/plugins/function.fetch.php: + fix bug with fetch, passing user/pass in url did not work + +2004-08-13 Messju Mohr + + * libs/Smarty_Compiler.class.php: + fixed handling of {foreachelse} and {sectionelse} that got borked with + the latest commit (v 1.330) + +2004-08-12 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + fixed occasional wrong error messages on mismatched tags when + {else}, {elseif}, {foreachelse} or {sectionelse} is involved + + thanks to Ooypunk for pointing me on this + +2004-08-12 Nuno Lopes + + * docs/.cvsignore + docs/Makefile.in + docs/configure.in: + enable russian PDF builds + +2004-07-30 Nuno Lopes + + * docs/configure.in: + typo + + * docs/Makefile.in + docs/README + docs/configure.in: + add make test_xml + this is usefull to detect XML problems + +2004-07-29 Nuno Lopes + + * docs/configure.in: + avoid warnings in head + + * docs/.cvsignore + docs/Makefile.in + docs/README + docs/configure.in: + build pdf files + just type make pdf + +2004-07-27 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + fixed handling of methods arguments. + + thanks to Manfred Wischin for finding this one and providing the + conceptual fix. + +2004-07-23 Messju Mohr + + * libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_radios.php: + there was little flaw in smarty_function_html_radios() and + smarty_function_html_checkboxes(): + + the newly introduced assign-attribute was still added to the + tag-output as an extra-attribute. + + fixed. + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.load_plugins.php + libs/core/core.load_resource_plugin.php + libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_image.php + libs/plugins/function.html_options.php + libs/plugins/function.html_radios.php + libs/plugins/function.html_select_date.php + libs/plugins/function.html_select_time.php + libs/plugins/modifier.date_format.php: + backed out renaming of _get_plugin_filepath() to get_plugin_filepath() + + we'll stick to _get_plugin_filepath() and look for a more viable + solution to be exposed to plugin-writers. + +2004-07-20 Messju Mohr + + * libs/Smarty_Compiler.class.php + libs/core/core.is_trusted.php + libs/plugins/compiler.assign.php: + Some fixes on PhpDocumentor comments. Thanks go to Ruben Vermeersch. + +2004-07-16 andreas halter + + * docs/de/bookinfo.xml + docs/de/getting-started.xml + docs/de/language-defs.ent + docs/de/language-snippets.ent + docs/de/preface.xml: + - updated for 2.6.3 + - updates for new build system + - added missing files + - corrections from users + - revcheck comments for all files + - big up to didou and nuno, brilliant work + - make test: ok + - make: ok + +2004-07-16 Nuno Lopes + + * docs/de/getting-started.xml: + fix the revision tracking tag + the revision number might not be right. just check it, please + +2004-07-16 andreas halter + + * docs/de/getting-started.xml: + - updated version (incl revcheck comment) for revcheck testing + +2004-07-14 Monte Ohrt + + * libs/Smarty.class.php: + replace " with ' where literal strings are quoted (ever so slight speedup) + +2004-07-12 Messju Mohr + + * libs/plugins/modifier.date_format.php: + changed call from $smarty->_get_plugin_filepath() to + $smarty->get_plugin_filepath() + + * libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_image.php + libs/plugins/function.html_options.php + libs/plugins/function.html_radios.php + libs/plugins/function.html_select_date.php + libs/plugins/function.html_select_time.php: + renamed calls to $smarty->_get_plugin_filepath() to + $smarty->get_plugin_filepath() + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.load_plugins.php + libs/core/core.load_resource_plugin.php: + renamed Smarty::_get_plugin_filepath() to Smarty::get_plugin_filepath() + + * NEWS + libs/Smarty.class.php + libs/core/core.write_compiled_include.php + libs/core/core.write_compiled_resource.php + libs/core/core.write_file.php: + removed touch() call. changing the timestamp of the compiled-template + to the source template's may be irritating for certain + source-code-caches. now a newly compiled template gets the current + time as timestamp. + +2004-07-02 gerald croes + + * docs/fr/getting-started.xml + docs/fr/preface.xml: + Fixed missing tags to be able to make doc again + + * docs/fr/preface.xml: + added the "is a good thing [TM]" as in en docs + + * docs/fr/getting-started.xml: + added ctags, updated screen => programm listing. + added the technical note founded on the en doc + +2004-07-02 Monte Ohrt + + * NEWS + libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_radios.php + libs/plugins/function.mailto.php: + add assign attribute to html_checkboxes and html_radios + +2004-07-01 Messju Mohr + + * NEWS + libs/Smarty.class.php: + removed use of get_include_filepath() inside + get_auto_filename(). thanks go to c960657 + + * NEWS + libs/Smarty_Compiler.class.php: + enhanced error-reporting for {foreach} + + * NEWS + libs/Smarty_Compiler.class.php: + fixed handling of digits inside tagnames. this problem slipped into + the regexps by adding support for numeric contants next to string + constants as variables. + +2004-06-27 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + fixed escaping of backslashes in Smarty_Compiler::_quote_replace() + +2004-06-23 Monte Ohrt + + * libs/plugins/modifier.date_format.php: + display date_format %e, %T and %D as expected for windows + +2004-06-17 Messju Mohr + + * libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + changed version-number to 2.6.4-dev + +2004-06-16 Monte Ohrt + + * (Smarty_2_6_3) + NEWS: + update NEWS file with version number + +2004-06-09 Monte Ohrt + + * NEWS + libs/plugins/modifier.escape.php: + added escapement of ' + + * docs/fr/translation.xml: + Add other translators. + +2004-06-08 Messju Mohr + + * libs/Smarty.class.php: + made the correct value of "use_sub_dirs" available to the compiler. + (not worth a NEWS-entry, i think) + +2004-06-01 Messju Mohr + + * libs/plugins/function.fetch.php: + fix: proper initialistaion of $content. + thanks to Dmitry Koteroff for pointing this out. + +2004-05-29 Mehdi Achour + + * docs/fr/translation.xml: + oups :) + + * docs/fr/translation.xml: + added translation file + +2004-05-28 Nuno Lopes + + * docs/Makefile.in: + clean also file-entities.php + +2004-05-28 Messju Mohr + + * NEWS + libs/plugins/function.mailto.php: + added obfuscation of protocol-string in {mailto} when using + hex-encoding (thanks to bharat) + +2004-05-26 Messju Mohr + + * NEWS + libs/Smarty.class.php: + enhanced auto-generated filenames for templates_c and cache + + incremented Smarty::_version because the tempfiles' structure changed + a little + +2004-05-23 Mehdi Achour + + * docs/fr/bookinfo.xml + docs/fr/getting-started.xml + docs/fr/preface.xml: + WS and added revcheck + +2004-05-21 Messju Mohr + + * libs/Smarty_Compiler.class.php: + fixed typo in error-messages + + * docs/de/language-snippets.ent + docs/fr/language-snippets.ent: + added empty language-snippets.ent to fix "make web" + +2004-05-12 Monte Ohrt + + * NEWS + libs/plugins/modifier.escape.php: + add 'nonstd' escape modifier + +2004-05-07 Monte Ohrt + + * NEWS + libs/plugins/block.textformat.php: + update textformat to not output wrap chars after last para + +2004-05-06 Messju Mohr + + * NEWS + libs/core/core.write_file.php: + use tempnam() instead of unqid() to create better temporary files in + smarty_core_write_file(). + + (thanks to xces for finding this race-condition and his work on + fixing it) + +2004-05-04 Messju Mohr + + * libs/Smarty.class.php: + added check if for file_exists() to Smarty::_read_file() + +2004-04-30 Monte Ohrt + + * NEWS + libs/plugins/modifier.escape.php: + add 'mail' attribute to escape modifier + +2004-04-20 Mehdi Achour + + * docs/manual.xml.in: + added the language-snippets.ent file and started using entities for notes + under en/programmers/api-functions + +2004-04-18 Mehdi Achour + + * docs/de/getting-started.xml + docs/fr/getting-started.xml: + new global entity for zend and php-accelerator + + * docs/fr/bookinfo.xml + docs/fr/getting-started.xml + docs/fr/preface.xml: + added myself as translator and added vim comments and xml tags + +2004-04-16 Messju Mohr + + * NEWS: + added entry for numeric constants + + * libs/Smarty_Compiler.class.php: + removed unused 2nd param in call to _parse_var() + + * libs/Smarty_Compiler.class.php: + added explanation for $this->_num_const_regexp + + * NEWS + libs/plugins/modifier.escape.php: + added escape type "decentity" to smarty_modifier_escape() + + * libs/Smarty_Compiler.class.php: + enabled numerical constants be parsed as statements. + (like {10} or {10|@range:12} ) + + * libs/Smarty_Compiler.class.php: + removed unused $smarty_compiler->_dvar_num_var_regexp + + * libs/Smarty.class.php: + reverted Stuff + + * libs/debug.tpl + libs/core/core.assemble_plugin_filepath.php + libs/core/core.read_cache_file.php + libs/core/core.write_file.php + libs/plugins/function.eval.php + libs/plugins/function.popup.php + libs/plugins/modifier.escape.php + libs/plugins/shared.make_timestamp.php: + reverted stuff + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/debug.tpl + libs/core/core.assemble_plugin_filepath.php + libs/core/core.read_cache_file.php + libs/core/core.write_file.php + libs/plugins/function.eval.php + libs/plugins/function.popup.php + libs/plugins/modifier.escape.php + libs/plugins/shared.make_timestamp.php: + Smarty_Compiler.class.php + +2004-04-15 Messju Mohr + + * NEWS + libs/core/core.write_compiled_include.php: + made smarty_core_write_compiled_include() php5-aware + + if someone knows a better way than patching the source with the + tokenizer, please stand up! + +2004-04-14 Nuno Lopes + + * docs/Makefile.in: + remove file-entities.ent also + + * docs/.cvsignore + docs/Makefile.in + docs/README: + allow make revcheck + +2004-04-13 Nuno Lopes + + * docs/configure.in: + do not need inipath + +2004-04-13 Mehdi Achour + + * docs/TODO: + done + + * docs/configure.in + docs/manual.xml.in: + now the files entites are generated dynamically + +2004-04-12 Messju Mohr + + * NEWS + libs/Config_File.class.php + libs/Smarty.class.php: + removed unused functionality to load a subset of lines from a file in + Smarty::_read_file() + + additionally removed a warning that is emitted since php-4.3.5 when + fread() is called on an empty file (with filesize()==0). thanks to + Andreas Streichardt who pointed this out. + + * NEWS + libs/core/core.is_secure.php: + smarty_core_is_secure() only checks the file for readability now, not + the directory where is in. + + * libs/Smarty.class.php: + removed unused security_setting 'ALLOW_CONSTANTS' + +2004-04-07 Messju Mohr + + * libs/plugins/function.assign_debug_info.php + libs/plugins/function.cycle.php + libs/plugins/function.mailto.php: + removed trailing spaces + + * libs/Smarty.class.php: + removed unused $smarty->_error_msg + +2004-04-04 Nuno Lopes + + * docs/configure.in: + fixing my crap + put build_date back on-line + +2004-04-03 Nuno Lopes + + * docs/Makefile.in + docs/configure.in + docs/manual.xml.in: + trying to fix ru problems + +2004-03-30 Monte Ohrt + + * libs/core/core.display_debug_console.php: + fix problem with debug_tpl path and security + + * NEWS + libs/core/core.display_debug_console.php: + fix problem displaying debug console when $default_resource_type is not + "file:" + +2004-03-29 Mehdi Achour + + * docs/TODO: + and finally, add a TODO here + + * docs/de/bookinfo.xml + docs/de/manual.sgml + docs/fr/bookinfo.xml + docs/fr/manual.xml: + translate bookinfo.xml and put back the translators + +2004-03-28 Mehdi Achour + + * docs/manual.xml.in: + add global.ent and define some general entities + + * docs/de/bookinfo.xml + docs/de/getting-started.xml + docs/de/language-defs.ent + docs/de/preface.xml: + add new de files + + * docs/de/appendixes.sgml + docs/de/designers.sgml + docs/de/getting-started.sgml + docs/de/html-common.dsl + docs/de/preface.sgml + docs/de/programmers.sgml: + drop old de files + + * docs/fr/bookinfo.xml + docs/fr/getting-started.xml + docs/fr/manual.xml + docs/fr/preface.xml: + add ommited files + + * docs/fr/language-defs.ent: + split the french dir + + * docs/fr/appendixes.sgml + docs/fr/designers.sgml + docs/fr/getting-started.sgml + docs/fr/html-common.dsl + docs/fr/manual.sgml + docs/fr/preface.sgml + docs/fr/programmers.sgml: + drop old french files + + * docs/manual.xml.in: + let's put the new build system + +2004-03-26 Mehdi Achour + + * docs/de/common.dsl + docs/de/html.dsl + docs/fr/common.dsl + docs/fr/html.dsl + docs/fr/php.dsl: + not needed anymore + +2004-03-24 Nuno Lopes + + * docs/Makefile.in: + updated stylesheets + highlight PHP automatically + + * docs/Makefile.in + docs/html.dsl: + remove unneeded file + +2004-03-23 Nuno Lopes + + * docs/version.ent.in: + remove this also + + * docs/getting-started.sgml: + remove this one too + + * docs/appendixes.sgml + docs/common.dsl + docs/designers.sgml + docs/html-common.dsl + docs/manual.sgml + docs/php.dsl + docs/preface.sgml + docs/programmers.sgml: + removing uneeded files + + * docs/.cvsignore: + commiting missing files for docbook + + * docs/.cvsignore + docs/Makefile.in + docs/configure.in + docs/manual.xml.in: + bundling docbook 4 + now make and make web works + +2004-03-23 Messju Mohr + + * NEWS + libs/plugins/function.config_load.php: + unrolled call to the is_compiled()-check to be able to supply the + correct resource_base_path for config_load. this avoids errors when + config-files are accessed where security is enabled. + + thanks to shuther for pointing out this bug. + +2004-03-20 Nuno Lopes + + * docs/manual.xml.in: + fix build date + +2004-03-18 Messju Mohr + + * libs/core/core.is_secure.php: + removed merging of $smarty->template_dir into $smarty->secure_dir + + the resource_base_path is considerd secure instead. this change should + have absolutely no impact on smarty's security's behaviour + +2004-03-18 Nuno Lopes + + * docs/configure.in: + correcting non-existent var + + * docs/.cvsignore + docs/Makefile.in + docs/configure.in + docs/manual.xml.in + docs/version.ent.in: + generate build date + + * docs/.cvsignore + docs/Makefile.in + docs/README + docs/configure.in + docs/manual.xml.in: + new build/test system + +2004-03-18 Messju Mohr + + * libs/Smarty.class.php: + moved setting of a default resource_base_path from + Smarty::_parse_resource_name() to Smarty::_fetch_resource_info() + + this shouldn't affect anything, since all calls to + _parse_resource_name() that are not done from within + _fetch_resource_info() all pass their own resource_base_path + +2004-03-17 Messju Mohr + + * NEWS + libs/Smarty.class.php: + removed '.' from the list of default resource_base_paths in + _parse_resource_name() + + this should only affect _parse_resource_name() for templates, not for + php-resources and not for config_files. the latter pass two their own + resource_base_path. + +2004-03-16 Mehdi Achour + + * docs/appendixes.sgml + docs/getting-started.sgml + docs/preface.sgml: + adding editor comments + + * docs/appendixes.sgml + docs/getting-started.sgml: + cleaning words spacing, killing tabulations, using roles for + programlisting.. + +2004-03-15 Messju Mohr + + * libs/Smarty.class.php: + simplified Smarty::clear_all_cache(); + +2004-03-12 boots + + * docs/programmers.sgml: + Updated is_cached prototype to indicate proper return type. (thanks to + Geoffrey Hoffman) + +2004-03-11 Messju Mohr + + * libs/core/core.assemble_plugin_filepath.php: + fixed little bug that prevented plugins filepaths that are found in + php's include_path (and not in one of the plugins_dirs) from being + cached in the internal plugins-filepath-cache + +2004-03-01 Monte Ohrt + + * docs/designers.sgml: + update include_php docs:wq + :q + + * docs/appendixes.sgml: + update componentized template example to something useful + +2004-02-24 Messju Mohr + + * NEWS + libs/Smarty.class.php: + _parse_resource_name() returned true on non-existant absolute + paths. This caused a warning on _fetch_resource_info() when used in + conjunction with template_exists(). It should be fixed now without + negative effects. + +2004-02-24 Monte Ohrt + + * docs/designers.sgml: + one more typo + + * docs/designers.sgml: + fix typo + +2004-02-24 Messju Mohr + + * NEWS + libs/core/core.is_secure.php: + smarty_resource_*_secure got &$smarty passed errornously as 3rd + parameter and not as 2nd. this is fixed. + +2004-02-23 Messju Mohr + + * NEWS: + fix handling of integer values like width and delay im + smarty_function_popup() + + * libs/plugins/function.popup.php: + fixed handling of integer-attributes + + * libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + updated version to 2.6.3-dev + +2004-02-22 Messju Mohr + + * libs/plugins/function.html_select_date.php: + removed notice on html_select_date with the month_empty-attribute + + * libs/plugins/function.mailto.php: + removed 2 notices of undefined vars (thanks Cit) + +2004-02-17 Monte Ohrt + + * NEWS: + add header + + * (Smarty_2_6_2) + libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + change some info in headers, remove fluff + +2004-02-13 Messju Mohr + + * NEWS + libs/plugins/function.html_select_date.php: + correctly handle partially empty dates (like "2004--" or "-12-"). + + * docs/programmers.sgml: + learned something about and sgml and applied this to the + use.sub.dirs-section :) + + * docs/designers.sgml: + changed attribute-name "checked" to "selected" in the docs for + html_radios and html_checkboxes. "checked" is deprecated for ages + AFAIK and selected is recommended for consistency with {html_options} + + * docs/programmers.sgml: + added note about use_sub_dirs and Smarty-2.6.2 . + fixed markup for section about clear_compiled_tpl() . + +2004-02-12 Messju Mohr + + * NEWS + libs/Config_File.class.php: + YES and NO should not be booleanized inside triple-quotes in a + config-file. this behaviour changed by accident in 2.6.1 and is now + reverted to pre-2.6.1 behaviour + +2004-02-10 Messju Mohr + + * NEWS + libs/Config_File.class.php: + fixed slurping of a the next line following a triple-quoted value in a + config-file + +2004-02-07 Messju Mohr + + * libs/Config_File.class.php: + avoid @-operator for handling empty lines in Config_File.class.php + + * libs/Smarty_Compiler.class.php: + removed two notices from Smarty_Compiler::_parse_is_expr() + (thanks shuther!) + + * NEWS + libs/Smarty.class.php: + changed default for use_sub_dirs to false + + * libs/plugins/function.mailto.php: + removed notice of undefined variable. (thanks shuther!) + +2004-01-29 Messju Mohr + + * libs/Smarty_Compiler.class.php: + added file and line-number-information to error-messages regarding + assigned objects an an error messages regarding modifiers with + security. + +2004-01-27 Messju Mohr + + * libs/Smarty_Compiler.class.php: + removed use of temporary var $_params in compiled code of block-plugins + + * NEWS + libs/plugins/function.popup.php: + fixed quoting of values in smarty_function_popup() + +2004-01-25 Messju Mohr + + * docs/programmers.sgml: + documented parameters of Smarty::clear_compiled_tpl() + + * libs/Smarty_Compiler.class.php: + Smarty_Compiler::_syntax_error() uses Smarty::_trigger_fatal_error() now + instead of the trigger_error()-function + + * libs/Smarty.class.php: + Smarty::_trigger_fatal_error() uses Smarty::trigger_error() now, + instead of the native trigger_error()-function + + * libs/Smarty_Compiler.class.php: + unrecognized custom-functions trigger an error at compile now, not at + display-time. + +2004-01-23 Monte Ohrt + + * docs/getting-started.sgml: + reword a paragraph + +2004-01-22 Messju Mohr + + * libs/plugins/function.config_load.php: + removed emission of unnecessary notices for unavailable config-files + in config_load() + + * NEWS + libs/Config_File.class.php: + fixed handling of hidden sections in Config_File + +2004-01-21 Messju Mohr + + * NEWS + libs/plugins/function.config_load.php: + added handling of resources for {config_load} + +2004-01-19 Messju Mohr + + * NEWS + libs/plugins/function.html_table.php: + fixed bug when using arrays with tr_attr and td_attr in {html_table} + +2004-01-16 Monte Ohrt + + * NEWS: + add unit testing + + * NEWS + libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + update version numbers, add initial unit test directory + + * (Smarty_2_6_1) + libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + update version numbers for 2.6.1 release + +2004-01-16 Messju Mohr + + * (Smarty_2_6_1) + NEWS + docs/programmers.sgml + libs/Smarty.class.php: + renamed $smarty->tpl_rror_reporting to $smarty->error_reporting + "tpl_" is a bit redundant here (it's a TemPLate-engine overall :) + +2004-01-15 Messju Mohr + + * libs/plugins/function.html_image.php: + forgot to remove duplicate is_secure()-check + + * NEWS + libs/plugins/function.html_image.php: + fix: $smarty->security is now correctly handled + + minor optimizations: + core/core.is_secure.php is only included when needed + $dpi_default is only determined when needed + +2004-01-14 Messju Mohr + + * docs/appendixes.sgml + docs/programmers.sgml: + removed suggestions to use extract() from the manual + + * docs/designers.sgml: + fixed typo + +2004-01-12 Messju Mohr + + * docs/designers.sgml: + mention SCRIPT_NAME below {$smarty} reserved variable because it got + lost in the docs for $smarty->global_assign + + * docs/designers.sgml: + added docs for {$smarty.version} special variable + + * docs/programmers.sgml: + removed docs for $global_assign + + * docs/programmers.sgml: + added docs for tpl_error_reporting + + * docs/designers.sgml: + added docs for year_empty-, month_empty- and day_emtpy-attributes of + html_select_date. maybe an example is needed to better explain empty + values in YYY-MM-DD. + +2004-01-10 Messju Mohr + + * libs/Smarty_Compiler.class.php: + fixed handling of {php}-tags + +2004-01-10 Monte Ohrt + + * docs/designers.sgml: + fix html_checkboxes examples + +2004-01-08 Messju Mohr + + * NEWS + libs/core/core.assemble_plugin_filepath.php: + added caching of requested paths to smarty_core_assemble_plugin_filepath() + + * NEWS: + fix handling of comments inside {php}- and {literal}-blocks + + * libs/Smarty_Compiler.class.php: + fixed handling of comments inside {php} and {literal} + +2004-01-06 Messju Mohr + + * NEWS + libs/Config_File.class.php: + fixed bug handling triple-quotes in config-files + + * libs/Config_File.class.php: + fixed bugs with triple-quotes in config-files + thanks BRDude for finding them testing! + +2004-01-02 Messju Mohr + + * libs/Smarty.class.php: + removed unnecessary param in call to _fetch_resource_info() + +2003-12-30 Messju Mohr + + * libs/Smarty.class.php: + oops! removed tabs. + +2003-12-27 Messju Mohr + + * NEWS + libs/Smarty.class.php: + made $SCRIPT_NAME available again + changes default for request_use_auto_global to prefer autoglobals + + * libs/Smarty.class.php: + removed tabs and trailing spaces + + * NEWS + libs/Smarty_Compiler.class.php: + readded default_modifiers. who removed that? + +2003-12-23 Monte Ohrt + + * NEWS: + add portuguese docs + +2003-12-22 Monte Ohrt + + * docs/designers.sgml: + fix counter example + +2003-12-19 Monte Ohrt + + * libs/Smarty.class.php: + add debug console persistance feature + +2003-12-19 Messju Mohr + + * libs/plugins/block.textformat.php + libs/plugins/function.html_table.php + libs/plugins/function.popup.php: + removed extract(). enhanced parameter parsing. + + * libs/plugins/function.counter.php + libs/plugins/function.fetch.php + libs/plugins/function.popup_init.php + libs/plugins/modifier.capitalize.php + libs/plugins/modifier.cat.php + libs/plugins/modifier.date_format.php + libs/plugins/modifier.debug_print_var.php + libs/plugins/modifier.escape.php + libs/plugins/modifier.indent.php + libs/plugins/modifier.lower.php + libs/plugins/modifier.nl2br.php + libs/plugins/modifier.strip.php + libs/plugins/modifier.upper.php + libs/plugins/modifier.wordwrap.php + libs/plugins/outputfilter.trimwhitespace.php + libs/plugins/shared.escape_special_chars.php: + removed tabs. fixed indentiation. + + * libs/plugins/modifier.truncate.php: + removed tabs + + * libs/plugins/function.counter.php + libs/plugins/function.cycle.php: + removed extract() from parameter-parsing + +2003-12-17 Messju Mohr + + * libs/plugins/function.html_select_date.php: + fix plugin-name in error message + + * libs/plugins/function.html_select_time.php: + remove extract-call from {html_select_time} + + * NEWS + libs/plugins/function.html_select_date.php: + allow single-digit days and months without smarty_make_timestamp() + this makes dates like "1968-11-6" work correctly since no strtotime() + is involved + + add warning when unknown parameter is passed + +2003-12-16 Messju Mohr + + * NEWS + libs/Smarty.class.php: + fix headers sent erroneously with cache_modified_check and fetch() + +2003-12-12 Monte Ohrt + + * libs/plugins/function.config_load.php: + move set_path() call below the conditional bracket + + * NEWS + libs/plugins/function.config_load.php: + fix config_load filepath bug + +2003-12-12 boots + + * docs/designers.sgml: + Updated language.function.if with additional annotation and to fix error + that broke docs build process + +2003-12-11 Messju Mohr + + * libs/Smarty_Compiler.class.php: + little optimization for "is odd" and "is even" + +2003-12-11 Monte Ohrt + + * NEWS + libs/Smarty_Compiler.class.php: + fix 'is even by' and 'is odd by' logic + +2003-12-11 Messju Mohr + + * docs/designers.sgml: + update example-output of {mailto} + + * libs/plugins/function.mailto.php: + removed extract-call -> cleaner parameter-handling + + * libs/plugins/function.mailto.php: + fixed indentiation + + * TODO: + removed two done topics + +2003-12-11 boots + + * docs/designers.sgml: + Updated language.function.if to describe qualifiers (thanks andre) + +2003-12-10 Messju Mohr + + * NEWS + libs/plugins/function.html_select_date.php: + added day_empty, month_empty, year_empty and all_empty attributes + to pass an undefined date use {html_select_date time="--" ...} + + * libs/plugins/function.html_select_date.php: + removed extract()-call + + * libs/plugins/function.html_select_date.php: + fixed indetiation + +2003-12-10 boots + + * NEWS + docs/designers.sgml: + Added table to language.function.if to describe qualifiers + +2003-12-09 Messju Mohr + + * libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_options.php: + strict comparason didn't work in all cases. use type-casting now. + + * NEWS + libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_options.php: + fix bug when comparing array-keys to "selected" in html_options and + html_checkboxes + + in_array() uses "strict" comparason now. + + * libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_options.php + libs/plugins/function.html_radios.php: + removed tabs, fixed indentiation + +2003-12-08 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + add better checks for correctly nested tags when compiling + +2003-12-04 Messju Mohr + + * libs/Smarty.class.php + libs/plugins/function.html_image.php: + fix: check $smarty->request_use_auto_globals at the last occurences of + HTTP_*_VARS + +2003-12-03 Messju Mohr + + * NEWS + libs/Smarty.class.php: + remove $global_assign property from Smarty and $global_assign-handling + from the constructor. the only visible change is, that $SCRIPT_NAME is + not available in the tempates anymore. $smarty.server.SCRIPT_NAME has + to be used from now. + +2003-12-03 boots + + * docs/designers.sgml: + Fixed example for count_characters + +2003-12-01 boots + + * docs/designers.sgml: + Added section "Escaping Smarty Parsing" under Basic Syntax. + +2003-12-01 Messju Mohr + + * libs/core/core.create_dir_structure.php: + thought again about my latest commit and backed it out. + + * libs/core/core.create_dir_structure.php: + fix root-dir-handling on windows filepath + +2003-11-29 boots + + * libs/plugins/function.config_load.php: + really make the fixes the last patch was supposed to do + + * libs/plugins/function.config_load.php: + removed tabs and killed trailing white-space + + * libs/plugins/function.config_load.php: + changed $smarty->_syntax_error to $smarty->trigger_error + +2003-11-27 Messju Mohr + + * NEWS + libs/plugins/modifier.debug_print_var.php: + remove warning in debug_print_var on php-resources + + * README: + fix version number + +2003-11-26 Messju Mohr + + * libs/Smarty_Compiler.class.php: + raise max_level for $smarty.config... to 3 to allow arrays of config-vars + +2003-11-25 Messju Mohr + + * libs/Smarty.class.php: + changed version-tag to indicate incompatibility to older compiled + templates + +2003-11-24 Messju Mohr + + * NEWS + libs/plugins/compiler.assign.php + libs/plugins/function.assign.php: + move function.assign.php to compiler.assign.php + + * libs/core/core.get_include_path.php: + silence occasional warnings of open_basedir- and + safe_mode-restrictions in core.get_include_path.php + +2003-11-23 Messju Mohr + + * libs/core/core.write_compiled_resource.php + libs/core/core.write_file.php: + avoid touch()-ing of recently unlinked files by touch()-ing the + tempfile before rename instead of touch()-ing the resulting file after + rename. + + * NEWS + libs/Smarty.class.php: + add property $tpl_error_reporting + +2003-11-22 Messju Mohr + + * libs/plugins/function.assign.php: + remove use of extract() in smarty_function_assign() + + * NEWS + libs/Smarty.class.php: + remove property $undefined. "null" is used literally instead + +2003-11-21 Messju Mohr + + * libs/Smarty_Compiler.class.php: + remove two E_NOTICES + +2003-11-20 Messju Mohr + + * libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + change version to 2.6.1-dev + +2003-11-19 Monte Ohrt + + * (Smarty_2_6_0) + NEWS: + update NEWS file + + * (Smarty_2_6_0) + docs/designers.sgml + libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + change version numbers to 2.6.0 + +2003-11-19 Messju Mohr + + * docs/designers.sgml + docs/de/designers.sgml + docs/fr/designers.sgml: + fix examples of escape-modifier (in docs, docs/de and docs/fr !) + +2003-11-18 Messju Mohr + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + move Smarty::quote_replace() to Smarty_Compiler::_quote_replace() + + * libs/Smarty.class.php: + removed extract-calls from _include()- and _eval()-wrappers + variables passed with {include_php} have to accessed as members of $params + now + +2003-11-17 Messju Mohr + + * docs/designers.sgml: + fixed typo + +2003-11-13 Messju Mohr + + * libs/Config_File.class.php: + fix occasional notice + +2003-11-13 andreas halter + + * docs/de/designers.sgml: + - added cat modifier, thanks messju :-) + +2003-11-13 Monte Ohrt + + * (Smarty_2_6_0-RC3) + NEWS + libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + commit RC3 tags + +2003-11-13 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + fix handling of $var.key inside [] + + * libs/Smarty.class.php: + fix unnecessary loading of core.load_resource_plugin.php + + * (Smarty_2_6_0-RC3) + docs/fr/designers.sgml: + fixed example of html_table + +2003-11-11 Messju Mohr + + * NEWS + libs/core/core.process_cached_inserts.php: + fix handling of assign inside {insert}-tags + +2003-11-06 Messju Mohr + + * libs/core/core.read_cache_file.php: + added $exp_time-parameter + + * docs/programmers.sgml: + added $exp_time to cache_handler_func-example + + * libs/Smarty.class.php + libs/core/core.write_cache_file.php: + added $exp_time-parameter of clear_cache() and clear_all_cache() to + cache_handler_func. + +2003-11-05 Messju Mohr + + * NEWS + libs/Config_File.class.php: + fix handling if [...] inside triple-quotes in config-files + +2003-11-04 Messju Mohr + + * libs/Smarty.class.php: + fixed little bug in _parse_resource_name() (jlgunter, messju) + +2003-11-03 andreas halter + + * docs/designers.sgml + docs/de/designers.sgml + docs/fr/designers.sgml: + - changed Smarty.php.class occurences to Smarty.class.php + +2003-10-29 boots + + * docs/appendixes.sgml + docs/designers.sgml + docs/manual.sgml + docs/programmers.sgml + docs/de/appendixes.sgml + docs/de/designers.sgml + docs/de/programmers.sgml + docs/fr/appendixes.sgml + docs/fr/designers.sgml + docs/fr/getting-started.sgml + docs/fr/manual.sgml + docs/fr/preface.sgml + docs/fr/programmers.sgml: + Fixes to documentation syntax so that all content can be processed used + xsltproc docbook-xsl tools. In particular, fixes unescaped entities, + broken tags, unquoted attributes. + +2003-10-27 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + fix handling of simple-math-operators inside modifiers + +2003-10-25 Messju Mohr + + * libs/Smarty_Compiler.class.php: + removed unused property _output_type + removed unused param $tag_attrs of _parse_var_props() + cleaned up alignment of class-properties + +2003-10-23 Messju Mohr + + * libs/Smarty_Compiler.class.php: + removed notice in php-tag handling in Smarty_Compiler::_compile_file() + + * libs/Smarty_Compiler.class.php: + removed two occasional E_NOTICES from + Smarty_Compiler::_compile_include_php_tag() + + * NEWS + libs/core/core.create_dir_structure.php: + fix handling of trailing-slashes in open_basedir in + smarty_core_create_dir_structure() + +2003-10-20 Messju Mohr + + * libs/Smarty_Compiler.class.php: + elements inside `` are bracketed now inside the compiled-tpl. this + fixes some issues with simple-math inside backticks. + +2003-10-16 Monte Ohrt + + * docs/designers.sgml: + update overlib docs, no working examples + +2003-10-12 Messju Mohr + + * libs/Smarty.class.php + libs/core/core.is_secure.php: + move check for template_dir in secure_dir-array into core.is_secure.php + + this makes template_exists() work correctly with security=true even if + template_dir is not inside the secure_dir-array + +2003-10-11 Messju Mohr + + * libs/plugins/shared.make_timestamp.php: + tightened check for YYYYMMDDHHMMSS-format. thanks konstantin for + pointing this out. + + removed a few tabs. + + * libs/Smarty_Compiler.class.php: + fix precedence of simple-math-operators before modifiers. + thanks dominik! + + * libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.assemble_plugin_filepath.php + libs/core/core.assign_smarty_interface.php + libs/core/core.create_dir_structure.php + libs/core/core.display_debug_console.php + libs/core/core.get_include_path.php + libs/core/core.get_microtime.php + libs/core/core.get_php_resource.php + libs/core/core.is_secure.php + libs/core/core.is_trusted.php + libs/core/core.load_plugins.php + libs/core/core.load_resource_plugin.php + libs/core/core.process_cached_inserts.php + libs/core/core.process_compiled_include.php + libs/core/core.read_cache_file.php + libs/core/core.rm_auto.php + libs/core/core.rmdir.php + libs/core/core.run_insert_handler.php + libs/core/core.smarty_include_php.php + libs/core/core.write_compiled_include.php + libs/core/core.write_compiled_resource.php + libs/core/core.write_file.php: + removed tabs from the main and the core/*.php files + +2003-10-08 Monte Ohrt + + * (Smarty_2_6_0-RC2) + NEWS + libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + update version numbers to RC2 + +2003-09-18 Messju Mohr + + * docs/designers.sgml + docs/de/designers.sgml: + fixed description of cycle's advance-attribute + +2003-09-16 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + apply modifiers only once to section-loop and foreach-from attributes + +2003-09-15 Messju Mohr + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.write_cache_paths_file.php: + backed out _smarty_cached_paths-file-handling + + * libs/Smarty.class.php + libs/core/core.rm_auto.php: + fixed clear_compiled_tpl with explicit $tpl_file given + fixed return value of smarty_core_rm_auto() + Smarty::_unlink() + + * libs/Smarty.class.php: + little fix in _get_auto_filename() + +2003-09-14 Messju Mohr + + * libs/Smarty.class.php + libs/core/core.assemble_auto_filename.php: + removed auto-filenames from path-cache. merged assemble_auto_filename + back into Smarty::_get_auto_filename() + +2003-09-12 Messju Mohr + + * libs/Smarty_Compiler.class.php: + fixed quoting of modifier parameters + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.get_php_resource.php + libs/core/core.load_plugins.php + libs/core/core.load_resource_plugin.php: + remove Smarty::_plugin_implementation_exists() - use php's native + is_callable() + +2003-09-11 Messju Mohr + + * libs/Smarty.class.php: + silenced two notices acces HTTP_SERVER_VARS + +2003-09-10 andreas halter + + * docs/de/designers.sgml + docs/de/getting-started.sgml + docs/de/programmers.sgml: + - minor fixes (2 rep), slight wording changes + - jade transform problem fixed + +2003-09-08 andreas halter + + * docs/de/designers.sgml + docs/de/getting-started.sgml + docs/de/manual.sgml + docs/de/preface.sgml + docs/de/programmers.sgml: + all updated for 2.6.0 release, translated everything from 2_5_0 branch to + 20030908 + +2003-09-04 Messju Mohr + + * libs/Smarty.class.php: + proper checking for files in _fetch_resource_info() + +2003-09-02 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + ignore {strip}/{/strip) inside {strip}-blocks + + * libs/plugins/function.mailto.php: + fixed 2 notices in smarty_function_mailto() + +2003-09-01 Messju Mohr + + * libs/Smarty.class.php: + re-include cache_paths on multiple calls to fetch() to avoid + inconsistencies + at multiple calls to fetch() in one script + + * libs/Smarty_Compiler.class.php: + fixed handling of \r in {strip} + renamed $_trailing_lf to $_additional_newline + + * libs/Smarty_Compiler.class.php: + the weekly fix for {strip} :) + + * docs/designers.sgml: + fixed example for simple math. + +2003-08-29 Messju Mohr + + * libs/core/core.assign_smarty_interface.php + libs/core/core.display_debug_console.php + libs/plugins/function.assign.php + libs/plugins/function.html_options.php + libs/plugins/function.html_table.php: + fixed PHPDocumentor-comments (thanks Konstantin) + + * libs/core/core.rmdir.php: + made rmdir a bit more optimistic. especially it now removes + directories correctly that where created accidently by "safe_mode=On + && $use_sub_dirs=true" + +2003-08-27 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + fixed removal of leading/trailing newlines in {strip}-blocks + +2003-08-25 Messju Mohr + + * INSTALL: + added note emphasizing the introduction of "libs/" with 2.5.0 + + * NEWS + libs/plugins/modifier.escape.php: + fixed proper escaping of " and ' with escape:javascript + +2003-08-22 Messju Mohr + + * NEWS + libs/core/core.assemble_plugin_filepath.php: + fixed bug in traversal of $smarty->plugins_dir-array in + smarty_core_assemble_plugin_filepath(). the first matching plugin in + the path should be used, not the last one. + + * libs/core/core.read_cache_file.php: + discard $_cache_info when the cache should be regenerated + +2003-08-20 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php + libs/plugins/block.strip.php: + reverted {strip} from a block-plugin back into the compiler + + * docs/programmers.sgml: + fixed examples for register_function() and register_block() + + * libs/Smarty.class.php: + made template_exists() quiet when the template does not exist (thanks + to konstatin for pointing this out) + +2003-08-18 Monte Ohrt + + * docs/getting-started.sgml: + fix example title + + * docs/README + docs/getting-started.sgml: + change installation wording confusion + +2003-08-18 Messju Mohr + + * libs/Smarty.class.php + libs/core/core.read_cache_file.php: + fixed unnecessary load of source in template_exists() and the + compile-check of smarty_core_read_cache_file() + + * libs/Smarty_Compiler.class.php: + allow section-, array- and object-dereference in $smarty-references + +2003-08-15 Messju Mohr + + * docs/designers.sgml: + added parameter-descriptions for count_characters (thanks Konstantin + A. Pelepelin) + + fixed docs for {html_checkboxes} + +2003-08-14 Messju Mohr + + * libs/Smarty.class.php + libs/core/core.read_cache_file.php: + fixed timestamp-check of config-files in smarty_core_read_cache_file() + + * libs/Smarty.class.php: + fixed typecasting for arrays in _parse_resource_name() + + * NEWS + libs/plugins/function.config_load.php: + fixes in config_load: + - handling of section-attribute + - reusing the same config-file multiple times + - serialization of config-data for php<4.2.0 (no var_export) + + many thanks to atu for pointing this out and for testing + +2003-08-13 Messju Mohr + + * libs/Smarty.class.php + libs/core/core.smarty_include_php.php: + fixed problem with vars as attributes in {include_php} + +2003-08-13 Monte Ohrt + + * docs/README: + commit README file for documentation compiling + +2003-08-13 Messju Mohr + + * libs/debug.tpl + libs/plugins/modifier.debug_print_var.php: + removed '\r' from debug_print_vars' output + properly escape vars in javascript-version of debug.tpl + +2003-08-11 Monte Ohrt + + * (Smarty_2_6_0_RC1) + NEWS + docs/designers.sgml + docs/html.dsl + docs/php.dsl + libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + get ready for 2.6.0-RC1 release + +2003-08-10 Messju Mohr + + * NEWS + libs/Smarty.class.php: + fixed status-header for cache_modified_check under cgi-sapi + +2003-08-09 Messju Mohr + + * libs/core/core.is_secure.php + libs/core/core.is_trusted.php: + synced secure_dir-checking with trusted_dir-checking + + * libs/core/core.is_secure.php: + tightenend path checking in smarty_core_is_secure() + +2003-08-08 Messju Mohr + + * libs/Smarty.class.php: + fix: proper nesting of $smarty->_cache_including flag in cascaded + cached/not-cached/fetched/inserted/foo-templates + + * libs/debug.tpl: + better escaping for $_debug_tpls[templates].filenames + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + removed redundant $smarty from Smarty::_smarty_include() + + * libs/debug.tpl: + proper escaping of filenames in debug-console (thanks to prossel). + +2003-08-07 Messju Mohr + + * docs/programmers.sgml: + added docs for block-methods of registered objects + + * docs/programmers.sgml: + fixed typo in example for registered objects + + * docs/designers.sgml: + fixed exampls of html_image and html_checkboxes + + * libs/plugins/function.debug.php: + fixed {debug} and removed tabs in function.debug.php + + * docs/programmers.sgml: + fixed example for register_object + + * docs/designers.sgml + docs/programmers.sgml: + updated docs for capture, html_table, html_image and register_object + +2003-08-07 Monte Ohrt + + * docs/designers.sgml + docs/programmers.sgml: + add math and default_resource_type to docs + + * docs/getting-started.sgml: + add core to example, add tech note + +2003-08-07 Messju Mohr + + * docs/manual.sgml + docs/fr/manual.sgml: + upd copyright in the docs + +2003-08-07 Monte Ohrt + + * docs/getting-started.sgml: + added core directory to install instructions + +2003-08-07 Messju Mohr + + * docs/designers.sgml + docs/programmers.sgml: + added docs for php-functions as modifiers + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + better caching of attributes for $cacheable=false-plugins + + * docs/programmers.sgml: + added section "caching.cacheable" to the docs, explaining the usage of + the $cacheable-flag of the register_(block|compiler|function)-functions + + * libs/Smarty_Compiler.class.php: + fixed output of custom-functions with cached attributes + + * docs/programmers.sgml: + docs update on callbacks to the register_*-functions + +2003-08-06 Messju Mohr + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.process_compiled_include.php: + added optional parameter $cache_attrs to register_function() and + register_block(). $cache_attrs is an array containing attribute- names + that should be cached on calls to functions that have $cacheable set + to false. + + * libs/Smarty.class.php: + fixed bug in _run_mod_handler + + * libs/Smarty_Compiler.class.php: + fixed bug with autoload-handling of modifiers. thanks ándre. + +2003-08-05 Messju Mohr + + * libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + updated copyright notice + + * libs/Smarty.class.php + libs/core/core.load_plugins.php: + fixed bug that occurred when using the same not-cacheable plugin in + multiple includes + + * docs/programmers.sgml: + docs-update for plugins.writing + +2003-08-04 Messju Mohr + + * docs/designers.sgml + docs/programmers.sgml: + updated docs for register_block_function(), block-functions, + $request_use_auto_globals and html_checkboxes + +2003-07-31 Messju Mohr + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + enabled registration of class-methods as callbacks for the + register_*-functions + + use: array('classname', 'method_name')) as callback + +2003-07-29 Messju Mohr + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + modifiers are resolved at compile-time now. _run_mod_handler() is + still used for modifiers with map_array=true (== no preceeding '@') + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.smarty_include.php: + moved _smarty_include() back into Smarty.class.php + + * libs/Smarty.class.php + libs/core/core.load_plugins.php: + prevent unnecessary calls to _read_file() in _is_compiled() + converted method-call to internal function-call in + smarty_core_load_plugins() + +2003-07-28 Messju Mohr + + * libs/Smarty_Compiler.class.php: + quote smarty-header properly to prevent resource-names from escaping from + the comment + +2003-07-25 Messju Mohr + + * libs/core/core.create_dir_structure.php: + weakend race-condition and removed bogus error-message caused by that + in smarty_core_create_dir_structure(). + +2003-07-23 Messju Mohr + + * libs/Smarty.class.php + libs/core/core.display_debug_console.php + libs/core/core.fetch_resource_info.php + libs/core/core.get_php_resource.php + libs/core/core.parse_resource_name.php + libs/core/core.process_cached_inserts.php + libs/core/core.read_cache_file.php + libs/core/core.run_insert_handler.php + libs/core/core.smarty_include.php + libs/core/core.smarty_include_php.php + libs/plugins/function.eval.php: + moved _fetch_resource_info and _parse_resource_name back into + Smarty.class.php + renamed smarty_include and smarty_eval wrappers to _include and _eval + +2003-07-17 Messju Mohr + + * libs/core/core.process_compiled_include.php + libs/core/core.read_cache_file.php: + improved checking of compiled_include against cached-template with + non-cached-chunks + + * libs/core/core.write_compiled_include.php: + fixed too short open-tag + + * libs/plugins/function.eval.php: + fixed assign parameter for eval (must have gotton lost on its way to 2.5.0) + cleaned up indentiation + +2003-07-03 Messju Mohr + + * libs/Smarty_Compiler.class.php: + resurrected $foo->$bar syntax + + * libs/Smarty_Compiler.class.php: + i'm so stupid. kick me. + + * libs/Smarty_Compiler.class.php: + fixed initialisation of $this->_plugins in compile_block_tag() + +2003-07-03 Monte Ohrt + + * libs/Config_File.class.php: + add preg_quote delimiter + +2003-07-03 Messju Mohr + + * libs/Smarty_Compiler.class.php: + applied fix for {$var1->p1|modifier:$var2->p2}-syntax - thanks Dominik + +2003-07-02 Messju Mohr + + * libs/Smarty_Compiler.class.php: + fixed duplicate generation of arg-list in _compile_block_tag() + + * libs/Smarty_Compiler.class.php: + fixed off-by-one-error in nocache-tag-handling + +2003-06-30 Messju Mohr + + * libs/Smarty_Compiler.class.php: + backed out errornously committed support for $foo->$bar + + * libs/core/core.write_file.php: + fixed indentiation, silenced occasional warning + + * libs/plugins/function.html_image.php: + match first character of file-attribute against "/" instead of + DIRECTORY_SEPARATOR since it is a url-path and not a file-path. + + * libs/Smarty_Compiler.class.php + libs/core/core.write_file.php + libs/plugins/function.html_image.php: + libs/plugins/function.html_image.php + + * libs/Smarty_Compiler.class.php: + re-fixed cacheable_state-handling + + * libs/core/core.display_debug_console.php + libs/core/core.process_cached_inserts.php + libs/core/core.process_compiled_include.php + libs/core/core.run_insert_handler.php: + extincting $this out of smarty_core_*-functions + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + fixed handling of nocache-state + +2003-06-29 Messju Mohr + + * libs/Smarty.class.php + libs/core/core.smarty_include.php + libs/core/core.smarty_include_php.php + libs/plugins/function.eval.php: + removed $this from smarty_include and smarty_include_php + added cleaner handling of $this to {eval} + + * libs/core/core.load_resource_plugin.php: + fixed inlude_once-call + + * docs/de/designers.sgml + docs/fr/designers.sgml: + fixed examples of html_radios and html_checkboxes in german and french docs + +2003-06-25 Monte Ohrt + + * libs/core/core.assemble_auto_filename.php + libs/core/core.write_cache_paths_file.php: + fix typo, fix write_cache_paths logic + + * libs/Smarty.class.php + libs/core/core.assemble_auto_filename.php: + fix SMARTY_COMPILE_DIR_SEP problem, make local var + +2003-06-24 Monte Ohrt + + * libs/Smarty.class.php + libs/core/core.assemble_auto_filename.php + libs/core/core.write_cache_paths_file.php: + fixed cache_paths bug, simplified filename assembly logic + +2003-06-24 Messju Mohr + + * libs/plugins/function.html_image.php: + added parsing of forgotton param "basedir" + + * libs/Smarty_Compiler.class.php: + fixed $smarty.get-reference + + * libs/plugins/block.textformat.php: + removed warning + + * libs/Smarty_Compiler.class.php: + fixed value of _cacheable_state on compiler-startup + +2003-06-23 Monte Ohrt + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.write_cache_paths_file.php: + make cache_path per resource, fix a couple directory path issues + +2003-06-23 Messju Mohr + + * libs/Smarty_Compiler.class.php: + removed warning when compiling empty template + + * libs/core/core.write_compiled_include.php: + fixed bug in write_compiled_include + + * libs/core/core.assemble_plugin_filepath.php: + fixed warning + +2003-06-22 Messju Mohr + + * libs/plugins/function.eval.php: + fixed propagation of $this into evald code in smarty_function_eval() + + * libs/core/core.write_cache_paths_file.php + libs/core/core.write_compiled_include.php: + fix in compiled-include-handling + + * libs/core/core.assemble_auto_filename.php + libs/core/core.assemble_plugin_filepath.php + libs/core/core.assign_smarty_interface.php + libs/core/core.create_dir_structure.php + libs/core/core.fetch_resource_info.php + libs/core/core.get_include_path.php + libs/core/core.get_microtime.php + libs/core/core.get_php_resource.php + libs/core/core.is_secure.php + libs/core/core.is_trusted.php + libs/core/core.load_plugins.php + libs/core/core.load_resource_plugin.php + libs/core/core.parse_resource_name.php + libs/core/core.read_cache_file.php + libs/core/core.rm_auto.php + libs/core/core.rmdir.php + libs/core/core.write_cache_file.php + libs/core/core.write_cache_paths_file.php + libs/core/core.write_compiled_include.php + libs/core/core.write_compiled_resource.php + libs/core/core.write_file.php + libs/plugins/modifier.date_format.php: + started moving from $this to $smarty in core.*.php + +2003-06-21 Monte Ohrt + + * libs/core/core.create_dir_structure.php + libs/core/core.write_file.php + libs/plugins/function.config_load.php: + fix more dir paths + + * NEWS + libs/Smarty.class.php + libs/core/core.assemble_auto_filename.php + libs/core/core.assemble_plugin_filepath.php + libs/core/core.fetch_resource_info.php + libs/core/core.get_php_resource.php + libs/core/core.parse_resource_name.php + libs/core/core.process_cached_inserts.php + libs/core/core.read_cache_file.php + libs/core/core.rm_auto.php + libs/core/core.rmdir.php + libs/core/core.run_insert_handler.php + libs/core/core.smarty_include.php + libs/core/core.smarty_include_php.php + libs/core/core.write_cache_file.php + libs/core/core.write_cache_paths_file.php + libs/core/core.write_compiled_include.php + libs/core/core.write_compiled_resource.php + libs/core/core.write_file.php + libs/plugins/function.config_load.php + libs/plugins/function.fetch.php + libs/plugins/function.html_image.php: + fix filepaths to core files to use DIRECTORY_SEPARATOR + +2003-06-21 Messju Mohr + + * libs/Smarty_Compiler.class.php: + fixed {plugin|modifier} syntax + + * libs/Smarty.class.php + libs/core/core.write_compiled_include.php: + fixed compiled include handling + +2003-06-21 Monte Ohrt + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.assemble_auto_filename.php + libs/core/core.assemble_plugin_filepath.php + libs/core/core.write_cache_paths_file.php: + added filepath caching + +2003-06-20 Monte Ohrt + + * libs/Smarty_Compiler.class.php: + update more varnames + + * libs/Smarty.class.php + libs/core/core.display_debug_console.php + libs/core/core.fetch_file_info.php + libs/core/core.fetch_resource_info.php + libs/core/core.get_php_resource.php + libs/core/core.parse_file_path.php + libs/core/core.parse_resource_name.php + libs/core/core.process_cached_inserts.php + libs/core/core.read_cache_file.php + libs/core/core.run_insert_handler.php + libs/core/core.smarty_include.php + libs/core/core.smarty_include_php.php + libs/core/core.write_compiled_resource.php + libs/core/core.write_compiled_template.php + libs/plugins/function.config_load.php: + refactored var naming to better reflect "resource" instead of "file" where + appropriate + +2003-06-19 Messju Mohr + + * libs/Smarty.class.php: + updated version-number to 2.5.0-cvs + + * libs/core/core.write_cache_file.php: + omit is-cache_dir-writable-check if a cache_handler_function is in use + + * libs/core/core.smarty_include_php.php: + fixed comments in smarty_include_php + +2003-06-19 Monte Ohrt + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.display_debug_console.php + libs/core/core.smarty_include.php + libs/plugins/function.eval.php: + split up _compile_template to _compile_file and _compile_source, fix eval + function + VS: ---------------------------------------------------------------------- + + * libs/plugins/function.config_load.php: + fix logic for _is_compiled() + +2003-06-19 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + added optional assign-attribute to {capture}-tag + + * NEWS + libs/Smarty.class.php: + added $cacheable-parameter to register_compiler_function() + +2003-06-18 Messju Mohr + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.load_plugins.php + libs/core/core.process_compiled_include.php + libs/core/core.read_cache_file.php + libs/core/core.write_cache_file.php + libs/core/core.write_compiled_include.php: + added $cacheable-parameter to register_function() and register_block() + + * libs/Smarty.class.php: + append '.php' to all compiled templates regardless of the settings of + $use_sub_dirs + + * libs/Smarty.class.php + libs/core/core.read_cache_file.php: + fixed $file_path-parameters passed to smarty_core_fetch_file_info() + +2003-06-17 Monte Ohrt + + * NEWS: + fix name + + * libs/Smarty_Compiler.class.php: + change varnames to follow coding methods + + * NEWS + libs/Smarty_Compiler.class.php: + add math patch to core + +2003-06-17 Messju Mohr + + * libs/core/core.smarty_include.php: + switched _process_template() to _is_compiled()-logic + +2003-06-17 Monte Ohrt + + * libs/Smarty.class.php: + fix _is_compiled logic + + * NEWS: + update news file + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + fix _run_mod_handler routine + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.display_debug_console.php + libs/core/core.fetch_file_info.php + libs/core/core.parse_file_path.php + libs/core/core.write_compiled_template.php + libs/plugins/function.config_load.php: + fix path problems, rename some varibles from "template" to "file" + +2003-06-16 Monte Ohrt + + * libs/core/core.fetch_file_info.php + libs/core/core.fetch_template_info.php: + rename file, commit + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.parse_file_path.php + libs/core/core.read_cache_file.php + libs/plugins/block.strip.php + libs/plugins/block.textformat.php + libs/plugins/compiler.config_load.php + libs/plugins/function.config_load.php + libs/plugins/function.eval.php + libs/plugins/function.fetch.php + libs/plugins/function.html_image.php: + fix config_load, compile fetched arrays to compile_dir, switch display + back to runtime. clean up var names and function names, split up compile + testing and compiling to separate funcs, rename some template_* functions + to + file_* functions and update logic so they can be used for file resources + other than templates. + +2003-06-16 Messju Mohr + + * libs/Smarty_Compiler.class.php: + fixed little bug in _compile_custom_tag() + +2003-06-16 Monte Ohrt + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.assign_smarty_interface.php + libs/core/core.create_dir_structure.php + libs/core/core.display_debug_console.php + libs/core/core.fetch_template_info.php + libs/core/core.get_include_path.php + libs/core/core.get_microtime.php + libs/core/core.get_php_resource.php + libs/core/core.is_secure.php + libs/core/core.is_trusted.php + libs/core/core.load_plugins.php + libs/core/core.load_resource_plugin.php + libs/core/core.parse_file_path.php + libs/core/core.process_cached_inserts.php + libs/core/core.read_cache_file.php + libs/core/core.rm_auto.php + libs/core/core.rmdir.php + libs/core/core.run_insert_handler.php + libs/core/core.smarty_include.php + libs/core/core.smarty_include_php.php + libs/core/core.write_cache_file.php + libs/core/core.write_compiled_template.php + libs/core/core.write_file.php + libs/plugins/core.assign_smarty_interface.php + libs/plugins/core.create_dir_structure.php + libs/plugins/core.display_debug_console.php + libs/plugins/core.fetch_template_info.php + libs/plugins/core.get_include_path.php + libs/plugins/core.get_microtime.php + libs/plugins/core.get_php_resource.php + libs/plugins/core.is_secure.php + libs/plugins/core.is_trusted.php + libs/plugins/core.load_plugins.php + libs/plugins/core.load_resource_plugin.php + libs/plugins/core.parse_file_path.php + libs/plugins/core.process_cached_inserts.php + libs/plugins/core.read_cache_file.php + libs/plugins/core.rm_auto.php + libs/plugins/core.rmdir.php + libs/plugins/core.run_insert_handler.php + libs/plugins/core.smarty_include.php + libs/plugins/core.smarty_include_php.php + libs/plugins/core.write_cache_file.php + libs/plugins/core.write_compiled_template.php + libs/plugins/core.write_file.php: + move core files into their own directory under SMARTY_DIR, + remove abstraction function _execute_core_function + + * libs/Smarty_Compiler.class.php: + fix newline handling for template for all template tags + +2003-06-11 Monte Ohrt + + * libs/plugins/compiler.config_load.php: + add compiler function to cvs repository + +2003-06-11 Messju Mohr + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + added config-option "request_use_auto_globals" to make auto-globals be + used as request vars instead of HTTP_*_VARS + +2003-06-11 Monte Ohrt + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/plugins/function.config_load.php: + make config vars compile statically + +2003-06-11 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + backed out newlines patch + + * NEWS + libs/Smarty_Compiler.class.php: + removed newlines in compiled templates after closing tags + +2003-06-10 Messju Mohr + + * docs/de/designers.sgml: + fixed german note on html_image and disk-access + +2003-06-10 Monte Ohrt + + * libs/plugins/core.parse_file_path.php: + fix bug with resource_type resolving + +2003-06-09 Monte Ohrt + + * docs/designers.sgml: + replace example with more practical one + +2003-06-08 Messju Mohr + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + added block-methods for registered objects + +2003-06-07 Messju Mohr + + * docs/programmers.sgml: + fixed bug in documentation for $smarty->default_modifiers + +2003-06-06 Monte Ohrt + + * libs/plugins/core.parse_file_path.php: + fix problem with new default_resource_type changes + + * NEWS: + update NEWS file info + + * NEWS + libs/Smarty.class.php + libs/plugins/core.parse_file_path.php: + add default_resource_type, ignore 1 char resource names + + * NEWS + libs/Config_File.class.php: + fix bug where config file starts with hidden section + +2003-06-04 Monte Ohrt + + * NEWS + libs/Smarty.class.php: + -** empty log message *** + +2003-06-03 Monte Ohrt + + * libs/plugins/function.html_image.php: + fix example in code comments + +2003-06-03 Messju Mohr + + * NEWS + libs/plugins/function.counter.php: + fixed behaviour of start=... for {counter} + +2003-06-02 Messju Mohr + + * NEWS + libs/plugins/function.counter.php: + fixed assign for {counter} + +2003-05-30 Monte Ohrt + + * libs/plugins/core.write_cache_file.php + libs/plugins/core.write_compiled_template.php: + add discrete error checking pertaining to $cache_dir + and $compile_dir, their existance and writability + +2003-05-28 Messju Mohr + + * NEWS + libs/plugins/function.html_table.php: + added params vdir, hdir and inner to html_table to allow looping over + the data in various directions + +2003-05-28 Monte Ohrt + + * libs/plugins/core.compile_template.php + libs/plugins/core.display_debug_console.php: + fix problem with security and debug.tpl file + +2003-05-23 Monte Ohrt + + * NEWS: + upd NEWS file + + * libs/Smarty_Compiler.class.php: + allow spaces in literal tags + +2003-05-22 Monte Ohrt + + * docs/fr/programmers.sgml: + fix special chars + +2003-05-19 Monte Ohrt + + * NEWS + libs/Smarty_Compiler.class.php: + speed up compiled templates, hardcode plugin filepaths instead of + recalculate at runtime + +2003-05-19 Messju Mohr + + * docs/designers.sgml: + fixed example of {html_image} + + * docs/designers.sgml: + fixed typo + +2003-05-12 Messju Mohr + + * libs/Smarty.class.php + libs/plugins/core.read_cache_file.php + libs/plugins/core.smarty_include.php + libs/plugins/function.config_load.php: + fixed multiple redundant occurrences for 'config' and 'template' in + $smarty->_cache_info + +2003-05-10 Messju Mohr + + * libs/plugins/core.create_dir_structure.php: + refurbished create_dir_structure to use '/' internally + + * libs/plugins/core.create_dir_structure.php: + fixed windows absolute-paths in smarty_core_create_dir_structure() + + * libs/plugins/core.create_dir_structure.php: + fixed error-message + +2003-05-09 Messju Mohr + + * libs/Smarty_Compiler.class.php: + fixed warning due to missing param to _execute_core_function() + + * libs/Smarty_Compiler.class.php: + fixed quoting in _compile_include_php + + * libs/Smarty_Compiler.class.php: + fixed quoting of "file"-parameter in _compile_include_tag() + +2003-05-08 Monte Ohrt + + * docs/programmers.sgml: + fix typo + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/plugins/core.compile_template.php + libs/plugins/core.create_dir_structure.php + libs/plugins/core.fetch_template_info.php + libs/plugins/core.get_include_path.php + libs/plugins/core.get_microtime.php + libs/plugins/core.get_php_resource.php + libs/plugins/core.is_secure.php + libs/plugins/core.is_trusted.php + libs/plugins/core.load_plugins.php + libs/plugins/core.load_resource_plugin.php + libs/plugins/core.parse_file_path.php + libs/plugins/core.process_cached_inserts.php + libs/plugins/core.read_cache_file.php + libs/plugins/core.rm_auto.php + libs/plugins/core.rmdir.php + libs/plugins/core.run_insert_handler.php + libs/plugins/core.smarty_include.php + libs/plugins/core.smarty_include_php.php + libs/plugins/core.write_cache_file.php + libs/plugins/core.write_compiled_template.php + libs/plugins/core.write_file.php + libs/plugins/function.config_load.php + libs/plugins/function.fetch.php + libs/plugins/function.html_image.php: + abstract more private functions to plugin directory + + * libs/Config_File.class.php: + only add DIRECTORY_SEPARATOR if it isn't already present + + * libs/Config_File.class.php: + fix directory separator code, use DIRECTORY_SEPARATOR + +2003-05-08 Messju Mohr + + * docs/designers.sgml: + fixed example of html_checkboxes + + * NEWS + libs/Smarty.class.php: + fixed bug in _create_dir_structure() when used with + open_basedir-restriction and relative paths + + * docs/designers.sgml: + fixed example for html_radios + +2003-05-07 Monte Ohrt + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/plugins/core.assign_smarty_interface.php + libs/plugins/core.display_debug_console.php + libs/plugins/function.display_debug_console.php: + abstracted display_debug_console and assign_smarty_interface to plugin dir + as a test + + * libs/Smarty.class.php + libs/plugins/function.display_debug_console.php: + correct misc varnames, abstract debug console display to plugin function + + * libs/plugins/modifier.escape.php: + fix typo + +2003-05-05 Monte Ohrt + + * libs/Smarty_Compiler.class.php: + add % to math + + * libs/Smarty.class.php: + clean up comments, formatting + + * NEWS + libs/Smarty.class.php: + keep DIR_SEP for 3rd party compatability + + * NEWS + libs/Smarty.class.php: + remove DIR_SEP, use DIRECTORY_SEPARATOR exclusively + + * libs/Smarty_Compiler.class.php: + remove ++ and -- math operators on template vars + +2003-05-04 Messju Mohr + + * libs/Smarty_Compiler.class.php: + removed unused parameter $quote from Smarty_Compiler::_parse_attrs() + + * libs/plugins/function.html_image.php: + fixed DIR_SEP in html_image-plugin + +2003-05-04 Monte Ohrt + + * NEWS + libs/Smarty.class.php: + rename DIR_SEP to SMARTY_DIR_SEP to avoid varname collisions + +2003-05-04 Messju Mohr + + * NEWS + libs/plugins/function.html_image.php: + changed "link" to "href" in html_image. "link" is still working but + deprecated + html_image always renders an alt-tag now (default alt="") + cleaned up indentiation of function.html_image.php + +2003-05-03 Monte Ohrt + + * libs/debug.tpl: + fix typo + +2003-05-02 Messju Mohr + + * NEWS + libs/plugins/function.counter.php: + fixed assign attribute for multiple counters + +2003-05-02 Monte Ohrt + + * libs/Smarty_Compiler.class.php: + allow math on negative number + + * NEWS + libs/Smarty_Compiler.class.php: + added simple math operators to variables + +2003-05-02 Messju Mohr + + * docs/designers.sgml: + fixed typos + +2003-04-30 Monte Ohrt + + * docs/fr/appendixes.sgml + docs/fr/common.dsl + docs/fr/designers.sgml + docs/fr/getting-started.sgml + docs/fr/html-common.dsl + docs/fr/html.dsl + docs/fr/manual.sgml + docs/fr/php.dsl + docs/fr/preface.sgml + docs/fr/programmers.sgml: + add frech docs to cvs repository + +2003-04-29 Messju Mohr + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + reverted patch for case-insensitive tag-names + +2003-04-28 Messju Mohr + + * docs/programmers.sgml: + reverted back to humerous redundancy in the docs :). although we all + know we are here to generate template-based output, and not to have + fun ;-) + + * docs/getting-started.sgml: + fixed default user and group for max os x installation + + * libs/Smarty.class.php: + made $function[2] and $function[3] options for register_resource + + * libs/Smarty.class.php: + fixed issue with object-callback when fetching a php-resource + + * NEWS + libs/Smarty.class.php: + enabled array(&$obj. 'source', 'timestamp', 'secure', 'trusted') as + callback for register_resource() + + enabled array(&$obj, 'method') as callback for + $default_template_handler_func + +2003-04-27 Messju Mohr + + * docs/designers.sgml + docs/programmers.sgml: + fixed some typos, thank to mehdi + + * libs/plugins/function.counter.php: + prevent assign from overruling print-attribute in function.counter.php + + * libs/plugins/function.counter.php: + fixed problem with counter and assign + + * libs/Smarty.class.php: + fixed notice in _load_plugins() + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + made plugin-names case-insensitive. this affects + compiler/block/custom-functions and modifers. + +2003-04-26 Monte Ohrt + + * NEWS + libs/Smarty_Compiler.class.php: + remove unnecessary close/open tags from compiled templates + +2003-04-26 Messju Mohr + + * docs/designers.sgml: + added documentation for foreach.property.* + +2003-04-24 Messju Mohr + + * docs/designers.sgml: + fixed example table_attr and tr_attr in html_table-example + +2003-04-21 Greg Beaver + + * libs/Smarty.class.php: + fixed small bug in doc comments + +2003-04-21 Messju Mohr + + * NEWS + libs/plugins/function.html_image.php: + fixed errornous creation of '//' in image_path in html_image + +2003-04-21 Monte Ohrt + + * libs/plugins/modifier.debug_print_var.php: + fix htmlspecialchars() conflict + + * NEWS + libs/plugins/modifier.debug_print_var.php: + fix escapement of special chars in key values of debug console + + * NEWS + libs/plugins/function.config_load.php: + fixed debug timing logic for config_load + + * docs/designers.sgml: + fix example text + + +2003-04-20 Greg Beaver + * plugins/* + Smarty.class.php + Smarty_Compiler.class.php + Config_File.class.php: + updated all doc comments to phpDocumentor format (whew!) + +2003-04-06 Messju Mohr + + * libs/plugins/function.math.php: + allowed "_" in the name of variable-parameters to {math}-function + +2003-04-04 Monte Ohrt + + * NEWS + docs/designers.sgml + libs/Smarty_Compiler.class.php: + change backtic syntax from $`foo` to `$foo` + + * NEWS + libs/Smarty_Compiler.class.php: + recognize $foo[][] syntax in embedded quotes without backticks + +2003-04-03 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + name=123 is passed as an integer (not a string) to plugins now + +2003-04-01 Messju Mohr + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + added CVS $Id: ChangeLog,v 1.1 2005/02/03 16:55:35 sebastian Exp $ + +2003-03-31 Messju Mohr + + * libs/Smarty.class.php: + added missing compile_id inside Smarty_Compiler + + * libs/Smarty_Compiler.class.php: + fixed flaw when generating an error for missing postfilter + +2003-03-31 Monte Ohrt + + * docs/getting-started.sgml + docs/programmers.sgml: + fix typos + +2003-03-27 Messju Mohr + + * NEWS + libs/plugins/modifier.debug_print_var.php: + $length is now propagated to sub-values in debug_print_var + +2003-03-26 Monte Ohrt + + * NEWS: + update header + + * RELEASE_NOTES: + commit changes to release notes + + * (Smarty_2_5_0_RC2) + libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + committing RC2 + +2003-03-24 Messju Mohr + + * NEWS + libs/Smarty.class.php: + made clear_cache() ignore compile_id when clearing cache_groups + + * libs/plugins/function.popup.php: + made onmouseout XHTML-compatible in function.popup.php + +2003-03-21 Messju Mohr + + * NEWS + libs/Smarty.class.php: + applied new var-names to fetch() + + * NEWS + libs/Smarty.class.php: + renamed $localvars to $_localvars in cache-file-handling-functions, + added _get_auto_id()-function + +2003-03-21 Monte Ohrt + + * libs/plugins/function.mailto.php + libs/plugins/function.popup.php: + update functions for XHTML compatability + +2003-03-21 Messju Mohr + + * libs/Smarty.class.php: + fixed wrong $auto_id in _read_cache_file() + + * NEWS + libs/Smarty.class.php: + swapped compile_id and cache_id in read_cache_file and write_cache_file + + * libs/Smarty.class.php: + reverted patch for ignoring compile-id back to -r1.364, due to problems + + * NEWS + libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_radios.php: + html_radios and html_checkboxes accept "selected" instead of "checked" + optionally now + + * NEWS + libs/Smarty.class.php: + swapped compile_id and cache_id for cache-file-handling again + +2003-03-20 Monte Ohrt + + * libs/Smarty_Compiler.class.php: + fix notice when no parameter is passed to default + +2003-03-20 Messju Mohr + + * NEWS + libs/Smarty.class.php: + removed notice of undefined var in _rm_auto() + +2003-03-19 Monte Ohrt + + * libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_radios.php + libs/plugins/function.html_table.php: + fix a few error messages, follow consistancy format plugin_name: errormsg + + * libs/plugins/function.html_radios.php: + update error messages + + * NEWS + libs/plugins/function.html_radios.php: + add a warning when an array is passed as the 'checked' value of html_radios + +2003-03-19 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + fixed errormessage in _compile_smarty_ref() + + * NEWS + docs/designers.sgml: + updated docs for html_image + +2003-03-18 Messju Mohr + + * NEWS + libs/Smarty.class.php: + cleaned up calls to readdir() + + * libs/plugins/function.html_options.php: + fixed label for optgroup in html_options + +2003-03-18 Monte Ohrt + + * NEWS + libs/Smarty_Compiler.class.php: + fix (newly introduced) bug with passing multiple modifiers to a parameter + +2003-03-18 Messju Mohr + + * NEWS + docs/designers.sgml: + updated docs for html_checkboxes, html_options and html_radios + + * libs/plugins/function.html_options.php: + fixed wrong default-"name" in function.html_options.php + + * NEWS + libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_radios.php: + renamed "checkbox" and "radios" to "options" in {html_checkboxes} and + {html_radios} + + * libs/plugins/outputfilter.trimwhitespace.php: + tried to optimize re-replacement in outputfilter.trimwhitespace.php a + little + + * libs/plugins/outputfilter.trimwhitespace.php: + fixed greedy str_replace in outputfilter.trimwhitespace.php + + * NEWS + libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_options.php + libs/plugins/function.html_radios.php: + html_options, html_checkboxes and html_radios now pass-thru all unknown + paramters + +2003-03-17 Messju Mohr + + * NEWS + libs/plugins/function.html_options.php: + html_options passthru all unknown paramters now + +2003-03-17 Monte Ohrt + + * NEWS + libs/plugins/function.html_image.php: + Fix link bug in html_image function, also make output XHTML compatible + + * libs/Smarty_Compiler.class.php: + fix issue of embedded var and escaped double quotes + +2003-03-15 Monte Ohrt + + * NEWS + libs/Smarty_Compiler.class.php: + back out "@" logic, apply only to default modifier special case + + * libs/Smarty_Compiler.class.php: + fix @ logic, only use upon an echo + + * NEWS + libs/Smarty_Compiler.class.php: + append "@" to template var echoes to supress possible notices + + * NEWS + libs/Smarty_Compiler.class.php: + append "@" to _run_mod_handler to supress warnings + +2003-03-14 Monte Ohrt + + * NEWS + libs/Smarty_Compiler.class.php: + fix problem with escaped double quotes + + * NEWS + libs/plugins/function.html_radios.php: + fixed html_options to not return an array + +2003-03-12 Messju Mohr + + * NEWS + libs/plugins/modifier.truncate.php: + fixed length in modifier.truncate.php + + * NEWS + libs/plugins/outputfilter.trimwhitespace.php: + fixed handling of '$'-signs in trimwhitespace outputfilter (messju) + +2003-03-12 Monte Ohrt + + * docs/programmers.sgml: + update technical explanation of assign_by_ref and append_by_ref + +2003-03-11 Monte Ohrt + + * NEWS + libs/Smarty.class.php: + fix config file recompiling code + +2003-03-07 Monte Ohrt + + * libs/plugins/function.html_image.php: + change E_USER_ERROR to E_USER_NOTICE + + * libs/plugins/function.html_image.php: + suppress warning in html_image + + * NEWS + libs/plugins/function.html_image.php: + update changes to html_image + +2003-03-06 Monte Ohrt + + * docs/designers.sgml + docs/de/appendixes.sgml + docs/de/common.dsl + docs/de/designers.sgml + docs/de/getting-started.sgml + docs/de/html-common.dsl + docs/de/html.dsl + docs/de/manual.sgml + docs/de/preface.sgml + docs/de/programmers.sgml: + add german docs to dist + + * NEWS: + update news file + + * libs/plugins/function.html_image.php: + fix width/height parameter index + + * NEWS + libs/Smarty.class.php: + get rid of unsetting name and script attributes to insert tags + +2003-03-05 Monte Ohrt + + * NEWS + RELEASE_NOTES: + update NEWS file + + * libs/plugins/modifier.string_format.php: + fix argument order, erroneously swapped a while back + + * (Smarty_2_5_0_RC1) + NEWS + README + RELEASE_NOTES + libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + commit final changes for 2.5.0-RC1 + +2003-03-04 Monte Ohrt + + * docs/programmers.sgml: + remove $show_info_header and $show_info_include property vars from docs + +2003-03-03 Monte Ohrt + + * NEWS + libs/plugins/function.popup.php: + fixed PHP notice + +2003-02-28 Monte Ohrt + + * libs/Smarty_Compiler.class.php: + simplify smarty.const.foo and smarty.const.$foo logic + + * libs/Smarty_Compiler.class.php: + only allow $foo syntax in embedded quotes, unless escaped with backticks + then allow any dollar var + + * NEWS + libs/Smarty_Compiler.class.php: + fix "once" var compiling to work with new attr compiling methods for + include_php + + * FAQ + NEWS + README + docs/designers.sgml + docs/getting-started.sgml + libs/Smarty_Compiler.class.php + libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_image.php + libs/plugins/function.html_options.php + libs/plugins/function.html_radios.php + libs/plugins/function.html_select_date.php + libs/plugins/function.html_select_time.php + libs/plugins/function.html_table.php: + fix $smarty.const.foo compiling, clean up double quoted strings, + allow full dollar var syntax in quotes again + +2003-02-27 Monte Ohrt + + * docs/designers.sgml + docs/programmers.sgml + libs/Smarty_Compiler.class.php: + update docs, fix smarty var compiling, allow any $smarty.*.$foo syntax, + add $`foobar` for embedded variables + + * libs/plugins/function.html_image.php: + update functionality + +2003-02-26 Monte Ohrt + + * NEWS + libs/plugins/modifier.nl2br.php: + add nl2br modifier + + * libs/plugins/function.html_image.php: + add link parameter + +2003-02-24 Monte Ohrt + + * libs/Smarty.class.php + libs/plugins/function.html_image.php: + fix rename problem in windows, unlink first + + * libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_image.php + libs/plugins/function.html_options.php + libs/plugins/function.html_radios.php + libs/plugins/shared.escape_special_chars.php: + update functions with separate escape_special_chars routine + + * NEWS + libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_radios.php: + commit checkboxes, update radios + + * NEWS + libs/Smarty.class.php + libs/plugins/function.html_image.php: + fix bug with get_registered_object + + * NEWS + libs/plugins/modifier.cat.php: + added cat modifier to distribution + + * NEWS + libs/Smarty_Compiler.class.php: + added << >> <> support to IF statements + + * libs/plugins/function.html_radios.php: + apply patch to initial html_radios function + + * NEWS + libs/Smarty.class.php: + fix _assign_smarty_interface to not overwrite keys other than 'request' + + * NEWS + libs/plugins/function.html_radios.php: + added html_radios to distribution + + * NEWS + libs/plugins/modifier.string_format.php: + fixed arg order of string_format + + * NEWS + libs/Smarty.class.php: + use tmp file for file writes, avoid race condition + + * NEWS + libs/Smarty_Compiler.class.php: + add $smarty.config.foo var, handle embedded smarty var correctly + + * NEWS + libs/plugins/function.fetch.php: + silence warnings in fetch plugin + +2003-02-21 Monte Ohrt + + * INSTALL: + update wording + + * INSTALL: + update install instructions + + * AUTHORS + BUGS + CREDITS + QUICKSTART + README + RESOURCES + TESTIMONIALS: + remove some files already in docs or elsewhere + + * demo/index.php: + add templates_c to repository + + * index.php: + move demo files to demo directory + + * Config_File.class.php + Smarty.class.php + Smarty_Compiler.class.php + debug.tpl: + moved lib files under libs directory + +2003-02-20 Monte Ohrt + + * NEWS + Smarty.class.php: + add get_config_vars() method, update get_template_vars() functionality + + * NEWS + Smarty.class.php: + fix minor logic in _fetch_template_info() + + * NEWS + Smarty.class.php: + support merging appended vars + + * NEWS + Smarty.class.php: + fix cache groups behavior with compile_id set + +2003-02-19 Monte Ohrt + + * Smarty.class.php: + back out third parameter, extend functionality of append + + * NEWS + Smarty_Compiler.class.php: + update imbedded vars, allow special $smarty vars + + * plugins/function.html_table.php: + add plugin html_table + + * NEWS + Smarty.class.php: + support appending key=>val pairs + + * NEWS + Smarty_Compiler.class.php: + change embedded variable logic to only recognize $foo and $foo[0][bar] + syntax + + * NEWS + Smarty_Compiler.class.php: + allow null as function attribute value + +2003-02-18 Monte Ohrt + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + support foo->bar[index] syntax + + * Smarty_Compiler.class.php: + allow $foo->bar[0] syntax + +2003-02-17 Monte Ohrt + + * plugins/modifier.escape.php: + fix syntax error from previous commit + + * NEWS + Smarty.class.php: + add error msgs to get_registered_object + + * Smarty.class.php: + add function for getting reference to registered object + + * Smarty_Compiler.class.php: + back out patches for object and objref calls on $smarty var + + * NEWS + Smarty_Compiler.class.php: + treat unrecognized param attribute syntax as a string + + * NEWS + Smarty_Compiler.class.php: + support $smarty.const.$foo syntax + + * NEWS + debug.tpl + plugins/modifier.count_words.php + plugins/modifier.escape.php: + fix E_NOTICE messages + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + add @ and === to if tokens, few param cleanups + +2003-02-16 Greg Beaver + + * ChangeLog + Smarty.class.php + Smarty_Compiler.class.php: + many more phpdoc comment upgrades + +2003-02-15 Greg Beaver + * Smarty.class.php + Smarty_Compiler.class.php + continue cleaning of phpdoc comments. All that is needed is the + addition of @return tags and perhaps a bit more verbose comments + and they are finished. + +2003-02-14 Monte Ohrt + + * NEWS + Smarty.class.php: + enable config_load error messages + + * NEWS + plugins/function.html_options.php: + fix html_options to not escape already escaped entities + + * NEWS + Smarty.class.php: + send Last-Modified header on cache creation, misc tab/spacing cleanup + +2003-02-13 Monte Ohrt + + * Smarty_Compiler.class.php + docs/designers.sgml: + allow dash in plain text + + * NEWS + Smarty_Compiler.class.php: + check strict syntax of function attributes + +2003-02-12 Monte Ohrt + + * NEWS + Smarty_Compiler.class.php: + dropped support for modifiers on object parameters, + added support for objects as modifier parameters + + * NEWS + Smarty_Compiler.class.php + docs/designers.sgml: + fix bug with decimal numbers in if statements, misc doc updates + +2003-02-11 Monte Ohrt + + * (Smarty_2_4_2) + Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php: + update version numbers + +2003-02-10 Monte Ohrt + + * NEWS + Smarty_Compiler.class.php: + add support for $foo->$bar syntax + + * NEWS: + update NEWS file + + * NEWS + Smarty_Compiler.class.php: + support full var syntax in quoted text, fix problem with const var access, + clean up some more regex code, fix object problem with no properties + +2003-02-06 Monte Ohrt + + * (Smarty_2_4_1) + Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php: + committed 2.4.1 changes + + * NEWS + Smarty_Compiler.class.php: + ignore case in IF statements + +2003-02-05 Monte Ohrt + + * NEWS + Smarty_Compiler.class.php: + treat undefined constants as null + + * NEWS + Smarty.class.php: + fix problem with inserts and nested fetches + + * Smarty_Compiler.class.php: + fix "if" regex for math tokens + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php + docs/getting-started.sgml: + added support for extracting params to include_php + +2003-02-04 Monte Ohrt + + * RELEASE_NOTES: + reformat text + +2003-02-03 Monte Ohrt + + * NEWS: + update news file + +2003-02-03 Greg Beaver + + * ChangeLog + Smarty.class.php: + begin fixing phpdoc comments in Smarty.class.php + + * ChangeLog + Config_File.class.php: + fixed phpdoc comments + +2003-02-03 Monte Ohrt + + * Smarty_Compiler.class.php: + allow $foo->bar[$x].foo syntax + + * Smarty_Compiler.class.php + index.php + configs/test.conf + templates/index.tpl: + fix accidental commit + + * index.php + configs/test.conf + templates/index.tpl: + allow $foo->bar[$j].blah type of syntax + +2003-02-02 Greg Beaver + + * Smarty.class.php + begin fixing of phpdoc comments + + * Config_File.class.php + fix phpdoc comments, add phpDocumentor docblock templates + +2003-02-02 Monte Ohrt + + * Smarty.class.php + docs/html.dsl + docs/php.dsl: + fix version number + + * (Smarty_2_4_0) + Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php + docs/appendixes.sgml + docs/designers.sgml + docs/programmers.sgml: + update Smarty version numbers + +2003-01-30 Monte Ohrt + + * NEWS + Smarty_Compiler.class.php + TODO: + fix order of php tag comparisons + + * NEWS + Smarty_Compiler.class.php: + fix known php tag handling problems + +2003-01-29 Monte Ohrt + + * Smarty.class.php + Smarty_Compiler.class.php: + change comments to phpdoc style + +2003-01-28 Monte Ohrt + + * Smarty.class.php + docs/programmers.sgml: + make separate var for compiler file + + * plugins/function.fetch.php: + fix error call + +2003-01-25 Monte Ohrt + + * Smarty.class.php + Smarty_Compiler.class.php: + add support for restriction to registered methods + + * plugins/outputfilter.trimwhitespace.php: + update with textarea support + +2003-01-24 Monte Ohrt + + * Smarty_Compiler.class.php: + fix compiling problem with {foreach} tags + + * Smarty.class.php + Smarty_Compiler.class.php: + put objects in own array, add object param format support, change + object syntax from foo.bar to foo->bar + +2003-01-23 Monte Ohrt + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + add support for object registration + +2003-01-22 Monte Ohrt + + * Smarty.class.php: + add file & line number of calling error to error message + +2003-01-21 Monte Ohrt + + * Smarty_Compiler.class.php: + put php style object syntax back in + +2003-01-20 Monte Ohrt + + * Smarty.class.php: + move security settings to fetch function for template_dir + + * NEWS + Smarty.class.php: + fix debug template and security, add template_dir to secure_dir at runtime + +2003-01-17 Monte Ohrt + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + added new object support without new template syntax + +2003-01-15 Monte Ohrt + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + fix if statement syntax for negative integers, fix issue with directories + named '0' + +2003-01-08 Monte Ohrt + + * Smarty.class.php + plugins/function.counter.php + plugins/function.cycle.php + plugins/function.debug.php + plugins/function.eval.php + plugins/function.fetch.php + plugins/function.html_options.php + plugins/function.html_select_date.php + plugins/function.html_select_time.php + plugins/function.mailto.php + plugins/function.math.php + plugins/function.popup.php + plugins/function.popup_init.php: + update plugins to return values instead of echo, fix config file cache + to include global config variables in cache file + + * Smarty_Compiler.class.php: + fix bug with >= tests in if statements, comment out full object support + +2003-01-06 Monte Ohrt + + * NEWS + docs/html.dsl + plugins/modifier.escape.php: + add javascript escape parameter to escape modifier + +2003-01-02 Monte Ohrt + + * templates/header.tpl: + move the title into head where it should be + +2002-12-24 Monte Ohrt + + * Smarty_Compiler.class.php: + added correct line numbers to smarty syntax error messages + + * docs/programmers.sgml: + update append documentation, make more clear on its function + + * Smarty_Compiler.class.php: + fix modifier matching regexp + +2002-12-23 Monte Ohrt + + * Smarty_Compiler.class.php: + support nested function calls in IF statements + +2002-12-20 Monte Ohrt + + * Smarty_Compiler.class.php: + few more fixes, spaces around function parameters + + * Smarty_Compiler.class.php: + fix misc syntax issues with {if} tags + +2002-12-20 Monte Ohrt + + * Smarty_Compiler.class.php: + fix misc syntax issues with {if} tags + +2002-12-19 Monte Ohrt + + * Smarty_Compiler.class.php: + commit updates, passes all smoke tests + + * NEWS: + update NEWS file + + * Smarty_Compiler.class.php: + fixed literal string not in quotes as parameters + + * NEWS + Smarty_Compiler.class.php: + fix misc syntax issues, add ability to pass modifiers to functions + +2002-12-18 Monte Ohrt + + * NEWS: + update NEWS + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + update compiler code, clean up regex, add new syntax features + +2002-12-16 Monte Ohrt + + * NEWS: + update NEWS file + + * Smarty_Compiler.class.php: + commit updates for objects + +2002-12-14 Monte Ohrt + + * Smarty.class.php + Smarty_Compiler.class.php: + fix bug with compiling config files with caching on + +2002-12-13 Monte Ohrt + + * Smarty_Compiler.class.php: + fix problem with matching single quoted strings + + * Smarty_Compiler.class.php: + update embedded variable logic, get rid of ."" at end of output + + * NEWS + docs/designers.sgml + plugins/function.html_select_date.php: + add day_value_format to html_select_date + +2002-12-12 Monte Ohrt + + * plugins/modifier.debug_print_var.php: + fix bug, double escaped values in display + + * Smarty.class.php: + move debug test back into fetch() + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php + plugins/outputfilter.trimwhitespace.php: + assigned vars are no longer in global name space, few debug cleanups + +2002-12-11 Monte Ohrt + + * plugins/function.popup.php: + fix error in newline code + + * plugins/function.popup.php: + fix popup to allow newlines in text data + +2002-12-10 Monte Ohrt + + * Smarty.class.php: + fix plugin error logic + + * docs/designers.sgml + docs/programmers.sgml: + edit examples, make more verbose + + * NEWS + plugins/function.html_options.php: + escape html entities in the option values and output + + * NEWS + plugins/function.html_options.php: + fixed bug with label of html_options + +2002-12-09 Monte Ohrt + + * Smarty.class.php: + add support for var_export() + + * Config_File.class.php + Smarty.class.php: + clean up code, respect force_compile and compile_check flags + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php + docs/designers.sgml + plugins/function.mailto.php: + add caching feature to config loading, document update, add mailto plugin + +2002-12-08 Monte Ohrt + + * plugins/function.fetch.php: + fix query part of URL + +2002-12-05 Monte Ohrt + + * docs/designers.sgml: + fix typos + +2002-11-22 Monte Ohrt + + * Smarty_Compiler.class.php: + patch for warning message + +2002-11-21 Monte Ohrt + + * RELEASE_NOTES + Smarty.class.php: + get rid of testing for a set value with assign function, just set to + whatever is passed into the template + + * docs/programmers.sgml: + fix typo + +2002-11-19 Monte Ohrt + + * Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php: + commit changes, ready for 2.3.1 release + +2002-11-01 Monte Ohrt + + * plugins/function.html_options.php: + added label attribute to all option outputs, cover w3c spec. + + * NEWS: update NEWS file + + * docs/designers.sgml: update docs for optgroup output + + * plugins/function.html_options.php: + make html_options work with optgroup, make func modular and recursive. + +2002-10-29 Monte Ohrt + + * NEWS + Smarty.class.php: set mtime on compile files so they match source files + +2002-10-18 Monte Ohrt + + * NEWS + Smarty.class.php: added proper support for open_basedir setting + + * docs/designers.sgml: clear up docs on index, iteration and rownum + +2002-10-16 Monte Ohrt + + * plugins/modifier.default.php: fix warning message in default modifier + +2002-09-25 Monte Ohrt + + * docs/designers.sgml + plugins/modifier.strip.php + NEWS: added strip variable modifier + +2002-09-24 Andrei Zmievski + + * NEWS: *** empty log message *** + + * Smarty_Compiler.class.php: + Fix to be able to use $smarty.x variables as arrays. + +2002-09-23 Monte Ohrt + + * Config_File.class.php: + add support for mac/dos formatted config files (fix newlines) + + * docs/programmers.sgml: add optional tags to clear_cache parameters + + * docs/designers.sgml: + fix error with include_php description, add $this to description + +2002-09-20 Monte Ohrt + + * NEWS + docs/getting-started.sgml: fixed errors with example setup docs + +2002-09-16 Monte Ohrt + + * plugins/block.textformat.php + docs/designers.sgml + NEWS: add textformat block function + +2002-09-10 Monte Ohrt + + * docs/designers.sgml: + add assign attribute to cycle function documentation + + * docs/designers.sgml + docs/programmers.sgml: fix typos + +2002-09-09 Monte Ohrt + + * plugins/function.debug.php + templates/header.tpl: + fix header in debug template, fix typo in header.tpl example + +2002-08-15 mohrt + + * docs/programmers.sgml: fix typos + +2002-08-08 mohrt + + * RELEASE_NOTES + Smarty.class.php: + supress warnings from unlink() and is_dir(), let error handler deal with it + +2002-08-07 mohrt + + * docs/appendixes.sgml + docs/designers.sgml + docs/programmers.sgml + Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php: update files with new version numbers + +2002-08-02 mohrt + + * NEWS: update NEWS file with credits + + * NEWS + Smarty.class.php: added assign_by_ref() and append_by_ref() functions + +2002-08-01 mohrt + + * TODO + NEWS + Smarty.class.php: + changed default warning type for plugin errors from E_USER_WARNING to E_USER_ERROR + +2002-07-29 mohrt + + * plugins/function.html_select_time.php + docs/designers.sgml + NEWS: added paramters to html_select_time plugin + +2002-07-25 Andrei Zmievski + + * TODO: *** empty log message *** + +2002-07-24 mohrt + + * QUICKSTART: update QUICKSTART guide + + * NEWS + debug.tpl + plugins/modifier.debug_print_var.php: + update debug console to show objects, fix warning in debug.tpl + +2002-07-23 mohrt + + * docs/programmers.sgml: fix load_filter examples + + * Config_File.class.php + NEWS: fix error when there are no sections in config file + +2002-07-19 mohrt + + * docs/getting-started.sgml: fix error in install guide + +2002-07-18 mohrt + + * Smarty_Compiler.class.php: + correct the expression match for smarty:nodefaults + +2002-07-17 mohrt + + * Smarty_Compiler.class.php: fix default modifier to work with config vars + + * Smarty_Compiler.class.php: got args to strstr backwards... + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + change default modifiers to array instead of string + + * Smarty_Compiler.class.php + docs/designers.sgml + Smarty.class.php: add default modifier logic, minor doc updates + + * NEWS + Smarty.class.php + plugins/function.popup_init.php: + make popup_init xhtml compliant, minor variable name changes for consistancy + +2002-07-16 mohrt + + * NEWS: update NEWS file + + * plugins/function.debug.php + Smarty.class.php + debug.tpl + NEWS: + fix problem with filenames on windows, add ability to supply expire time in seconds when clearing cache or compiled files + +2002-07-15 mohrt + + * Smarty.class.php: + fixed problem with insert tags when loading function from script attribute + and caching enabled (Monte) + +2002-07-14 mohrt + + * NEWS + Smarty.class.php: fix bug with debug_tpl file path for Windows + +2002-07-12 Monte Ohrt + + * Smarty.class.php: fix append function with array/string issue + +2002-07-11 Monte Ohrt + + * RELEASE_NOTES: update release notes + + * NEWS + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php + Config_File.class.php: update files to 2.2.0 tags, get ready for release + +2002-07-09 Monte Ohrt + + * NEWS + Smarty.class.php: make debug.tpl work with any delimiter + + * NEWS + Smarty.class.php: + change tests in append and assign to != '' instead of empty(), which is more accurate + +2002-07-08 Monte Ohrt + + * docs/designers.sgml: minor doc update + + * Smarty.class.php: + cast var as an array, simplify and get rid of PHP warning messages + +2002-07-03 Monte Ohrt + + * Smarty.class.php: one more N + + * Smarty.class.php: + prepend "N" to filenames to avoid possible OS issues with dir names starting with "-" + + * Smarty.class.php: only set $debug_tpl in constructor if empty + + * Smarty.class.php + docs/designers.sgml + docs/getting-started.sgml + docs/programmers.sgml: + make use_sub_dirs go back to crc32 for subdir separation + +2002-06-29 Monte Ohrt + + * plugins/function.eval.php: do nothing if $val is empty + + * TODO + plugins/function.eval.php + plugins/function.popup_init.php: + add zindex to popup init, fix error message for eval. + +2002-06-27 Monte Ohrt + + * Smarty.class.php: + only loop through relative paths for PHP include_path, remove $_relative variable + + * Smarty_Compiler.class.php: added {$smarty.version} variable + +2002-06-26 Monte Ohrt + + * docs/appendixes.sgml + docs/designers.sgml + docs/getting-started.sgml + docs/programmers.sgml + Smarty.class.php: + update plugin loading logic, look in SMARTY_DIR, then cwd. If all fail, then retry all with include_path + + * templates/header.tpl + Smarty.class.php: update get_include_path, get _path_array only once + + * Smarty.class.php: fix get_include_path function for windows + + * Smarty.class.php: update plugin search logic + + * Smarty.class.php: only search include_path if relative path + + * plugins/function.html_select_date.php + plugins/function.html_select_time.php + plugins/modifier.date_format.php + Smarty_Compiler.class.php + NEWS + Smarty.class.php: allow plugins_dir to be an array of directories + +2002-06-25 Monte Ohrt + + * docs/programmers.sgml + docs/getting-started.sgml: update installation docs + + * debug.tpl + docs/getting-started.sgml + templates/debug.tpl + NEWS + Smarty.class.php: move debug.tpl to SMARTY_DIR, add to constructor + +2002-06-24 Monte Ohrt + + * plugins/function.assign_debug_info.php + NEWS: fixed warning message in function.assign_debug_info + + * Smarty.class.php: update include_path fixes + + * NEWS: + fixed $template_dir, $compile_dir, $cache_dir, $config_dir to respect include_path + +2002-06-23 Monte Ohrt + + * plugins/shared.make_timestamp.php: + update timestamp plugin to work when passed a timestamp + +2002-06-19 Monte Ohrt + + * NEWS: update NEWS file + + * plugins/modifier.date_format.php + docs/designers.sgml: + update date_format, allow optional 2nd paramater as default date if passed date is empty. update docs. + + * plugins/modifier.date_format.php: + fix date_format modifier, return nothing if given empty string + +2002-06-18 Monte Ohrt + + * NEWS + plugins/function.cycle.php: + gave $reset a default value in cycle function + + * plugins/function.html_select_date.php + plugins/shared.make_timestamp.php + NEWS: + corrected warnings in html_select_time function, made make timestamp always return a timestamp + +2002-06-17 Monte Ohrt + + * Smarty.class.php: swapped around cache_id and compile_id order + +2002-06-14 Monte Ohrt + + * docs/programmers.sgml + plugins/function.popup_init.php + Smarty.class.php: + change directory delimiter to "^" for cache and compile files + +2002-06-13 Andrei Zmievski + + * TODO: done. + + * Smarty_Compiler.class.php: + Optimize the calculation of section 'total' property. + +2002-06-11 Monte Ohrt + + * NEWS + Smarty.class.php: + added support for subdir exclusion, deletion by full or partial cache_id and compile_id, change file format to urlencoded values instead of crc32 + +2002-06-07 Monte Ohrt + + * Smarty.class.php: fix bug with last_modified_check code + + * NEWS + Smarty.class.php: + updated $GLOBALS refererence for HTTP_IF_MODIFIED_SINCE + +2002-06-06 Monte Ohrt + + * docs/designers.sgml + overlib.js: + remove overlib.js file from distribution, update plugin and docs + +2002-06-05 Monte Ohrt + + * docs/designers.sgml + NEWS + Smarty.class.php: fix 304 Not Modified, don't send content + +2002-06-03 Monte Ohrt + + * plugins/function.cycle.php: update version number + + * plugins/function.cycle.php + NEWS: + fixed cycle function to respect delimiter setting after initial setting + + * Smarty.class.php + NEWS: + update $GLOBALS references to work properly with track_globals settings + + * plugins/function.math.php: fixed bug with call $assign + + * docs/appendixes.sgml + docs/designers.sgml + plugins/function.html_options.php + plugins/function.html_select_time.php + NEWS + Smarty.class.php + Smarty_Compiler.class.php: + optimized for loops with count() function calls + +2002-06-01 Andrei Zmievski + + * TODO: *** empty log message *** + +2002-05-21 Monte Ohrt + + * NEWS: update NEWS file + + * plugins/function.html_select_date.php + RESOURCES + docs/designers.sgml + Config_File.class.php: + update html_select_date with month_value_format attribute for controlling the format of the month values. + +2002-05-17 Andrei Zmievski + + * NEWS + Smarty_Compiler.class.php: + Made it possible to use simple variables inside [] for indexing. + +2002-05-16 Monte Ohrt + + * docs/designers.sgml + docs/getting-started.sgml + NEWS + Smarty.class.php + Smarty_Compiler.class.php + TESTIMONIALS: add "once" attribute to php_include, update docs + +2002-05-09 Andrei Zmievski + + * NEWS + TODO: *** empty log message *** + +2002-05-07 Monte Ohrt + + * plugins/function.cycle.php: remove \n from cycle function + + * docs/designers.sgml + plugins/function.cycle.php + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php + NEWS: + update cycle function to handle array as input, update files to 2.1.1 + +2002-05-06 Monte Ohrt + + * plugins/function.fetch.php: + update fetch function with more error checking + +2002-05-03 Monte Ohrt + + * docs/designers.sgml + plugins/function.counter.php: + update counter to use name instead of id (id still works though) + + * plugins/function.cycle.php + docs/designers.sgml: rename id to name for cycle function + + * plugins/function.cycle.php: + update cycle function to allow blank values parameter after initialized + + * plugins/function.cycle.php: fix syntax error + +2002-05-02 Monte Ohrt + + * plugins/function.cycle.php: ugh, another typo + + * plugins/function.cycle.php: update comments + + * docs/designers.sgml + plugins/function.cycle.php + NEWS: added function cycle + + * FAQ + Smarty.class.php: fix register_outputfilter function + +2002-05-01 Monte Ohrt + + * docs/designers.sgml + NEWS + Smarty.class.php: fixed bug with resource testing and include_path + +2002-04-30 Monte Ohrt + + * NEWS + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php: update files for 2.1.0 release + +2002-04-30 Andrei Zmievski + + * plugins/function.fetch.php + docs/programmers.sgml + Smarty.class.php: Fix. + +2002-04-29 Andrei Zmievski + + * docs/programmers.sgml + docs/designers.sgml: A whole bunch of docs. + +2002-04-26 Monte Ohrt + + * FAQ + QUICKSTART + docs/programmers.sgml: update FAQ, QUICKSTART, small doc syntax fix + +2002-04-24 Monte Ohrt + + * docs/programmers.sgml + templates/debug.tpl + Smarty.class.php: changed doc structure a bit + +2002-04-16 Andrei Zmievski + + * Smarty.class.php: Add register/unregister API for output filters. + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php + TODO: + Changed the way filters are loaded, which now has to be done explicitly, + either through load_filter() API or by filling in $autoload_filters variable. + Also renamed internal variable to avoid namespace pollution. + +2002-04-15 Andrei Zmievski + + * Smarty.class.php: + Fixed _get_php_resource() to take include_path into account. + +2002-04-15 Monte Ohrt + + * docs/designers.sgml: + update docs, get modifiers and functions into index for easy access + + * docs/programmers.sgml + NEWS + Smarty.class.php: update caching documentation + +2002-04-15 Andrei Zmievski + + * NEWS: *** empty log message *** + + * Smarty.class.php: Only turn down error notices if $debugging is false. + +2002-04-15 Monte Ohrt + + * NEWS: update NEWS file + + * plugins/function.html_select_date.php: + fixed logic so this works right when field_separator = "/" + + * plugins/function.html_select_date.php: + fix regular expression for matching date + +2002-04-13 Monte Ohrt + + * docs/designers.sgml: updated html_select_date docs to reflect changes + + * NEWS + plugins/function.html_select_date.php: + added YYYY-MM-DD support to html_select_date + +2002-04-12 Andrei Zmievski + + * TESTIMONIALS: New entry. + +2002-04-12 Monte Ohrt + + * plugins/modifier.strip_tags.php: back out changes to strip_tags + + * docs/programmers.sgml: update docs regarding cache_lifetime + + * plugins/modifier.strip_tags.php + Smarty.class.php: + update cache_lifetime logic: -1 = never expire, 0 = always expire + +2002-04-11 Andrei Zmievski + + * BUGS + FAQ + INSTALL + NEWS + Smarty.class.php + Smarty_Compiler.class.php + docs/getting-started.sgml: + Fixed directory separtor issue. Requiring PHP 4.0.6 now. + + * NEWS + Smarty_Compiler.class.php: + Added ability to use simple variables for array indices or object properties. + + * TESTIMONIALS: Another one. + + * TESTIMONIALS: Adding one from Mark P. + +2002-04-05 Andrei Zmievski + + * Smarty_Compiler.class.php + NEWS + Smarty.class.php: Make it possible to unregister pre/postfilter plugins. + +2002-04-05 Monte Ohrt + + * INSTALL: Remove addons file from INSTALL instructions + +2002-04-04 Monte Ohrt + + * docs/designers.sgml: update doc error + + * docs/designers.sgml + plugins/modifier.escape.php + NEWS + Smarty.class.php: added htmlall attribute to escape modifier + +2002-04-03 Andrei Zmievski + + * Smarty_Compiler.class.php: Fixed undefined offset warning in {if} tag. + + * Smarty.class.php + NEWS: Added template_exists() API. + + * Smarty.class.php + Smarty_Compiler.class.php + NEWS: + - Added $smarty.template variable. + - Fixed {include_php} tag when dynamic values were used for 'file' attribute. + + * Config_File.class.php: Separator setting fix. + +2002-03-28 Monte Ohrt + + * FAQ + README: add digest address + + * FAQ + README + Smarty.class.php: update mailing list addresses + +2002-03-28 Andrei Zmievski + + * NEWS: *** empty log message *** + + * plugins/function.html_select_date.php + plugins/function.html_select_time.php + plugins/modifier.date_format.php: + Fix for when plugins directory is not the default one. + +2002-03-28 Andrei Zmievski + + * NEWS: *** empty log message *** + + * plugins/function.html_select_date.php + plugins/function.html_select_time.php + plugins/modifier.date_format.php: + Fix for when plugins directory is not the default one. + +2002-03-27 Monte Ohrt + + * FAQ: update FAQ page + +2002-03-26 Andrei Zmievski + + * CREDITS + NEWS + Smarty.class.php + Smarty_Compiler.class.php + TODO: Block functions changes. + + * Config_File.class.php: *** empty log message *** + +2002-03-25 Andrei Zmievski + + * Smarty.class.php + Smarty_Compiler.class.php: Initial implementation of block functions. + +2002-03-22 Monte Ohrt + + * docs/designers.sgml: fix documentation error in capture + +2002-03-22 Andrei Zmievski + + * Smarty.class.php: *** empty log message *** + + * Smarty.class.php: Turn off notices. + +2002-03-21 Andrei Zmievski + + * Smarty_Compiler.class.php: Make _current_file available to prefilters. + + * NEWS + Smarty.class.php: + Made is possible to assign variables in pre/postfilters. + +2002-03-20 Andrei Zmievski + + * plugins/function.html_select_date.php: Fixed +/- functionality. + + * NEWS: *** empty log message *** + +2002-03-20 Monte Ohrt + + * Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php: update version numbers + + * plugins/function.html_select_date.php + plugins/function.html_select_time.php + plugins/modifier.date_format.php: + move .make_timestamp.php to shared.make_timestamp.php + + * NEWS + Smarty.class.php + docs/designers.sgml + plugins/function.fetch.php + plugins/function.html_select_date.php: + update file generation, replace crc32() '-' with 'N' + +2002-03-20 Andrei Zmievski + + * Smarty_Compiler.class.php: *** empty log message *** + +2002-03-19 Andrei Zmievski + + * NEWS: *** empty log message *** + + * Smarty.class.php + Smarty_Compiler.class.php: + Fix plugin behavior for inserts with script attribute. + + * NEWS: *** empty log message *** + + * Smarty_Compiler.class.php: Fix bug with $smarty.cookies. + + * TESTIMONIALS: *** empty log message *** + +2002-03-15 Monte Ohrt + + * NEWS + docs/designers.sgml: update Changelog + + * plugins/modifier.indent.php + plugins/modifier.wordwrap.php: add wordwrap and indent to repository + +2002-03-14 Monte Ohrt + + * Smarty.class.php: + remove show_info_include and show_info_header functions + +2002-03-13 Monte Ohrt + + * plugins/function.fetch.php: update fetch function + + * plugins/function.fetch.php: update fetch function with new parameters + +2002-03-12 Monte Ohrt + + * docs/designers.sgml: update doc tables + + * docs/designers.sgml: update docs columns + + * docs/getting-started.sgml + docs/appendixes.sgml: update docs + + * TESTIMONIALS + docs/appendixes.sgml: update syntax error in docs, add to testimonials + +2002-03-04 Monte Ohrt + + * FAQ + README: update FAQ, README with digest mode info + +2002-03-02 Monte Ohrt + + * QUICKSTART: update quickstart + + * Smarty.class.php: + change behavior so cache_lifetime = 0 never expires (instead of always regenerate) + +2002-03-01 Monte Ohrt + + * docs/designers.sgml: update doc example + +2002-03-01 Andrei Zmievski + + * CREDITS + RELEASE_NOTES + TODO + NEWS: *** empty log message *** + +2002-03-01 Monte Ohrt + + * docs/appendixes.sgml + docs/designers.sgml + docs/getting-started.sgml + docs/programmers.sgml: update document id tags + + * docs.sgml: remove docs.sgml + + * RESOURCES + Smarty.class.php: update resources + +2002-02-28 Andrei Zmievski + + * TESTIMONIALS + docs/appendixes.sgml + docs/designers.sgml + docs/programmers.sgml: *** empty log message *** + +2002-02-27 Andrei Zmievski + + * plugins/function.eval.php + docs/designers.sgml: *** empty log message *** + +2002-02-27 Monte Ohrt + + * plugins/function.eval.php: added eval function to plugin dir + +2002-02-27 Andrei Zmievski + + * NEWS: *** empty log message *** + +2002-02-27 Monte Ohrt + + * docs/designers.sgml: fix syntax error + + * docs/appendixes.sgml + docs/designers.sgml + docs/getting-started.sgml + docs/programmers.sgml: convert technical notes to docbook format + + * NEWS + docs/designers.sgml: added "eval" plugin docs + +2002-02-26 Andrei Zmievski + + * docs/programmers.sgml + docs/designers.sgml + docs/appendixes.sgml + docs/getting-started.sgml + docs/html-common.dsl + docs/.cvsignore: *** empty log message *** + + * docs/appendixes.sgml + docs/common.dsl + docs/designers.sgml + docs/getting-started.sgml + docs/html-common.dsl + docs/html.dsl + docs/manual.sgml + docs/preface.sgml + docs/programmers.sgml: Split up docs. + +2002-02-25 Andrei Zmievski + + * docs.sgml: *** empty log message *** + +2002-02-22 Monte Ohrt + + * docs.sgml: update docs + +2002-02-22 Andrei Zmievski + + * docs.sgml + AUTHORS + NEWS: *** empty log message *** + +2002-02-21 Monte Ohrt + + * Config_File.class.php + NEWS + Smarty.class.php + Smarty_Compiler.class.php + docs.sgml: update misc changes + +2002-02-21 Andrei Zmievski + + * docs.sgml: *** empty log message *** + +2002-02-20 Monte Ohrt + + * docs.sgml: misc updates + +2002-02-20 Andrei Zmievski + + * docs.sgml: *** empty log message *** + + * Smarty.class.php + plugins/function.assign.php + plugins/function.assign_debug_info.php + plugins/function.counter.php + plugins/function.fetch.php + plugins/function.math.php + plugins/function.popup.php + plugins/function.popup_init.php + plugins/modifier.escape.php: Fixup some naming. + +2002-02-20 Monte Ohrt + + * docs.sgml: update docs + +2002-02-20 Andrei Zmievski + + * docs.sgml: *** empty log message *** + +2002-02-20 Monte Ohrt + + * NEWS + docs.sgml + plugins/modifier.escape.php: + removed global vars from fetch function, added attrs to escape modifier + + * docs.sgml: add plugin chapter outline + +2002-02-19 Monte Ohrt + + * README + RELEASE_NOTES + RESOURCES + Smarty.class.php + docs.sgml + BUGS + FAQ + INSTALL + QUICKSTART: update docs + +2002-02-19 Andrei Zmievski + + * docs.sgml: Updated resources docs. + + * README: *** empty log message *** + + * docs.sgml: Updated description of {$smarty} variable. + + * BUGS + FAQ + INSTALL + QUICKSTART + RELEASE_NOTES + docs.sgml: Remove PEAR notes. + +2002-02-18 Andrei Zmievski + + * Config_File.class.php + NEWS: Removed dependency on PEAR. + +2002-02-18 Monte Ohrt + + * NEWS + docs.sgml + plugins/function.popup_init.php: add src attribute to popup_init + +2002-02-15 Andrei Zmievski + + * Smarty_Compiler.class.php + plugins/modifier.debug_print_var.php + NEWS + Smarty.class.php: Performance enhancements. + +2002-02-06 Andrei Zmievski + + * plugins/function.html_options.php: + Fix html_options output to be XHTML compatible. + +2002-02-05 Andrei Zmievski + + * Smarty.class.php + Smarty_Compiler.class.php: Fix up plugin inclusion. + + * Smarty.class.php + Smarty_Compiler.class.php + TODO + plugins/function.html_select_date.php + plugins/function.html_select_time.php + plugins/modifier.date_format.php: Fix plugin directory access. + +2002-02-04 Andrei Zmievski + + * .cvsignore + Smarty_Compiler.class.php: *** empty log message *** + +2002-01-31 Andrei Zmievski + + * NEWS: *** empty log message *** + + * Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php + TODO + plugins/function.assign.php + plugins/function.assign_debug_info.php + plugins/function.counter.php + plugins/function.fetch.php + plugins/function.html_options.php + plugins/function.html_select_date.php + plugins/function.html_select_time.php + plugins/function.math.php + plugins/function.popup.php + plugins/function.popup_init.php + plugins/modifier.capitalize.php + plugins/modifier.count_characters.php + plugins/modifier.count_paragraphs.php + plugins/modifier.count_sentences.php + plugins/modifier.count_words.php + plugins/modifier.date_format.php + plugins/modifier.debug_print_var.php + plugins/modifier.default.php + plugins/modifier.escape.php + plugins/modifier.lower.php + plugins/modifier.regex_replace.php + plugins/modifier.replace.php + plugins/modifier.spacify.php + plugins/modifier.string_format.php + plugins/modifier.strip_tags.php + plugins/modifier.truncate.php + plugins/modifier.upper.php + plugins/shared.make_timestamp.php + templates/index.tpl + AUTHORS + CREDITS + Config_File.class.php + README: Implemented plugin architecture. + + * NEWS: *** empty log message *** + +2002-01-30 Monte Ohrt + + * NEWS + Smarty.addons.php + Smarty.class.php + docs.sgml: added modifiers wordwrap and indent + +2002-01-28 Monte Ohrt + + * Smarty.class.php + docs.sgml: + add support for is-modified-since headers, adjust a doc example + +2002-01-24 Monte Ohrt + + * Smarty.class.php: cleanup formatting + + * NEWS + Smarty.class.php + docs.sgml: update ChangeLog, remove insert_tag_check parameter + +2002-01-24 Andrei Zmievski + + * plugins/standard.plugin.php: *** empty log message *** + +2002-01-24 Monte Ohrt + + * Smarty.class.php: fix syntax error + + * Smarty.class.php: removed unneccesary test from fetch() + +2002-01-23 Monte Ohrt + + * Smarty.addons.php: update overlib fixes + + * NEWS: update changelog + + * FAQ + NEWS + RESOURCES + Smarty.addons.php: updated overlib fixes + +2001-12-31 Andrei Zmievski + + * NEWS + Smarty.class.php: Fixed compile_id problem. + +2001-12-28 Monte Ohrt + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + fixed problem with using assigned var with include_php filepath + +2001-12-21 Monte Ohrt + + * RESOURCES: update RESOURCES + +2001-12-20 Monte Ohrt + + * FAQ + README: update FAQ + +2001-12-18 Monte Ohrt + + * Smarty_Compiler.class.php + docs.sgml + Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php: update version numbers + +2001-12-18 Andrei Zmievski + + * NEWS + Smarty.class.php: Fixed clear_cache(). + +2001-12-14 Monte Ohrt + + * NEWS + Smarty.addons.php: + fixed bug in smarty_make_timestamp introduced in PHP 4.1.0 + +2001-12-13 Monte Ohrt + + * NEWS + Smarty.class.php + docs.sgml: update default function args, fix cached insert debug timing + +2001-12-12 Monte Ohrt + + * docs.sgml: fix syntax error in documentation + + * Smarty.class.php: update default template handling functionality + +2001-12-11 Monte Ohrt + + * Smarty.class.php + Smarty_Compiler.class.php: update file fetching logic + +2001-12-11 Andrei Zmievski + + * NEWS + Smarty.class.php: Added 'script' attribute to {insert..}. + +2001-12-10 Monte Ohrt + + * NEWS + Smarty.class.php: added default template function handler + + * Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: update version numbers in files to 1.5.1 + +2001-12-10 Andrei Zmievski + + * NEWS + Smarty.class.php: Removed error message from the _read_file() method. + + * Smarty.class.php: Fix check for compile and cache IDs. + +2001-12-06 Monte Ohrt + + * QUICKSTART: fix spelling error in QUICKSTART + + * docs.sgml: fixed spelling errors in documenation + + * Smarty_Compiler.class.php + docs.sgml + Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php: commit 1.5.0 release + + * RESOURCES + docs.sgml: added RESOURCES file + +2001-12-05 Andrei Zmievski + + * Smarty_Compiler.class.php: Refactor. + +2001-12-05 Monte Ohrt + + * NEWS + Smarty_Compiler.class.php + docs.sgml: added assign to include and php_include + + * Smarty.class.php + Smarty_Compiler.class.php + docs.sgml: *** empty log message *** + +2001-12-04 Andrei Zmievski + + * NEWS + Smarty_Compiler.class.php: Formatting. + +2001-12-04 Monte Ohrt + + * Smarty_Compiler.class.php + NEWS + Smarty.class.php: update ChangeLog + +2001-12-04 Andrei Zmievski + + * NEWS + Smarty.class.php: Formatting. + +2001-12-04 Monte Ohrt + + * Smarty.class.php: removed SMARTY_DIR setting in constructor + + * Smarty.class.php: fix Smarty.class.php indention error + + * Smarty.class.php: update trusted logic + +2001-12-03 Monte Ohrt + + * Smarty.class.php: + fix up is_secure, is_trusted, make _parse_tpl_path function + + * Smarty.class.php: fix problem with testing SMARTY_DIR as empty + + * NEWS + docs.sgml: update documentation, change log + + * Smarty.class.php: + update constructor to check for SMARTY_DIR before assigning + +2001-12-03 Andrei Zmievski + + * NEWS + Smarty.class.php: *** empty log message *** + +2001-12-03 Monte Ohrt + + * FAQ + INSTALL + RELEASE_NOTES: update a few files + + * NEWS + QUICKSTART + Smarty.class.php + docs.sgml: added trusted_dir functionality, cleaned up secure_dir logic + +2001-12-03 Andrei Zmievski + + * NEWS: *** empty log message *** + + * NEWS + Smarty.class.php: - Introduced $compile_id class variable. + - Fixed a situation where if $cache_id and $compile_id were both null + they were passed to auto functions as empty string instead of null. + +2001-11-30 Monte Ohrt + + * NEWS + Smarty.class.php: + change variable names in fetch() fuction to smarty_* to avoid namespace conflicts + + * NEWS + Smarty.class.php: fixed bug in _rm_auto with catenated null values + +2001-11-29 Andrei Zmievski + + * NEWS + Smarty_Compiler.class.php: Added $smarty.section.* syntax. + + * Smarty_Compiler.class.php: Made 'name' attribute optional for {foreach}. + +2001-11-29 Monte Ohrt + + * Smarty.class.php + index.php: remove assign "now" in index.tpl + +2001-11-29 Andrei Zmievski + + * NEWS + Smarty.addons.php + Smarty.class.php: Fix formatting. + +2001-11-28 Monte Ohrt + + * NEWS + Smarty.class.php + docs.sgml: + removed return statements from _read_cache_file (how did they get in there?) + +2001-11-27 Monte Ohrt + + * docs.sgml + NEWS + Smarty.addons.php + Smarty.class.php: + fixed bugs and added assign attribute to several functions + +2001-11-27 Andrei Zmievski + + * NEWS: Some rewording. + + * Smarty_Compiler.class.php: Fix $smarty.capture access. + + * TODO: *** empty log message *** + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + Made {config_load ..} merge globals from each config file only once per scope. + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: - Added {foreach ...}. + - Made certain $smarty.* references handled at compilation time. + +2001-11-26 Monte Ohrt + + * Config_File.class.php + NEWS + Smarty.class.php + Smarty_Compiler.class.php + docs.sgml: commit cache handler functionality + +2001-11-20 Andrei Zmievski + + * NEWS + Smarty.addons.php + Smarty_Compiler.class.php: Various fixes and additions. + + * NEWS + index.php: *** empty log message *** + +2001-11-05 Monte Ohrt + + * Smarty.class.php: changed _read_file parameter from $end to $lines + + * NEWS + Smarty.class.php: fixed is_cache, make cache reading more efficient + +2001-11-02 Monte Ohrt + + * FAQ + NEWS: update FAQ with mailing list Reply-To header FAQ + + * NEWS + Smarty.class.php + index.php: supress fopen errors, return false if cache file won't load + +2001-11-01 Monte Ohrt + + * QUICKSTART + docs.sgml + index.php: update QUICKSTART guide with index key example + + * Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php + docs.sgml: commit all updates for 1.4.6 + +2001-11-01 Andrei Zmievski + + * NEWS: *** empty log message *** + +2001-10-30 Monte Ohrt + + * Smarty.addons.php: fix assign function problem with empty value passed + + * NEWS + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php + templates/debug.tpl: + fixed bug in assign function when passing an empty value + +2001-10-26 Monte Ohrt + + * Smarty.addons.php + Smarty.class.php + index.php: fix minor typo in debug code + +2001-10-26 Andrei Zmievski + + * Smarty.class.php: Typo. + +2001-10-26 Monte Ohrt + + * Smarty.addons.php: + update debug console output, handle html encoding correctly + +2001-10-26 Andrei Zmievski + + * Smarty.addons.php + templates/debug.tpl: Debug formatting. + + * Smarty.class.php: Disable rmdir warning. + +2001-10-26 Monte Ohrt + + * Smarty.addons.php + Smarty.class.php + templates/debug.tpl: update debugging to expand array variables + + * Smarty.class.php + docs.sgml: + update docs for fetching only timestamp with custom template source functions + + * Smarty.addons.php: fix debug console error + +2001-10-26 Andrei Zmievski + + * docs.sgml: Typos. + + * Smarty.addons.php: Cleanup whitespace. + + * Smarty_Compiler.class.php: Clean up whitespace. + + * Smarty.class.php: Cleaning up code, formatting mostly. + + * NEWS: *** empty log message *** + +2001-10-25 Monte Ohrt + + * NEWS + docs.sgml: update documentation to current version + + * NEWS + Smarty.addons.php: + updated fetch to give proper warning when fetching unreadable or nonexistant files + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + fixed problem with newline at the end of compiled templates + + * NEWS + Smarty.class.php: recompile cache if config file gets modified too. + + * NEWS + Smarty.class.php: + added feature to regenerate cache if compile_check is enabled and an + involved template is modified + +2001-10-23 Monte Ohrt + + * Smarty.class.php: fix indent for insert tags in debug console + + * templates/debug.tpl: update debug.tpl file format + + * NEWS + Smarty.addons.php + Smarty.class.php + templates/debug.tpl: + update execution time debugging, move into include list + +2001-10-10 Monte Ohrt + + * NEWS + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: + fixed up execution time output in debug console + +2001-10-09 Andrei Zmievski + + * Config_File.class.php + NEWS + Smarty.class.php + TODO: Added support for hidden config vars. + +2001-10-04 Monte Ohrt + + * NEWS + Smarty.addons.php + Smarty.class.php + templates/debug.tpl: added execution times to debug console + +2001-10-02 Andrei Zmievski + + * Smarty_Compiler.class.php: Add space. + +2001-10-01 Andrei Zmievski + + * Smarty.class.php: Fix reference to compile_id. + +2001-09-28 Andrei Zmievski + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: Added postfilter functions. + +2001-09-26 Andrei Zmievski + + * NEWS + Smarty.class.php + docs.sgml: Rename to clear_compiled_tpl(). + +2001-09-25 Andrei Zmievski + + * NEWS + Smarty_Compiler.class.php: + Fixed line number reporting when removing comments. + +2001-09-20 Monte Ohrt + + * NEWS + RELEASE_NOTES + Smarty.addons.php: made html_options output xhtml compatible + +2001-09-19 Monte Ohrt + + * Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php + templates/debug.tpl: updated version numbers + +2001-09-16 Monte Ohrt + + * FAQ + NEWS + docs.sgml: fix doc error with insert function + +2001-09-06 Andrei Zmievski + + * NEWS: *** empty log message *** + +2001-08-31 Monte Ohrt + + * NEWS: update ChangeLog + + * overlib.js + Smarty.addons.php + Smarty.class.php + docs.sgml: + update overlib to 3.50, adjust addon code so that the overlib.js file isn't modified + +2001-08-31 Andrei Zmievski + + * Smarty.class.php: - compile_id changes + + * NEWS + Smarty.addons.php: - compile_id support + - new options for html_select_date + +2001-08-23 Andrei Zmievski + + * TODO: *** empty log message *** + +2001-08-10 Andrei Zmievski + + * NEWS + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: + Modified to pass Smarty object as second parameter to insert functions. + Also moved _smarty_mod_handler() and _smarty_insert_handler() into the class. + + * NEWS + Smarty_Compiler.class.php: + Passing Smarty as second parameter to prefilter functions. + +2001-08-09 Andrei Zmievski + + * NEWS: *** empty log message *** + +2001-08-09 Monte Ohrt + + * templates/index.tpl + Smarty.class.php: add smarty.now variable to template + +2001-08-06 Monte Ohrt + + * templates/index.tpl: change config_load section back to setup + +2001-08-06 Andrei Zmievski + + * Smarty.addons.php: Optimize a bit. + +2001-08-04 Monte Ohrt + + * docs.sgml: update capture documentation + +2001-08-03 Monte Ohrt + + * FAQ + NEWS + Smarty.class.php: + fix bug with URL controlled debugging, works now (Monte) + +2001-08-01 Andrei Zmievski + + * Config_File.class.php: *** empty log message *** + + * Smarty_Compiler.class.php + Smarty.class.php: - Fixed some E_NOTICE stuff in compiler. + - Generalized assign_smarty_interface() a bit. + +2001-07-24 Andrei Zmievski + + * NEWS + Smarty_Compiler.class.php + TODO: See ChangeLog for details. + +2001-07-20 Andrei Zmievski + + * Config_File.class.php: Booleanize case-insensitively. + +2001-07-17 Monte Ohrt + + * NEWS: update ChangeLog + + * Smarty.class.php + docs.sgml: put SMARTY_DIR on Config_File require + +2001-07-11 Monte Ohrt + + * docs.sgml + FAQ + NEWS + Smarty.class.php: + updated security to not include insecure docs, only warning + +2001-07-10 Andrei Zmievski + + * Smarty.class.php: Adding 'sizeof' as an allowed {if} function. + +2001-07-06 Andrei Zmievski + + * NEWS: *** empty log message *** + +2001-07-06 Monte Ohrt + + * Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: update version number to 1.4.4 + + * NEWS + Smarty.addons.php + Smarty_Compiler.class.php + docs.sgml + templates/header.tpl + templates/index.tpl: update documenatation, template examples + +2001-07-03 Andrei Zmievski + + * NEWS + Smarty.class.php: Implemented access to request vars via $smarty var. + + * NEWS + Smarty_Compiler.class.php: + Fixed a bug with parsing function arguments in {if} tags. + +2001-06-30 Monte Ohrt + + * NEWS: update ChangeLog + +2001-06-29 Monte Ohrt + + * Smarty.addons.php + Smarty.class.php + docs.sgml + overlib.js: + moved overlib to separate file, added SMARTY_DIR, documented. added much documentation + +2001-06-29 Andrei Zmievski + + * NEWS + RELEASE_NOTES + TODO: *** empty log message *** + +2001-06-29 Monte Ohrt + + * NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + docs.sgml + index.php + templates/debug.tpl + templates/header.tpl + templates/index.tpl: update release notes + +2001-06-27 Andrei Zmievski + + * Smarty_Compiler.class.php: *** empty log message *** + + * NEWS + Smarty_Compiler.class.php: Implemented 'step' section attribute. + + * Smarty_Compiler.class.php: Negative values of 'max' will mean no max. + + * AUTHORS + NEWS: *** empty log message *** + +2001-06-26 Andrei Zmievski + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php + index.php: Added 'max' and 'start' section attributes. + Added 'total' and 'iteration' section properties. + +2001-06-25 Andrei Zmievski + + * Config_File.class.php + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: Update version numbers. + +2001-06-23 Andrei Zmievski + + * TODO: *** empty log message *** + +2001-06-21 Andrei Zmievski + + * Config_File.class.php + NEWS: Fixed booleanization bug. + +2001-06-20 Monte Ohrt + + * docs.sgml: + update documents to reflect changes to cached content & debugging + +2001-06-20 Andrei Zmievski + + * Smarty.addons.php + Smarty.class.php: Remove debug output for cached and fetched cases. + +2001-06-20 Monte Ohrt + + * Smarty.class.php: update include_info to false + + * Smarty.class.php + docs.sgml + index.php + templates/footer.tpl: + moved debug logic into Smarty completely, created flags for it + +2001-06-19 Andrei Zmievski + + * Smarty.addons.php + Smarty.class.php + templates/debug.tpl: *** empty log message *** + + * NEWS + Smarty.class.php: Remove unneeded debug functions. + +2001-06-19 Monte Ohrt + + * NEWS + Smarty.addons.php + Smarty.class.php + docs.sgml + templates/debug.tpl + templates/footer.tpl: commit updates, add debug template + +2001-06-19 Andrei Zmievski + + * Smarty.class.php + Smarty_Compiler.class.php + TODO: + Moved config loading code inside main class, the compiled template now + simply calls that method. + +2001-06-15 Andrei Zmievski + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php + templates/index.tpl: * moved config array into class itself + * added 'scope' attribute for config_load + + * Smarty_Compiler.class.php + Smarty.addons.php + Smarty.class.php: Finishing up secure mode. + +2001-06-15 Monte Ohrt + + * NEWS: update ChangeLog + + * Smarty_Compiler.class.php: cleaned up logic of if statement security + + * Smarty_Compiler.class.php: update if logic to cover more situations + + * Smarty_Compiler.class.php + docs.sgml: update if statement security feature + +2001-06-14 Andrei Zmievski + + * Smarty.addons.php + Smarty.class.php: *** empty log message *** + + * NEWS + Smarty_Compiler.class.php: + Fixed a bug with quoted strings inside if statements. + +2001-06-13 Monte Ohrt + + * Smarty.addons.php + Smarty.class.php: added secure_dir array for multiple secure directories + + * Smarty.addons.php: update fetch funtion to respect security setting + + * NEWS + Smarty.addons.php + Smarty.class.php + docs.sgml: update documentation, changelog + + * Smarty.addons.php + Smarty.class.php: moved _extract setting to assign functions + + * Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: + added assign/unassign custom functions, ability to re-extract tpl_vars + + * Smarty.class.php + Smarty_Compiler.class.php + docs.sgml + index.php: commit security features + +2001-06-11 Andrei Zmievski + + * Smarty.class.php: Version variable typo. + +2001-06-05 Andrei Zmievski + + * Smarty.class.php: + Create config object in fetch() or just set the config path if it already + exists. + +2001-06-04 Andrei Zmievski + + * Smarty.class.php: *** empty log message *** + + * NEWS + Smarty_Compiler.class.php: + Fixed a problem with $ inside strip tags. + +2001-05-31 Andrei Zmievski + + * NEWS: *** empty log message *** + + * Config_File.class.php: Allow empty config_path. + +2001-05-29 Monte Ohrt + + * Smarty_Compiler.class.php + docs.sgml + NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php: update version numbers + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php + docs.sgml: moved version variable to internal variable + +2001-05-22 Andrei Zmievski + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + Moved $_smarty_sections and $_smarty_conf_obj into Smarty class. + +2001-05-18 Monte Ohrt + + * NEWS: update ChangeLog + + * FAQ + QUICKSTART: update FAQ, QUICKSTART for windows include_path setup + + * configs/test.conf: added configs directory to cvs + +2001-05-18 Andrei Zmievski + + * Smarty.class.php: Use compiler_class for including the file. + +2001-05-18 Monte Ohrt + + * docs.sgml: fix typo + +2001-05-16 Monte Ohrt + + * README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: update files to version 1.4.1 + + * NEWS: update ChangeLog + +2001-05-15 Andrei Zmievski + + * NEWS: *** empty log message *** + + * index.php: forget that! + + * NEWS + Smarty_Compiler.class.php + index.php: Fixed a few E_NOTICE warnings. + +2001-05-09 Monte Ohrt + + * NEWS + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + docs.sgml: update dates versions + +2001-05-09 Andrei Zmievski + + * NEWS: *** empty log message *** + + * Smarty.class.php: + Use absolute paths when requiring/including Smart components. + + * NEWS: *** empty log message *** + + * Smarty.class.php: Use write mode instead of append. + +2001-05-02 Andrei Zmievski + + * NEWS + Smarty_Compiler.class.php: Fix indexing by section properties. + +2001-05-02 Monte Ohrt + + * NEWS: update changelog + + * Smarty.class.php: remove period from syntax error + +2001-05-02 Andrei Zmievski + + * Smarty_Compiler.class.php: Double-quote the attribute values by default. + +2001-04-30 Monte Ohrt + + * Smarty_Compiler.class.php + NEWS: added simple {capture} logic + +2001-04-30 Andrei Zmievski + + * TODO: *** empty log message *** + + * Smarty_Compiler.class.php + Smarty.class.php: Fix passing config vars to included files. + + * Smarty.class.php + Smarty_Compiler.class.php: Fix inclusion again. + +2001-04-30 Monte Ohrt + + * FAQ + RELEASE_NOTES + Smarty.class.php + misc/fix_vars.php + NEWS: update paths for windows (c:) + +2001-04-28 Andrei Zmievski + + * Smarty.class.php + Smarty_Compiler.class.php: Fix passing variables to included files. + + * templates/index.tpl: *** empty log message *** + +2001-04-27 Andrei Zmievski + + * Smarty_Compiler.class.php: Fix includes. + +2001-04-26 Andrei Zmievski + + * Smarty_Compiler.class.php + docs.sgml + Smarty.class.php: Formatting mostly. + + * Smarty_Compiler.class.php + Config_File.class.php: *** empty log message *** + +2001-04-26 Monte Ohrt + + * Smarty_Compiler.class.php + docs.sgml + FAQ + NEWS + QUICKSTART + RELEASE_NOTES + Smarty.class.php: update docs with new changes + +2001-04-26 Andrei Zmievski + + * RELEASE_NOTES: *** empty log message *** + + * docs.sgml + templates/index.tpl + NEWS + Smarty_Compiler.class.php: Added ability to reference object properties. + +2001-04-25 Andrei Zmievski + + * README + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php + docs.sgml + AUTHORS + Config_File.class.php + CREDITS + RELEASE_NOTES + NEWS: *** empty log message *** + + * docs.sgml: Docs on new parameter to custom functions. + + * NEWS: *** empty log message *** + + * Smarty_Compiler.class.php: + Changing the way tpl vars are referenced and passing smarty object + to custom functions. + + * RELEASE_NOTES + docs.sgml: Fixing docs a bit. + +2001-04-24 Andrei Zmievski + + * docs.sgml: Docs for $compiler_class and compiler functions. + + * templates/index.tpl: *** empty log message *** + + * Smarty_Compiler.class.php: Remove debugging. + +2001-04-24 Monte Ohrt + + * docs.sgml: update compiler function docs + +2001-04-24 Andrei Zmievski + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php + templates/index.tpl: Added compiler function support. + +2001-04-24 Monte Ohrt + + * RELEASE_NOTES + Smarty.class.php: + update notes, change show_info_header to false by default + + * Smarty.class.php + Smarty_Compiler.class.php + docs.sgml + CREDITS + FAQ + NEWS + README + RELEASE_NOTES: update documenation, bug fixes + +2001-04-24 Andrei Zmievski + + * misc/fix_vars.php: Hopefully fix for sure. + +2001-04-23 Monte Ohrt + + * misc/fix_vars.php: uncomment copy/unlink + +2001-04-23 Andrei Zmievski + + * misc/fix_vars.php: Do it more thoroughly. + + * misc/fix_vars.php: check for } + +2001-04-22 Andrei Zmievski + + * misc/fix_vars.php: Fix variable parsing. + +2001-04-20 Monte Ohrt + + * misc/fix_vars.php: fix problem with 4.0.5-dev and preg_replace_callback + +2001-04-19 Monte Ohrt + + * Smarty_Compiler.class.php + docs.sgml + misc/fix_vars.php + NEWS + RELEASE_NOTES + Smarty.class.php: update notes/documentation + + * NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php + docs.sgml: update files for 1.4.0 release + +2001-04-16 Andrei Zmievski + + * misc/fix_vars.php: Added fix_vars.php script. + +2001-04-16 Monte Ohrt + + * QUICKSTART + RELEASE_NOTES + docs.sgml + templates/index.tpl: + update RELEASE_NOTES & scripts with new section var syntax + +2001-04-13 Andrei Zmievski + + * Smarty_Compiler.class.php: * Implement new variable format parser. + * Optimizing config load a bit. + +2001-04-13 Monte Ohrt + + * FAQ + NEWS + RELEASE_NOTES + Smarty.class.php: + added $check_cached_insert_tags to speed up cached pages if + {insert ...} is not used (Monte) + +2001-04-12 Andrei Zmievski + + * NEWS + Smarty.class.php + RELEASE_NOTES: *** empty log message *** + + * Smarty_Compiler.class.php: Remove redundant functions. + + * Smarty.class.php: Formatting. + +2001-04-12 Monte Ohrt + + * Smarty.class.php: update file: parsing + + * Smarty.class.php + docs.sgml: update documentation + +2001-04-12 Andrei Zmievski + + * Smarty.class.php + Smarty_Compiler.class.php + TODO: *** empty log message *** + +2001-04-11 Monte Ohrt + + * FAQ + QUICKSTART + RELEASE_NOTES: added RELEASE_NOTES file to cvs + + * NEWS + docs.sgml: update ChangeLog, update documentation + + * Smarty.class.php + Smarty_Compiler.class.php + templates/index.tpl: + update Smarty to compile at run-time. added ability to get files from + absolute paths, added work around for LOCK_EX and windows, changed a few + file permissions to be more secure. + +2001-03-29 Monte Ohrt + + * NEWS + Smarty.addons.php: + allow arbitrary date strings instead of just timestamps + +2001-03-28 Monte Ohrt + + * Smarty.class.php + Smarty_Compiler.class.php + docs.sgml + FAQ + NEWS + README + Smarty.addons.php: + update version in class, update docs for count_ and new vars + + * templates/index.tpl + docs.sgml: update docs, example template + +2001-03-28 Andrei Zmievski + + * Smarty_Compiler.class.php: Some variable renaming. + +2001-03-23 Andrei Zmievski + + * Smarty_Compiler.class.php + NEWS: Fixed nested include infinite repeat bug. + +2001-03-23 Monte Ohrt + + * Smarty.class.php: fix version number + + * Smarty.class.php + NEWS: added optional HTML header to output + +2001-03-22 Andrei Zmievski + + * Smarty_Compiler.class.php: Fixed inclusion of dynamic files. + +2001-03-16 Andrei Zmievski + + * Smarty_Compiler.class.php: Fixing the config_load scoping. + + * Smarty_Compiler.class.php: making config variables global for now. + +2001-03-15 Andrei Zmievski + + * NEWS: *** empty log message *** + + * Smarty_Compiler.class.php: + * Includes are now always done via generated function call to protect + namespace. + * config_load now always uses global config object to improve + performance. + +2001-03-13 Monte Ohrt + + * docs.sgml: update math documentation with format attribute + +2001-03-11 Monte Ohrt + + * docs.sgml + NEWS + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: update math function with format attribute + +2001-03-10 Andrei Zmievski + + * Smarty.addons.php: *** empty log message *** + + * NEWS + Smarty.addons.php + Smarty.class.php: Added html_select_time custom function. + +2001-03-08 Monte Ohrt + + * Smarty.class.php + Smarty_Compiler.class.php + NEWS + README + Smarty.addons.php: rename 1.3.1b to 1.3.1pl1 + + * NEWS + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: update version numbers, changelog + + * Smarty.class.php + Smarty_Compiler.class.php: + moved _syntax_error to Smarty_Compiler.class.php + + * Smarty.class.php + docs.sgml: + missing _syntax_error function recovered. fixed minor syntax in docs + +2001-03-07 Monte Ohrt + + * QUICKSTART + README + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php + BUGS + INSTALL + NEWS: update everything to 1.3.1 + +2001-03-03 Monte Ohrt + + * Smarty_Compiler.class.php + Smarty.class.php: fixed bug with cached insert tags + +2001-03-02 Monte Ohrt + + * Smarty.class.php + Smarty_Compiler.class.php: + fix cache fuctions with separated compiled class + + * FAQ + NEWS + docs.sgml: update changelog + +2001-03-02 Andrei Zmievski + + * NEWS + Smarty_Compiler.class.php: Added 'first' and 'last' section properties. + +2001-03-02 Monte Ohrt + + * TODO: remove compiling separation TODO + + * Smarty_Compiler.class.php + Smarty.addons.php + Smarty.class.php: update function headers + + * templates/index.tpl + NEWS + Smarty.class.php + Smarty_Compiler.class.php + index.php: split out compiling code for faster execution + + * Smarty.class.php: fixed a few warning messages + + * Smarty.addons.php + Smarty.class.php + docs.sgml + NEWS: added fetch, unregister mod/fun, updated docs + +2001-03-01 Monte Ohrt + + * Smarty.addons.php: added "int" to available list + + * docs.sgml + FAQ + Smarty.class.php: update FAQ, add math functions & update documetation + + * index.php + Smarty.addons.php + Smarty.class.php + docs.sgml: fixed literal tags and other optional delimiters + +2001-02-26 Andrei Zmievski + + * NEWS + Smarty.class.php: + Added index_prev, index_next section properties and ability to + index by them. + + * NEWS + Smarty.addons.php + Smarty.class.php: Reverting the plugins patch - needs more thought. + + * Smarty.class.php: Fixing plugin loading. + +2001-02-23 Andrei Zmievski + + * Smarty.addons.php + Smarty.class.php + plugins/standard.plugin.php + NEWS: Added plugin functionality. + +2001-02-22 Monte Ohrt + + * docs.sgml + templates/index.tpl + NEWS + README + Smarty.class.php: fixed issue with php tags executed in literal blocks + +2001-02-21 Monte Ohrt + + * NEWS: update changelog for LGPL change + + * Smarty.class.php + docs.sgml + README + Smarty.addons.php: updated version numbers to 1.3.0 + + * NEWS + templates/index.tpl: update changelog, rearrange index.tpl file + +2001-02-21 Andrei Zmievski + + * NEWS + Smarty.class.php: *** empty log message *** + +2001-02-21 Monte Ohrt + + * docs.sgml: update parameters for is_cached and fetch + +2001-02-21 Andrei Zmievski + + * NEWS + Smarty.class.php: *** empty log message *** + +2001-02-21 Monte Ohrt + + * NEWS + Smarty.addons.php + docs.sgml: update docs, remove header function from addons + +2001-02-20 Monte Ohrt + + * FAQ + NEWS: update changelog + + * TODO: update todo + + * TODO: update todo list + + * Smarty.class.php: update php tag handling logic + +2001-02-19 Monte Ohrt + + * index.php + Config_File.class.php + FAQ + Smarty.class.php + docs.sgml: fixed + + * Smarty.addons.php: *** empty log message *** + +2001-02-13 Andrei Zmievski + + * TODO: *** empty log message *** + +2001-02-12 Andrei Zmievski + + * templates/index.tpl + Smarty.class.php: *** empty log message *** + +2001-02-10 Monte Ohrt + + * Smarty.class.php: remove unneeded preg_match + + * Smarty.class.php: remove comment + + * Smarty.class.php: updated php escape to handle +{/if} diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.assemble_plugin_filepath.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.assemble_plugin_filepath.php new file mode 100644 index 000000000..690d3ddbc --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.assemble_plugin_filepath.php @@ -0,0 +1,67 @@ +plugins_dir as $_plugin_dir) { + + $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename; + + // see if path is relative + if (!preg_match("/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/", $_plugin_dir)) { + $_relative_paths[] = $_plugin_dir; + // relative path, see if it is in the SMARTY_DIR + if (@is_readable(SMARTY_DIR . $_plugin_filepath)) { + $_return = SMARTY_DIR . $_plugin_filepath; + break; + } + } + // try relative to cwd (or absolute) + if (@is_readable($_plugin_filepath)) { + $_return = $_plugin_filepath; + break; + } + } + + if($_return === false) { + // still not found, try PHP include_path + if(isset($_relative_paths)) { + foreach ((array)$_relative_paths as $_plugin_dir) { + + $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename; + + $_params = array('file_path' => $_plugin_filepath); + require_once(SMARTY_CORE_DIR . 'core.get_include_path.php'); + if(smarty_core_get_include_path($_params, $smarty)) { + $_return = $_params['new_file_path']; + break; + } + } + } + } + $_filepaths_cache[$_plugin_filename] = $_return; + return $_return; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.assign_smarty_interface.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.assign_smarty_interface.php new file mode 100644 index 000000000..7e65a73ec --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.assign_smarty_interface.php @@ -0,0 +1,43 @@ + + * Name: assign_smarty_interface
+ * Purpose: assign the $smarty interface variable + * @param array Format: null + * @param Smarty + */ +function smarty_core_assign_smarty_interface($params, &$smarty) +{ + if (isset($smarty->_smarty_vars) && isset($smarty->_smarty_vars['request'])) { + return; + } + + $_globals_map = array('g' => 'HTTP_GET_VARS', + 'p' => 'HTTP_POST_VARS', + 'c' => 'HTTP_COOKIE_VARS', + 's' => 'HTTP_SERVER_VARS', + 'e' => 'HTTP_ENV_VARS'); + + $_smarty_vars_request = array(); + + foreach (preg_split('!!', strtolower($smarty->request_vars_order)) as $_c) { + if (isset($_globals_map[$_c])) { + $_smarty_vars_request = array_merge($_smarty_vars_request, $GLOBALS[$_globals_map[$_c]]); + } + } + $_smarty_vars_request = @array_merge($_smarty_vars_request, $GLOBALS['HTTP_SESSION_VARS']); + + $smarty->_smarty_vars['request'] = $_smarty_vars_request; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.create_dir_structure.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.create_dir_structure.php new file mode 100644 index 000000000..999cf5930 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.create_dir_structure.php @@ -0,0 +1,79 @@ +_dir_perms) && !is_dir($_new_dir)) { + $smarty->trigger_error("problem creating directory '" . $_new_dir . "'"); + return false; + } + $_new_dir .= '/'; + } + } +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.display_debug_console.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.display_debug_console.php new file mode 100644 index 000000000..a5d72913c --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.display_debug_console.php @@ -0,0 +1,61 @@ + + * Name: display_debug_console
+ * Purpose: display the javascript debug console window + * @param array Format: null + * @param Smarty + */ +function smarty_core_display_debug_console($params, &$smarty) +{ + // we must force compile the debug template in case the environment + // changed between separate applications. + + if(empty($smarty->debug_tpl)) { + // set path to debug template from SMARTY_DIR + $smarty->debug_tpl = SMARTY_DIR . 'debug.tpl'; + if($smarty->security && is_file($smarty->debug_tpl)) { + $smarty->secure_dir[] = dirname(realpath($smarty->debug_tpl)); + } + $smarty->debug_tpl = 'file:' . SMARTY_DIR . 'debug.tpl'; + } + + $_ldelim_orig = $smarty->left_delimiter; + $_rdelim_orig = $smarty->right_delimiter; + + $smarty->left_delimiter = '{'; + $smarty->right_delimiter = '}'; + + $_compile_id_orig = $smarty->_compile_id; + $smarty->_compile_id = null; + + $_compile_path = $smarty->_get_compile_path($smarty->debug_tpl); + if ($smarty->_compile_resource($smarty->debug_tpl, $_compile_path)) + { + ob_start(); + $smarty->_include($_compile_path); + $_results = ob_get_contents(); + ob_end_clean(); + } else { + $_results = ''; + } + + $smarty->_compile_id = $_compile_id_orig; + + $smarty->left_delimiter = $_ldelim_orig; + $smarty->right_delimiter = $_rdelim_orig; + + return $_results; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.get_include_path.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.get_include_path.php new file mode 100644 index 000000000..43432412b --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.get_include_path.php @@ -0,0 +1,44 @@ + diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.get_microtime.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.get_microtime.php new file mode 100644 index 000000000..f1a28e042 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.get_microtime.php @@ -0,0 +1,23 @@ + diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.get_php_resource.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.get_php_resource.php new file mode 100644 index 000000000..786d4e78e --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.get_php_resource.php @@ -0,0 +1,80 @@ +trusted_dir; + $smarty->_parse_resource_name($params, $smarty); + + /* + * Find out if the resource exists. + */ + + if ($params['resource_type'] == 'file') { + $_readable = false; + if(file_exists($params['resource_name']) && is_readable($params['resource_name'])) { + $_readable = true; + } else { + // test for file in include_path + $_params = array('file_path' => $params['resource_name']); + require_once(SMARTY_CORE_DIR . 'core.get_include_path.php'); + if(smarty_core_get_include_path($_params, $smarty)) { + $_include_path = $_params['new_file_path']; + $_readable = true; + } + } + } else if ($params['resource_type'] != 'file') { + $_template_source = null; + $_readable = is_callable($smarty->_plugins['resource'][$params['resource_type']][0][0]) + && call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][0], + array($params['resource_name'], &$_template_source, &$smarty)); + } + + /* + * Set the error function, depending on which class calls us. + */ + if (method_exists($smarty, '_syntax_error')) { + $_error_funcc = '_syntax_error'; + } else { + $_error_funcc = 'trigger_error'; + } + + if ($_readable) { + if ($smarty->security) { + require_once(SMARTY_CORE_DIR . 'core.is_trusted.php'); + if (!smarty_core_is_trusted($params, $smarty)) { + $smarty->$_error_funcc('(secure mode) ' . $params['resource_type'] . ':' . $params['resource_name'] . ' is not trusted'); + return false; + } + } + } else { + $smarty->$_error_funcc($params['resource_type'] . ':' . $params['resource_name'] . ' is not readable'); + return false; + } + + if ($params['resource_type'] == 'file') { + $params['php_resource'] = $params['resource_name']; + } else { + $params['php_resource'] = $_template_source; + } + return true; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.is_secure.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.is_secure.php new file mode 100644 index 000000000..342f3aff8 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.is_secure.php @@ -0,0 +1,56 @@ +security || $smarty->security_settings['INCLUDE_ANY']) { + return true; + } + + if ($params['resource_type'] == 'file') { + $_rp = realpath($params['resource_name']); + if (isset($params['resource_base_path'])) { + foreach ((array)$params['resource_base_path'] as $curr_dir) { + if ( ($_cd = realpath($curr_dir)) !== false && + strncmp($_rp, $_cd, strlen($_cd)) == 0 && + $_rp{strlen($_cd)} == DIRECTORY_SEPARATOR ) { + return true; + } + } + } + if (!empty($smarty->secure_dir)) { + foreach ((array)$smarty->secure_dir as $curr_dir) { + if ( ($_cd = realpath($curr_dir)) !== false && + strncmp($_rp, $_cd, strlen($_cd)) == 0 && + $_rp{strlen($_cd)} == DIRECTORY_SEPARATOR ) { + return true; + } + } + } + } else { + // resource is not on local file system + return call_user_func_array( + $smarty->_plugins['resource'][$params['resource_type']][0][2], + array($params['resource_name'], &$smarty)); + } + + return false; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.is_trusted.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.is_trusted.php new file mode 100644 index 000000000..f0bd2fb8c --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.is_trusted.php @@ -0,0 +1,47 @@ +trusted_dir)) { + $_rp = realpath($params['resource_name']); + foreach ((array)$smarty->trusted_dir as $curr_dir) { + if (!empty($curr_dir) && is_readable ($curr_dir)) { + $_cd = realpath($curr_dir); + if (strncmp($_rp, $_cd, strlen($_cd)) == 0 + && $_rp{strlen($_cd)} == DIRECTORY_SEPARATOR ) { + $_smarty_trusted = true; + break; + } + } + } + } + + } else { + // resource is not on local file system + $_smarty_trusted = call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][3], + array($params['resource_name'], $smarty)); + } + + return $_smarty_trusted; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.load_plugins.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.load_plugins.php new file mode 100644 index 000000000..6db1dc51d --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.load_plugins.php @@ -0,0 +1,125 @@ +_plugins[$_type][$_name]; + + /* + * We do not load plugin more than once for each instance of Smarty. + * The following code checks for that. The plugin can also be + * registered dynamically at runtime, in which case template file + * and line number will be unknown, so we fill them in. + * + * The final element of the info array is a flag that indicates + * whether the dynamically registered plugin function has been + * checked for existence yet or not. + */ + if (isset($_plugin)) { + if (empty($_plugin[3])) { + if (!is_callable($_plugin[0])) { + $smarty->_trigger_fatal_error("[plugin] $_type '$_name' is not implemented", $_tpl_file, $_tpl_line, __FILE__, __LINE__); + } else { + $_plugin[1] = $_tpl_file; + $_plugin[2] = $_tpl_line; + $_plugin[3] = true; + if (!isset($_plugin[4])) $_plugin[4] = true; /* cacheable */ + } + } + continue; + } else if ($_type == 'insert') { + /* + * For backwards compatibility, we check for insert functions in + * the symbol table before trying to load them as a plugin. + */ + $_plugin_func = 'insert_' . $_name; + if (function_exists($_plugin_func)) { + $_plugin = array($_plugin_func, $_tpl_file, $_tpl_line, true, false); + continue; + } + } + + $_plugin_file = $smarty->_get_plugin_filepath($_type, $_name); + + if (! $_found = ($_plugin_file != false)) { + $_message = "could not load plugin file '$_type.$_name.php'\n"; + } + + /* + * If plugin file is found, it -must- provide the properly named + * plugin function. In case it doesn't, simply output the error and + * do not fall back on any other method. + */ + if ($_found) { + include_once $_plugin_file; + + $_plugin_func = 'smarty_' . $_type . '_' . $_name; + if (!function_exists($_plugin_func)) { + $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", $_tpl_file, $_tpl_line, __FILE__, __LINE__); + continue; + } + } + /* + * In case of insert plugins, their code may be loaded later via + * 'script' attribute. + */ + else if ($_type == 'insert' && $_delayed_loading) { + $_plugin_func = 'smarty_' . $_type . '_' . $_name; + $_found = true; + } + + /* + * Plugin specific processing and error checking. + */ + if (!$_found) { + if ($_type == 'modifier') { + /* + * In case modifier falls back on using PHP functions + * directly, we only allow those specified in the security + * context. + */ + if ($smarty->security && !in_array($_name, $smarty->security_settings['MODIFIER_FUNCS'])) { + $_message = "(secure mode) modifier '$_name' is not allowed"; + } else { + if (!function_exists($_name)) { + $_message = "modifier '$_name' is not implemented"; + } else { + $_plugin_func = $_name; + $_found = true; + } + } + } else if ($_type == 'function') { + /* + * This is a catch-all situation. + */ + $_message = "unknown tag - '$_name'"; + } + } + + if ($_found) { + $smarty->_plugins[$_type][$_name] = array($_plugin_func, $_tpl_file, $_tpl_line, true, true); + } else { + // output error + $smarty->_trigger_fatal_error('[plugin] ' . $_message, $_tpl_file, $_tpl_line, __FILE__, __LINE__); + } + } +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.load_resource_plugin.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.load_resource_plugin.php new file mode 100644 index 000000000..a7d37d1af --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.load_resource_plugin.php @@ -0,0 +1,74 @@ +_plugins['resource'][$params['type']]; + if (isset($_plugin)) { + if (!$_plugin[1] && count($_plugin[0])) { + $_plugin[1] = true; + foreach ($_plugin[0] as $_plugin_func) { + if (!is_callable($_plugin_func)) { + $_plugin[1] = false; + break; + } + } + } + + if (!$_plugin[1]) { + $smarty->_trigger_fatal_error("[plugin] resource '" . $params['type'] . "' is not implemented", null, null, __FILE__, __LINE__); + } + + return; + } + + $_plugin_file = $smarty->_get_plugin_filepath('resource', $params['type']); + $_found = ($_plugin_file != false); + + if ($_found) { /* + * If the plugin file is found, it -must- provide the properly named + * plugin functions. + */ + include_once($_plugin_file); + + /* + * Locate functions that we require the plugin to provide. + */ + $_resource_ops = array('source', 'timestamp', 'secure', 'trusted'); + $_resource_funcs = array(); + foreach ($_resource_ops as $_op) { + $_plugin_func = 'smarty_resource_' . $params['type'] . '_' . $_op; + if (!function_exists($_plugin_func)) { + $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", null, null, __FILE__, __LINE__); + return; + } else { + $_resource_funcs[] = $_plugin_func; + } + } + + $smarty->_plugins['resource'][$params['type']] = array($_resource_funcs, true); + } +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.process_cached_inserts.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.process_cached_inserts.php new file mode 100644 index 000000000..29cb007eb --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.process_cached_inserts.php @@ -0,0 +1,71 @@ +_smarty_md5.'{insert_cache (.*)}'.$smarty->_smarty_md5.'!Uis', + $params['results'], $match); + list($cached_inserts, $insert_args) = $match; + + for ($i = 0, $for_max = count($cached_inserts); $i < $for_max; $i++) { + if ($smarty->debugging) { + $_params = array(); + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); + $debug_start_time = smarty_core_get_microtime($_params, $smarty); + } + + $args = unserialize($insert_args[$i]); + $name = $args['name']; + + if (isset($args['script'])) { + $_params = array('resource_name' => $smarty->_dequote($args['script'])); + require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php'); + if(!smarty_core_get_php_resource($_params, $smarty)) { + return false; + } + $resource_type = $_params['resource_type']; + $php_resource = $_params['php_resource']; + + + if ($resource_type == 'file') { + $smarty->_include($php_resource, true); + } else { + $smarty->_eval($php_resource); + } + } + + $function_name = $smarty->_plugins['insert'][$name][0]; + if (empty($args['assign'])) { + $replace = $function_name($args, $smarty); + } else { + $smarty->assign($args['assign'], $function_name($args, $smarty)); + $replace = ''; + } + + $params['results'] = str_replace($cached_inserts[$i], $replace, $params['results']); + if ($smarty->debugging) { + $_params = array(); + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); + $smarty->_smarty_debug_info[] = array('type' => 'insert', + 'filename' => 'insert_'.$name, + 'depth' => $smarty->_inclusion_depth, + 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $debug_start_time); + } + } + + return $params['results']; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.process_compiled_include.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.process_compiled_include.php new file mode 100644 index 000000000..3e1d4c15a --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.process_compiled_include.php @@ -0,0 +1,32 @@ +_cache_including; + $smarty->_cache_including = true; + + $_return = $params['results']; + foreach ($smarty->_cache_serials as $_include_file_path=>$_cache_serial) { + $_return = preg_replace_callback('!(\{nocache\:('.$_cache_serial.')#(\d+)\})!s', + array(&$smarty, '_process_compiled_include_callback'), + $_return); + } + $smarty->_cache_including = $_cache_including; + return $_return; +} + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.read_cache_file.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.read_cache_file.php new file mode 100644 index 000000000..2ab428111 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.read_cache_file.php @@ -0,0 +1,111 @@ +force_compile) { + // force compile enabled, always regenerate + return false; + } + + if (isset($content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']])) { + list($params['results'], $smarty->_cache_info) = $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']]; + return true; + } + + if (!empty($smarty->cache_handler_func)) { + // use cache_handler function + call_user_func_array($smarty->cache_handler_func, + array('read', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], null)); + } else { + // use local cache file + $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']); + $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id); + $params['results'] = $smarty->_read_file($_cache_file); + } + + if (empty($params['results'])) { + // nothing to parse (error?), regenerate cache + return false; + } + + $cache_split = explode("\n", $params['results'], 2); + $cache_header = $cache_split[0]; + + $_cache_info = unserialize($cache_header); + + if ($smarty->caching == 2 && isset ($_cache_info['expires'])){ + // caching by expiration time + if ($_cache_info['expires'] > -1 && (time() > $_cache_info['expires'])) { + // cache expired, regenerate + return false; + } + } else { + // caching by lifetime + if ($smarty->cache_lifetime > -1 && (time() - $_cache_info['timestamp'] > $smarty->cache_lifetime)) { + // cache expired, regenerate + return false; + } + } + + if ($smarty->compile_check) { + $_params = array('get_source' => false, 'quiet'=>true); + foreach (array_keys($_cache_info['template']) as $_template_dep) { + $_params['resource_name'] = $_template_dep; + if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) { + // template file has changed, regenerate cache + return false; + } + } + + if (isset($_cache_info['config'])) { + $_params = array('resource_base_path' => $smarty->config_dir, 'get_source' => false, 'quiet'=>true); + foreach (array_keys($_cache_info['config']) as $_config_dep) { + $_params['resource_name'] = $_config_dep; + if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) { + // config file has changed, regenerate cache + return false; + } + } + } + } + + foreach ($_cache_info['cache_serials'] as $_include_file_path=>$_cache_serial) { + if (empty($smarty->_cache_serials[$_include_file_path])) { + $smarty->_include($_include_file_path, true); + } + + if ($smarty->_cache_serials[$_include_file_path] != $_cache_serial) { + /* regenerate */ + return false; + } + } + $params['results'] = $cache_split[1]; + $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']] = array($params['results'], $_cache_info); + + $smarty->_cache_info = $_cache_info; + return true; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.rm_auto.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.rm_auto.php new file mode 100644 index 000000000..b251f6491 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.rm_auto.php @@ -0,0 +1,71 @@ + $params['auto_base'], + 'level' => 0, + 'exp_time' => $params['exp_time'] + ); + require_once(SMARTY_CORE_DIR . 'core.rmdir.php'); + $_res = smarty_core_rmdir($_params, $smarty); + } else { + $_tname = $smarty->_get_auto_filename($params['auto_base'], $params['auto_source'], $params['auto_id']); + + if(isset($params['auto_source'])) { + if (isset($params['extensions'])) { + $_res = false; + foreach ((array)$params['extensions'] as $_extension) + $_res |= $smarty->_unlink($_tname.$_extension, $params['exp_time']); + } else { + $_res = $smarty->_unlink($_tname, $params['exp_time']); + } + } elseif ($smarty->use_sub_dirs) { + $_params = array( + 'dirname' => $_tname, + 'level' => 1, + 'exp_time' => $params['exp_time'] + ); + require_once(SMARTY_CORE_DIR . 'core.rmdir.php'); + $_res = smarty_core_rmdir($_params, $smarty); + } else { + // remove matching file names + $_handle = opendir($params['auto_base']); + $_res = true; + while (false !== ($_filename = readdir($_handle))) { + if($_filename == '.' || $_filename == '..') { + continue; + } elseif (substr($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, 0, strlen($_tname)) == $_tname) { + $_res &= (bool)$smarty->_unlink($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, $params['exp_time']); + } + } + } + } + + return $_res; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.rmdir.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.rmdir.php new file mode 100644 index 000000000..4fdbccc95 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.rmdir.php @@ -0,0 +1,55 @@ + keep root) + * WARNING: no tests, it will try to remove what you tell it! + * + * @param string $dirname + * @param integer $level + * @param integer $exp_time + * @return boolean + */ + +// $dirname, $level = 1, $exp_time = null + +function smarty_core_rmdir($params, &$smarty) +{ + if(!isset($params['level'])) { $params['level'] = 1; } + if(!isset($params['exp_time'])) { $params['exp_time'] = null; } + + if($_handle = @opendir($params['dirname'])) { + + while (false !== ($_entry = readdir($_handle))) { + if ($_entry != '.' && $_entry != '..') { + if (@is_dir($params['dirname'] . DIRECTORY_SEPARATOR . $_entry)) { + $_params = array( + 'dirname' => $params['dirname'] . DIRECTORY_SEPARATOR . $_entry, + 'level' => $params['level'] + 1, + 'exp_time' => $params['exp_time'] + ); + require_once(SMARTY_CORE_DIR . 'core.rmdir.php'); + smarty_core_rmdir($_params, $smarty); + } + else { + $smarty->_unlink($params['dirname'] . DIRECTORY_SEPARATOR . $_entry, $params['exp_time']); + } + } + } + closedir($_handle); + } + + if ($params['level']) { + return @rmdir($params['dirname']); + } + return (bool)$_handle; + +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.run_insert_handler.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.run_insert_handler.php new file mode 100644 index 000000000..71c384508 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.run_insert_handler.php @@ -0,0 +1,71 @@ +debugging) { + $_params = array(); + $_debug_start_time = smarty_core_get_microtime($_params, $smarty); + } + + if ($smarty->caching) { + $_arg_string = serialize($params['args']); + $_name = $params['args']['name']; + if (!isset($smarty->_cache_info['insert_tags'][$_name])) { + $smarty->_cache_info['insert_tags'][$_name] = array('insert', + $_name, + $smarty->_plugins['insert'][$_name][1], + $smarty->_plugins['insert'][$_name][2], + !empty($params['args']['script']) ? true : false); + } + return $smarty->_smarty_md5."{insert_cache $_arg_string}".$smarty->_smarty_md5; + } else { + if (isset($params['args']['script'])) { + $_params = array('resource_name' => $smarty->_dequote($params['args']['script'])); + require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php'); + if(!smarty_core_get_php_resource($_params, $smarty)) { + return false; + } + + if ($_params['resource_type'] == 'file') { + $smarty->_include($_params['php_resource'], true); + } else { + $smarty->_eval($_params['php_resource']); + } + unset($params['args']['script']); + } + + $_funcname = $smarty->_plugins['insert'][$params['args']['name']][0]; + $_content = $_funcname($params['args'], $smarty); + if ($smarty->debugging) { + $_params = array(); + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); + $smarty->_smarty_debug_info[] = array('type' => 'insert', + 'filename' => 'insert_'.$params['args']['name'], + 'depth' => $smarty->_inclusion_depth, + 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time); + } + + if (!empty($params['args']["assign"])) { + $smarty->assign($params['args']["assign"], $_content); + } else { + return $_content; + } + } +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.smarty_include_php.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.smarty_include_php.php new file mode 100644 index 000000000..30c6e7654 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.smarty_include_php.php @@ -0,0 +1,50 @@ + $params['smarty_file']); + require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php'); + smarty_core_get_php_resource($_params, $smarty); + $_smarty_resource_type = $_params['resource_type']; + $_smarty_php_resource = $_params['php_resource']; + + if (!empty($params['smarty_assign'])) { + ob_start(); + if ($_smarty_resource_type == 'file') { + $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']); + } else { + $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']); + } + $smarty->assign($params['smarty_assign'], ob_get_contents()); + ob_end_clean(); + } else { + if ($_smarty_resource_type == 'file') { + $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']); + } else { + $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']); + } + } +} + + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.write_cache_file.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.write_cache_file.php new file mode 100644 index 000000000..d7a828492 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.write_cache_file.php @@ -0,0 +1,95 @@ +_cache_info['timestamp'] = time(); + if ($smarty->cache_lifetime > -1){ + // expiration set + $smarty->_cache_info['expires'] = $smarty->_cache_info['timestamp'] + $smarty->cache_lifetime; + } else { + // cache will never expire + $smarty->_cache_info['expires'] = -1; + } + + // collapse nocache.../nocache-tags + if (preg_match_all('!\{(/?)nocache\:[0-9a-f]{32}#\d+\}!', $params['results'], $match, PREG_PATTERN_ORDER)) { + // remove everything between every pair of outermost noache.../nocache-tags + // and replace it by a single nocache-tag + // this new nocache-tag will be replaced by dynamic contents in + // smarty_core_process_compiled_includes() on a cache-read + + $match_count = count($match[0]); + $results = preg_split('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!', $params['results'], -1, PREG_SPLIT_DELIM_CAPTURE); + + $level = 0; + $j = 0; + for ($i=0, $results_count = count($results); $i < $results_count && $j < $match_count; $i++) { + if ($results[$i] == $match[0][$j]) { + // nocache tag + if ($match[1][$j]) { // closing tag + $level--; + unset($results[$i]); + } else { // opening tag + if ($level++ > 0) unset($results[$i]); + } + $j++; + } elseif ($level > 0) { + unset($results[$i]); + } + } + $params['results'] = implode('', $results); + } + $smarty->_cache_info['cache_serials'] = $smarty->_cache_serials; + + // prepend the cache header info into cache file + $params['results'] = serialize($smarty->_cache_info)."\n".$params['results']; + + if (!empty($smarty->cache_handler_func)) { + // use cache_handler function + call_user_func_array($smarty->cache_handler_func, + array('write', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], null)); + } else { + // use local cache file + + if(!@is_writable($smarty->cache_dir)) { + // cache_dir not writable, see if it exists + if(!@is_dir($smarty->cache_dir)) { + $smarty->trigger_error('the $cache_dir \'' . $smarty->cache_dir . '\' does not exist, or is not a directory.', E_USER_ERROR); + return false; + } + $smarty->trigger_error('unable to write to $cache_dir \'' . realpath($smarty->cache_dir) . '\'. Be sure $cache_dir is writable by the web server user.', E_USER_ERROR); + return false; + } + + $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']); + $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id); + $_params = array('filename' => $_cache_file, 'contents' => $params['results'], 'create_dirs' => true); + require_once(SMARTY_CORE_DIR . 'core.write_file.php'); + smarty_core_write_file($_params, $smarty); + return true; + } +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.write_compiled_include.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.write_compiled_include.php new file mode 100644 index 000000000..d17bee11c --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.write_compiled_include.php @@ -0,0 +1,79 @@ +caching && \!\$this->_cache_including\) \{ echo \'\{nocache\:('.$params['cache_serial'].')#(\d+)\}\';\}'; + $_tag_end = 'if \(\$this->caching && \!\$this->_cache_including\) \{ echo \'\{/nocache\:(\\2)#(\\3)\}\';\}'; + + preg_match_all('!('.$_tag_start.'(.*)'.$_tag_end.')!Us', + $params['compiled_content'], $_match_source, PREG_SET_ORDER); + + // no nocache-parts found: done + if (count($_match_source)==0) return; + + // convert the matched php-code to functions + $_include_compiled = "_version.", created on ".strftime("%Y-%m-%d %H:%M:%S")."\n"; + $_include_compiled .= " compiled from " . strtr(urlencode($params['resource_name']), array('%2F'=>'/', '%3A'=>':')) . " */\n\n"; + + $_compile_path = $params['include_file_path']; + + $smarty->_cache_serials[$_compile_path] = $params['cache_serial']; + $_include_compiled .= "\$this->_cache_serials['".$_compile_path."'] = '".$params['cache_serial']."';\n\n?>"; + + $_include_compiled .= $params['plugins_code']; + $_include_compiled .= "= 5.0) ? '_smarty' : 'this'; + for ($_i = 0, $_for_max = count($_match_source); $_i < $_for_max; $_i++) { + $_match =& $_match_source[$_i]; + $source = $_match[4]; + if ($this_varname == '_smarty') { + /* rename $this to $_smarty in the sourcecode */ + $tokens = token_get_all('\n"; + + $_params = array('filename' => $_compile_path, + 'contents' => $_include_compiled, 'create_dirs' => true); + + require_once(SMARTY_CORE_DIR . 'core.write_file.php'); + smarty_core_write_file($_params, $smarty); + return true; +} + + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.write_compiled_resource.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.write_compiled_resource.php new file mode 100644 index 000000000..b902eff3c --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.write_compiled_resource.php @@ -0,0 +1,35 @@ +compile_dir)) { + // compile_dir not writable, see if it exists + if(!@is_dir($smarty->compile_dir)) { + $smarty->trigger_error('the $compile_dir \'' . $smarty->compile_dir . '\' does not exist, or is not a directory.', E_USER_ERROR); + return false; + } + $smarty->trigger_error('unable to write to $compile_dir \'' . realpath($smarty->compile_dir) . '\'. Be sure $compile_dir is writable by the web server user.', E_USER_ERROR); + return false; + } + + $_params = array('filename' => $params['compile_path'], 'contents' => $params['compiled_content'], 'create_dirs' => true); + require_once(SMARTY_CORE_DIR . 'core.write_file.php'); + smarty_core_write_file($_params, $smarty); + return true; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.write_file.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.write_file.php new file mode 100644 index 000000000..09e169840 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/internals/core.write_file.php @@ -0,0 +1,54 @@ + $_dirname); + require_once(SMARTY_CORE_DIR . 'core.create_dir_structure.php'); + smarty_core_create_dir_structure($_params, $smarty); + } + + // write to tmp file, then rename it to avoid + // file locking race condition + $_tmp_file = tempnam($_dirname, 'wrt'); + + if (!($fd = @fopen($_tmp_file, 'wb'))) { + $_tmp_file = $_dirname . DIRECTORY_SEPARATOR . uniqid('wrt'); + if (!($fd = @fopen($_tmp_file, 'wb'))) { + $smarty->trigger_error("problem writing temporary file '$_tmp_file'"); + return false; + } + } + + fwrite($fd, $params['contents']); + fclose($fd); + + // Delete the file if it allready exists (this is needed on Win, + // because it cannot overwrite files with rename() + if (file_exists($params['filename'])) { + @unlink($params['filename']); + } + @rename($_tmp_file, $params['filename']); + @chmod($params['filename'], $smarty->_file_perms); + + return true; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/block.textformat.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/block.textformat.php new file mode 100644 index 000000000..aaebab2f5 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/block.textformat.php @@ -0,0 +1,102 @@ + + * Name: textformat
+ * Purpose: format text a certain way with preset styles + * or custom wrap/indent settings
+ * @link http://smarty.php.net/manual/en/language.function.textformat.php {textformat} + * (Smarty online manual) + * @param array + *
+ * Params:   style: string (email)
+ *           indent: integer (0)
+ *           wrap: integer (80)
+ *           wrap_char string ("\n")
+ *           indent_char: string (" ")
+ *           wrap_boundary: boolean (true)
+ * 
+ * @param string contents of the block + * @param Smarty clever simulation of a method + * @return string string $content re-formatted + */ +function smarty_block_textformat($params, $content, &$smarty) +{ + if (is_null($content)) { + return; + } + + $style = null; + $indent = 0; + $indent_first = 0; + $indent_char = ' '; + $wrap = 80; + $wrap_char = "\n"; + $wrap_cut = false; + $assign = null; + + foreach ($params as $_key => $_val) { + switch ($_key) { + case 'style': + case 'indent_char': + case 'wrap_char': + case 'assign': + $$_key = (string)$_val; + break; + + case 'indent': + case 'indent_first': + case 'wrap': + $$_key = (int)$_val; + break; + + case 'wrap_cut': + $$_key = (bool)$_val; + break; + + default: + $smarty->trigger_error("textformat: unknown attribute '$_key'"); + } + } + + if ($style == 'email') { + $wrap = 72; + } + + // split into paragraphs + $_paragraphs = preg_split('![\r\n][\r\n]!',$content); + $_output = ''; + + for($_x = 0, $_y = count($_paragraphs); $_x < $_y; $_x++) { + if ($_paragraphs[$_x] == '') { + continue; + } + // convert mult. spaces & special chars to single space + $_paragraphs[$_x] = preg_replace(array('!\s+!','!(^\s+)|(\s+$)!'), array(' ',''), $_paragraphs[$_x]); + // indent first line + if($indent_first > 0) { + $_paragraphs[$_x] = str_repeat($indent_char, $indent_first) . $_paragraphs[$_x]; + } + // wordwrap sentences + $_paragraphs[$_x] = wordwrap($_paragraphs[$_x], $wrap - $indent, $wrap_char, $wrap_cut); + // indent lines + if($indent > 0) { + $_paragraphs[$_x] = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraphs[$_x]); + } + } + $_output = implode($wrap_char . $wrap_char, $_paragraphs); + + return $assign ? $smarty->assign($assign, $_output) : $_output; + +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/compiler.assign.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/compiler.assign.php new file mode 100644 index 000000000..2e0201779 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/compiler.assign.php @@ -0,0 +1,38 @@ + + * Name: assign
+ * Purpose: assign a value to a template variable + * @link http://smarty.php.net/manual/en/language.custom.functions.php#LANGUAGE.FUNCTION.ASSIGN {assign} + * (Smarty online manual) + * @param string containing var-attribute and value-attribute + * @param Smarty_Compiler + */ +function smarty_compiler_assign($tag_attrs, &$compiler) +{ + $_params = $compiler->_parse_attrs($tag_attrs); + + if (!isset($_params['var'])) { + $compiler->_syntax_error("assign: missing 'var' parameter", E_USER_WARNING); + return; + } + + if (!isset($_params['value'])) { + $compiler->_syntax_error("assign: missing 'value' parameter", E_USER_WARNING); + return; + } + + return "\$this->assign({$_params['var']}, {$_params['value']});"; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.assign_debug_info.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.assign_debug_info.php new file mode 100644 index 000000000..8015624b1 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.assign_debug_info.php @@ -0,0 +1,39 @@ + + * Name: assign_debug_info
+ * Purpose: assign debug info to the template
+ * @param array unused in this plugin, this plugin uses {@link Smarty::$_config}, + * {@link Smarty::$_tpl_vars} and {@link Smarty::$_smarty_debug_info} + * @param Smarty + */ +function smarty_function_assign_debug_info($params, &$smarty) +{ + $assigned_vars = $smarty->_tpl_vars; + ksort($assigned_vars); + if (@is_array($smarty->_config[0])) { + $config_vars = $smarty->_config[0]; + ksort($config_vars); + $smarty->assign("_debug_config_keys", array_keys($config_vars)); + $smarty->assign("_debug_config_vals", array_values($config_vars)); + } + + $included_templates = $smarty->_smarty_debug_info; + + $smarty->assign("_debug_keys", array_keys($assigned_vars)); + $smarty->assign("_debug_vals", array_values($assigned_vars)); + + $smarty->assign("_debug_tpls", $included_templates); +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.config_load.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.config_load.php new file mode 100644 index 000000000..db7f8f6b9 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.config_load.php @@ -0,0 +1,140 @@ + + * Name: config_load
+ * Purpose: load config file vars + * @link http://smarty.php.net/manual/en/language.function.config.load.php {config_load} + * (Smarty online manual) + * @param array Format: + *
+ * array('file' => required config file name,
+ *       'section' => optional config file section to load
+ *       'scope' => local/parent/global
+ *       'global' => overrides scope, setting to parent if true)
+ * 
+ * @param Smarty + */ +function smarty_function_config_load($params, &$smarty) +{ + if ($smarty->debugging) { + $_params = array(); + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); + $_debug_start_time = smarty_core_get_microtime($_params, $smarty); + } + + $_file = isset($params['file']) ? $smarty->_dequote($params['file']) : null; + $_section = isset($params['section']) ? $smarty->_dequote($params['section']) : null; + $_scope = isset($params['scope']) ? $smarty->_dequote($params['scope']) : 'global'; + $_global = isset($params['global']) ? $smarty->_dequote($params['global']) : false; + + if (!isset($_file) || strlen($_file) == 0) { + $smarty->trigger_error("missing 'file' attribute in config_load tag", E_USER_ERROR, __FILE__, __LINE__); + } + + if (isset($_scope)) { + if ($_scope != 'local' && + $_scope != 'parent' && + $_scope != 'global') { + $smarty->trigger_error("invalid 'scope' attribute value", E_USER_ERROR, __FILE__, __LINE__); + } + } else { + if ($_global) { + $_scope = 'parent'; + } else { + $_scope = 'local'; + } + } + + $_params = array('resource_name' => $_file, + 'resource_base_path' => $smarty->config_dir, + 'get_source' => false); + $smarty->_parse_resource_name($_params); + $_file_path = $_params['resource_type'] . ':' . $_params['resource_name']; + if (isset($_section)) + $_compile_file = $smarty->_get_compile_path($_file_path.'|'.$_section); + else + $_compile_file = $smarty->_get_compile_path($_file_path); + + if($smarty->force_compile || !file_exists($_compile_file)) { + $_compile = true; + } elseif ($smarty->compile_check) { + $_params = array('resource_name' => $_file, + 'resource_base_path' => $smarty->config_dir, + 'get_source' => false); + $_compile = $smarty->_fetch_resource_info($_params) && + $_params['resource_timestamp'] > filemtime($_compile_file); + } else { + $_compile = false; + } + + if($_compile) { + // compile config file + if(!is_object($smarty->_conf_obj)) { + require_once SMARTY_DIR . $smarty->config_class . '.class.php'; + $smarty->_conf_obj = new $smarty->config_class(); + $smarty->_conf_obj->overwrite = $smarty->config_overwrite; + $smarty->_conf_obj->booleanize = $smarty->config_booleanize; + $smarty->_conf_obj->read_hidden = $smarty->config_read_hidden; + $smarty->_conf_obj->fix_newlines = $smarty->config_fix_newlines; + } + + $_params = array('resource_name' => $_file, + 'resource_base_path' => $smarty->config_dir, + $_params['get_source'] = true); + if (!$smarty->_fetch_resource_info($_params)) { + return; + } + $smarty->_conf_obj->set_file_contents($_file, $_params['source_content']); + $_config_vars = array_merge($smarty->_conf_obj->get($_file), + $smarty->_conf_obj->get($_file, $_section)); + if(function_exists('var_export')) { + $_output = ''; + } else { + $_output = ''\\\'', '\\'=>'\\\\')) . '\'); ?>'; + } + $_params = (array('compile_path' => $_compile_file, 'compiled_content' => $_output, 'resource_timestamp' => $_params['resource_timestamp'])); + require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php'); + smarty_core_write_compiled_resource($_params, $smarty); + } else { + include($_compile_file); + } + + if ($smarty->caching) { + $smarty->_cache_info['config'][$_file] = true; + } + + $smarty->_config[0]['vars'] = @array_merge($smarty->_config[0]['vars'], $_config_vars); + $smarty->_config[0]['files'][$_file] = true; + + if ($_scope == 'parent') { + $smarty->_config[1]['vars'] = @array_merge($smarty->_config[1]['vars'], $_config_vars); + $smarty->_config[1]['files'][$_file] = true; + } else if ($_scope == 'global') { + for ($i = 1, $for_max = count($smarty->_config); $i < $for_max; $i++) { + $smarty->_config[$i]['vars'] = @array_merge($smarty->_config[$i]['vars'], $_config_vars); + $smarty->_config[$i]['files'][$_file] = true; + } + } + + if ($smarty->debugging) { + $_params = array(); + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); + $smarty->_smarty_debug_info[] = array('type' => 'config', + 'filename' => $_file.' ['.$_section.'] '.$_scope, + 'depth' => $smarty->_inclusion_depth, + 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time); + } + +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.counter.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.counter.php new file mode 100644 index 000000000..cfe5dd886 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.counter.php @@ -0,0 +1,79 @@ + + * Name: counter
+ * Purpose: print out a counter value + * @link http://smarty.php.net/manual/en/language.function.counter.php {counter} + * (Smarty online manual) + * @param array parameters + * @param Smarty + * @return string|null + */ +function smarty_function_counter($params, &$smarty) +{ + static $counters = array(); + + $name = (isset($params['name'])) ? $params['name'] : 'default'; + if (!isset($counters[$name])) { + $counters[$name] = array( + 'start'=>1, + 'skip'=>1, + 'direction'=>'up', + 'count'=>1 + ); + } + $counter =& $counters[$name]; + + if (isset($params['start'])) { + $counter['start'] = $counter['count'] = (int)$params['start']; + } + + if (!empty($params['assign'])) { + $counter['assign'] = $params['assign']; + } + + if (isset($counter['assign'])) { + $smarty->assign($counter['assign'], $counter['count']); + } + + if (isset($params['print'])) { + $print = (bool)$params['print']; + } else { + $print = empty($counter['assign']); + } + + if ($print) { + $retval = $counter['count']; + } else { + $retval = null; + } + + if (isset($params['skip'])) { + $counter['skip'] = $params['skip']; + } + + if (isset($params['direction'])) { + $counter['direction'] = $params['direction']; + } + + if ($counter['direction'] == "down") + $counter['count'] -= $counter['skip']; + else + $counter['count'] += $counter['skip']; + + return $retval; + +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.cycle.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.cycle.php new file mode 100644 index 000000000..f61ff0b13 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.cycle.php @@ -0,0 +1,102 @@ + + * Name: cycle
+ * Date: May 3, 2002
+ * Purpose: cycle through given values
+ * Input: + * - name = name of cycle (optional) + * - values = comma separated list of values to cycle, + * or an array of values to cycle + * (this can be left out for subsequent calls) + * - reset = boolean - resets given var to true + * - print = boolean - print var or not. default is true + * - advance = boolean - whether or not to advance the cycle + * - delimiter = the value delimiter, default is "," + * - assign = boolean, assigns to template var instead of + * printed. + * + * Examples:
+ *
+ * {cycle values="#eeeeee,#d0d0d0d"}
+ * {cycle name=row values="one,two,three" reset=true}
+ * {cycle name=row}
+ * 
+ * @link http://smarty.php.net/manual/en/language.function.cycle.php {cycle} + * (Smarty online manual) + * @author Monte Ohrt + * @author credit to Mark Priatel + * @author credit to Gerard + * @author credit to Jason Sweat + * @version 1.3 + * @param array + * @param Smarty + * @return string|null + */ +function smarty_function_cycle($params, &$smarty) +{ + static $cycle_vars; + + $name = (empty($params['name'])) ? 'default' : $params['name']; + $print = (isset($params['print'])) ? (bool)$params['print'] : true; + $advance = (isset($params['advance'])) ? (bool)$params['advance'] : true; + $reset = (isset($params['reset'])) ? (bool)$params['reset'] : false; + + if (!in_array('values', array_keys($params))) { + if(!isset($cycle_vars[$name]['values'])) { + $smarty->trigger_error("cycle: missing 'values' parameter"); + return; + } + } else { + if(isset($cycle_vars[$name]['values']) + && $cycle_vars[$name]['values'] != $params['values'] ) { + $cycle_vars[$name]['index'] = 0; + } + $cycle_vars[$name]['values'] = $params['values']; + } + + $cycle_vars[$name]['delimiter'] = (isset($params['delimiter'])) ? $params['delimiter'] : ','; + + if(is_array($cycle_vars[$name]['values'])) { + $cycle_array = $cycle_vars[$name]['values']; + } else { + $cycle_array = explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']); + } + + if(!isset($cycle_vars[$name]['index']) || $reset ) { + $cycle_vars[$name]['index'] = 0; + } + + if (isset($params['assign'])) { + $print = false; + $smarty->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]); + } + + if($print) { + $retval = $cycle_array[$cycle_vars[$name]['index']]; + } else { + $retval = null; + } + + if($advance) { + if ( $cycle_vars[$name]['index'] >= count($cycle_array) -1 ) { + $cycle_vars[$name]['index'] = 0; + } else { + $cycle_vars[$name]['index']++; + } + } + + return $retval; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.debug.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.debug.php new file mode 100644 index 000000000..77e710921 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.debug.php @@ -0,0 +1,35 @@ + + * Name: debug
+ * Date: July 1, 2002
+ * Purpose: popup debug window + * @link http://smarty.php.net/manual/en/language.function.debug.php {debug} + * (Smarty online manual) + * @author Monte Ohrt + * @version 1.0 + * @param array + * @param Smarty + * @return string output from {@link Smarty::_generate_debug_output()} + */ +function smarty_function_debug($params, &$smarty) +{ + if (isset($params['output'])) { + $smarty->assign('_smarty_debug_output', $params['output']); + } + require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php'); + return smarty_core_display_debug_console(null, $smarty); +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.eval.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.eval.php new file mode 100644 index 000000000..3a4b8b2b8 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.eval.php @@ -0,0 +1,48 @@ + + * Name: eval
+ * Purpose: evaluate a template variable as a template
+ * @link http://smarty.php.net/manual/en/language.function.eval.php {eval} + * (Smarty online manual) + * @param array + * @param Smarty + */ +function smarty_function_eval($params, &$smarty) +{ + + if (!isset($params['var'])) { + $smarty->trigger_error("eval: missing 'var' parameter"); + return; + } + + if($params['var'] == '') { + return; + } + + $smarty->_compile_source('evaluated template', $params['var'], $_var_compiled); + + ob_start(); + $smarty->_eval('?>' . $_var_compiled); + $_contents = ob_get_contents(); + ob_end_clean(); + + if (!empty($params['assign'])) { + $smarty->assign($params['assign'], $_contents); + } else { + return $_contents; + } +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.fetch.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.fetch.php new file mode 100644 index 000000000..f5a6987a9 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.fetch.php @@ -0,0 +1,220 @@ + + * Name: fetch
+ * Purpose: fetch file, web or ftp data and display results + * @link http://smarty.php.net/manual/en/language.function.fetch.php {fetch} + * (Smarty online manual) + * @param array + * @param Smarty + * @return string|null if the assign parameter is passed, Smarty assigns the + * result to a template variable + */ +function smarty_function_fetch($params, &$smarty) +{ + if (empty($params['file'])) { + $smarty->_trigger_fatal_error("[plugin] parameter 'file' cannot be empty"); + return; + } + + $content = ''; + if ($smarty->security && !preg_match('!^(http|ftp)://!i', $params['file'])) { + $_params = array('resource_type' => 'file', 'resource_name' => $params['file']); + require_once(SMARTY_CORE_DIR . 'core.is_secure.php'); + if(!smarty_core_is_secure($_params, $smarty)) { + $smarty->_trigger_fatal_error('[plugin] (secure mode) fetch \'' . $params['file'] . '\' is not allowed'); + return; + } + + // fetch the file + if($fp = @fopen($params['file'],'r')) { + while(!feof($fp)) { + $content .= fgets ($fp,4096); + } + fclose($fp); + } else { + $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] . '\''); + return; + } + } else { + // not a local file + if(preg_match('!^http://!i',$params['file'])) { + // http fetch + if($uri_parts = parse_url($params['file'])) { + // set defaults + $host = $server_name = $uri_parts['host']; + $timeout = 30; + $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; + $agent = "Smarty Template Engine ".$smarty->_version; + $referer = ""; + $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/'; + $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : ''; + $_is_proxy = false; + if(empty($uri_parts['port'])) { + $port = 80; + } else { + $port = $uri_parts['port']; + } + if(!empty($uri_parts['user'])) { + $user = $uri_parts['user']; + } + if(!empty($uri_parts['pass'])) { + $pass = $uri_parts['pass']; + } + // loop through parameters, setup headers + foreach($params as $param_key => $param_value) { + switch($param_key) { + case "file": + case "assign": + case "assign_headers": + break; + case "user": + if(!empty($param_value)) { + $user = $param_value; + } + break; + case "pass": + if(!empty($param_value)) { + $pass = $param_value; + } + break; + case "accept": + if(!empty($param_value)) { + $accept = $param_value; + } + break; + case "header": + if(!empty($param_value)) { + if(!preg_match('![\w\d-]+: .+!',$param_value)) { + $smarty->_trigger_fatal_error("[plugin] invalid header format '".$param_value."'"); + return; + } else { + $extra_headers[] = $param_value; + } + } + break; + case "proxy_host": + if(!empty($param_value)) { + $proxy_host = $param_value; + } + break; + case "proxy_port": + if(!preg_match('!\D!', $param_value)) { + $proxy_port = (int) $param_value; + } else { + $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'"); + return; + } + break; + case "agent": + if(!empty($param_value)) { + $agent = $param_value; + } + break; + case "referer": + if(!empty($param_value)) { + $referer = $param_value; + } + break; + case "timeout": + if(!preg_match('!\D!', $param_value)) { + $timeout = (int) $param_value; + } else { + $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'"); + return; + } + break; + default: + $smarty->_trigger_fatal_error("[plugin] unrecognized attribute '".$param_key."'"); + return; + } + } + if(!empty($proxy_host) && !empty($proxy_port)) { + $_is_proxy = true; + $fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout); + } else { + $fp = fsockopen($server_name,$port,$errno,$errstr,$timeout); + } + + if(!$fp) { + $smarty->_trigger_fatal_error("[plugin] unable to fetch: $errstr ($errno)"); + return; + } else { + if($_is_proxy) { + fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n"); + } else { + fputs($fp, "GET $uri HTTP/1.0\r\n"); + } + if(!empty($host)) { + fputs($fp, "Host: $host\r\n"); + } + if(!empty($accept)) { + fputs($fp, "Accept: $accept\r\n"); + } + if(!empty($agent)) { + fputs($fp, "User-Agent: $agent\r\n"); + } + if(!empty($referer)) { + fputs($fp, "Referer: $referer\r\n"); + } + if(isset($extra_headers) && is_array($extra_headers)) { + foreach($extra_headers as $curr_header) { + fputs($fp, $curr_header."\r\n"); + } + } + if(!empty($user) && !empty($pass)) { + fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n"); + } + + fputs($fp, "\r\n"); + while(!feof($fp)) { + $content .= fgets($fp,4096); + } + fclose($fp); + $csplit = split("\r\n\r\n",$content,2); + + $content = $csplit[1]; + + if(!empty($params['assign_headers'])) { + $smarty->assign($params['assign_headers'],split("\r\n",$csplit[0])); + } + } + } else { + $smarty->_trigger_fatal_error("[plugin] unable to parse URL, check syntax"); + return; + } + } else { + // ftp fetch + if($fp = @fopen($params['file'],'r')) { + while(!feof($fp)) { + $content .= fgets ($fp,4096); + } + fclose($fp); + } else { + $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] .'\''); + return; + } + } + + } + + + if (!empty($params['assign'])) { + $smarty->assign($params['assign'],$content); + } else { + return $content; + } +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_checkboxes.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_checkboxes.php new file mode 100644 index 000000000..a64d7db7a --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_checkboxes.php @@ -0,0 +1,143 @@ + + * Type: function
+ * Name: html_checkboxes
+ * Date: 24.Feb.2003
+ * Purpose: Prints out a list of checkbox input types
+ * Input:
+ * - name (optional) - string default "checkbox" + * - values (required) - array + * - options (optional) - associative array + * - checked (optional) - array default not set + * - separator (optional) - ie
or   + * - output (optional) - the output next to each checkbox + * - assign (optional) - assign the output as an array to this variable + * Examples: + *
+ * {html_checkboxes values=$ids output=$names}
+ * {html_checkboxes values=$ids name='box' separator='
' output=$names} + * {html_checkboxes values=$ids checked=$checked separator='
' output=$names} + *
+ * @link http://smarty.php.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} + * (Smarty online manual) + * @author Christopher Kvarme + * @author credits to Monte Ohrt + * @version 1.0 + * @param array + * @param Smarty + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_checkboxes($params, &$smarty) +{ + require_once $smarty->_get_plugin_filepath('shared','escape_special_chars'); + + $name = 'checkbox'; + $values = null; + $options = null; + $selected = null; + $separator = ''; + $labels = true; + $output = null; + + $extra = ''; + + foreach($params as $_key => $_val) { + switch($_key) { + case 'name': + case 'separator': + $$_key = $_val; + break; + + case 'labels': + $$_key = (bool)$_val; + break; + + case 'options': + $$_key = (array)$_val; + break; + + case 'values': + case 'output': + $$_key = array_values((array)$_val); + break; + + case 'checked': + case 'selected': + $selected = array_map('strval', array_values((array)$_val)); + break; + + case 'checkboxes': + $smarty->trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING); + $options = (array)$_val; + break; + + case 'assign': + break; + + default: + if(!is_array($_val)) { + $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"'; + } else { + $smarty->trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (!isset($options) && !isset($values)) + return ''; /* raise error here? */ + + settype($selected, 'array'); + $_html_result = array(); + + if (is_array($options)) { + + foreach ($options as $_key=>$_val) + $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels); + + + } else { + foreach ($values as $_i=>$_key) { + $_val = isset($output[$_i]) ? $output[$_i] : ''; + $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels); + } + + } + + if(!empty($params['assign'])) { + $smarty->assign($params['assign'], $_html_result); + } else { + return implode("\n",$_html_result); + } + +} + +function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels) { + $_output = ''; + if ($labels) $_output .= ''; + $_output .= $separator; + + return $_output; +} + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_image.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_image.php new file mode 100644 index 000000000..aa2aa1875 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_image.php @@ -0,0 +1,142 @@ + + * Name: html_image
+ * Date: Feb 24, 2003
+ * Purpose: format HTML tags for the image
+ * Input:
+ * - file = file (and path) of image (required) + * - border = border width (optional, default 0) + * - height = image height (optional, default actual height) + * - image =image width (optional, default actual width) + * - basedir = base directory for absolute paths, default + * is environment variable DOCUMENT_ROOT + * + * Examples: {html_image file="images/masthead.gif"} + * Output: + * @link http://smarty.php.net/manual/en/language.function.html.image.php {html_image} + * (Smarty online manual) + * @author Monte Ohrt + * @author credits to Duda - wrote first image function + * in repository, helped with lots of functionality + * @version 1.0 + * @param array + * @param Smarty + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_image($params, &$smarty) +{ + require_once $smarty->_get_plugin_filepath('shared','escape_special_chars'); + + $alt = ''; + $file = ''; + $border = 0; + $height = ''; + $width = ''; + $extra = ''; + $prefix = ''; + $suffix = ''; + $server_vars = ($smarty->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS']; + $basedir = isset($server_vars['DOCUMENT_ROOT']) ? $server_vars['DOCUMENT_ROOT'] : ''; + foreach($params as $_key => $_val) { + switch($_key) { + case 'file': + case 'border': + case 'height': + case 'width': + case 'dpi': + case 'basedir': + $$_key = $_val; + break; + + case 'alt': + if(!is_array($_val)) { + $$_key = smarty_function_escape_special_chars($_val); + } else { + $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + + case 'link': + case 'href': + $prefix = '
'; + $suffix = ''; + break; + + default: + if(!is_array($_val)) { + $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"'; + } else { + $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (empty($file)) { + $smarty->trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE); + return; + } + + if (substr($file,0,1) == '/') { + $_image_path = $basedir . $file; + } else { + $_image_path = $file; + } + + if(!isset($params['width']) || !isset($params['height'])) { + if ($smarty->security && + ($_params = array('resource_type' => 'file', 'resource_name' => $_image_path)) && + (require_once(SMARTY_CORE_DIR . 'core.is_secure.php')) && + (!smarty_core_is_secure($_params, $smarty)) ) { + $smarty->trigger_error("html_image: (secure) '$_image_path' not in secure directory", E_USER_NOTICE); + + } elseif (!$_image_data = @getimagesize($_image_path)) { + if(!file_exists($_image_path)) { + $smarty->trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE); + return; + } else if(!is_readable($_image_path)) { + $smarty->trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE); + return; + } else { + $smarty->trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE); + return; + } + } + + if(!isset($params['width'])) { + $width = $_image_data[0]; + } + if(!isset($params['height'])) { + $height = $_image_data[1]; + } + + } + + if(isset($params['dpi'])) { + if(strstr($server_vars['HTTP_USER_AGENT'], 'Mac')) { + $dpi_default = 72; + } else { + $dpi_default = 96; + } + $_resize = $dpi_default/$params['dpi']; + $width = round($width * $_resize); + $height = round($height * $_resize); + } + + return $prefix . ''.$alt.'' . $suffix; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_options.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_options.php new file mode 100644 index 000000000..da5571c5b --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_options.php @@ -0,0 +1,121 @@ + + * Name: html_options
+ * Input:
+ * - name (optional) - string default "select" + * - values (required if no options supplied) - array + * - options (required if no values supplied) - associative array + * - selected (optional) - string default not set + * - output (required if not options supplied) - array + * Purpose: Prints the list of ' . "\n"; + foreach ($values as $key => $value) { + $optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected); + } + $optgroup_html .= "\n"; + return $optgroup_html; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_radios.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_radios.php new file mode 100644 index 000000000..c8633c5dd --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_radios.php @@ -0,0 +1,145 @@ + + * Type: function
+ * Name: html_radios
+ * Date: 24.Feb.2003
+ * Purpose: Prints out a list of radio input types
+ * Input:
+ * - name (optional) - string default "radio" + * - values (required) - array + * - options (optional) - associative array + * - checked (optional) - array default not set + * - separator (optional) - ie
or   + * - output (optional) - the output next to each radio button + * - assign (optional) - assign the output as an array to this variable + * Examples: + *
+ * {html_radios values=$ids output=$names}
+ * {html_radios values=$ids name='box' separator='
' output=$names} + * {html_radios values=$ids checked=$checked separator='
' output=$names} + *
+ * @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios} + * (Smarty online manual) + * @author Christopher Kvarme + * @author credits to Monte Ohrt + * @version 1.0 + * @param array + * @param Smarty + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_radios($params, &$smarty) +{ + require_once $smarty->_get_plugin_filepath('shared','escape_special_chars'); + + $name = 'radio'; + $values = null; + $options = null; + $selected = null; + $separator = ''; + $labels = true; + $output = null; + $extra = ''; + + foreach($params as $_key => $_val) { + switch($_key) { + case 'name': + case 'separator': + $$_key = (string)$_val; + break; + + case 'checked': + case 'selected': + if(is_array($_val)) { + $smarty->trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING); + } else { + $selected = (string)$_val; + } + break; + + case 'labels': + $$_key = (bool)$_val; + break; + + case 'options': + $$_key = (array)$_val; + break; + + case 'values': + case 'output': + $$_key = array_values((array)$_val); + break; + + case 'radios': + $smarty->trigger_error('html_radios: the use of the "radios" attribute is deprecated, use "options" instead', E_USER_WARNING); + $options = (array)$_val; + break; + + case 'assign': + break; + + default: + if(!is_array($_val)) { + $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"'; + } else { + $smarty->trigger_error("html_radios: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (!isset($options) && !isset($values)) + return ''; /* raise error here? */ + + $_html_result = array(); + + if (isset($options) && is_array($options)) { + + foreach ((array)$options as $_key=>$_val) + $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels); + + } else { + + foreach ((array)$values as $_i=>$_key) { + $_val = isset($output[$_i]) ? $output[$_i] : ''; + $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels); + } + + } + + if(!empty($params['assign'])) { + $smarty->assign($params['assign'], $_html_result); + } else { + return implode("\n",$_html_result); + } + +} + +function smarty_function_html_radios_output($name, $value, $output, $selected, $extra, $separator, $labels) { + $_output = ''; + if ($labels) $_output .= ''; + $_output .= $separator; + + return $_output; +} + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_select_date.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_select_date.php new file mode 100644 index 000000000..fc2d449a8 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_select_date.php @@ -0,0 +1,316 @@ + + * Name: html_select_date
+ * Purpose: Prints the dropdowns for date selection. + * + * ChangeLog:
+ * - 1.0 initial release + * - 1.1 added support for +/- N syntax for begin + * and end year values. (Monte) + * - 1.2 added support for yyyy-mm-dd syntax for + * time value. (Jan Rosier) + * - 1.3 added support for choosing format for + * month values (Gary Loescher) + * - 1.3.1 added support for choosing format for + * day values (Marcus Bointon) + * - 1.3.2 suppport negative timestamps, force year + * dropdown to include given date unless explicitly set (Monte) + * @link http://smarty.php.net/manual/en/language.function.html.select.date.php {html_select_date} + * (Smarty online manual) + * @version 1.3.2 + * @author Andrei Zmievski + * @param array + * @param Smarty + * @return string + */ +function smarty_function_html_select_date($params, &$smarty) +{ + require_once $smarty->_get_plugin_filepath('shared','make_timestamp'); + require_once $smarty->_get_plugin_filepath('function','html_options'); + /* Default values. */ + $prefix = "Date_"; + $start_year = strftime("%Y"); + $end_year = $start_year; + $display_days = true; + $display_months = true; + $display_years = true; + $month_format = "%B"; + /* Write months as numbers by default GL */ + $month_value_format = "%m"; + $day_format = "%02d"; + /* Write day values using this format MB */ + $day_value_format = "%d"; + $year_as_text = false; + /* Display years in reverse order? Ie. 2000,1999,.... */ + $reverse_years = false; + /* Should the select boxes be part of an array when returned from PHP? + e.g. setting it to "birthday", would create "birthday[Day]", + "birthday[Month]" & "birthday[Year]". Can be combined with prefix */ + $field_array = null; + /* tags. + If not set, uses default dropdown. */ + $day_size = null; + $month_size = null; + $year_size = null; + /* Unparsed attributes common to *ALL* the tags. + An example might be in the template: all_extra ='class ="foo"'. */ + $all_extra = null; + /* Separate attributes for the tags. */ + $day_extra = null; + $month_extra = null; + $year_extra = null; + /* Order in which to display the fields. + "D" -> day, "M" -> month, "Y" -> year. */ + $field_order = 'MDY'; + /* String printed between the different fields. */ + $field_separator = "\n"; + $time = time(); + $all_empty = null; + $day_empty = null; + $month_empty = null; + $year_empty = null; + + foreach ($params as $_key=>$_value) { + switch ($_key) { + case 'prefix': + case 'time': + case 'start_year': + case 'end_year': + case 'month_format': + case 'day_format': + case 'day_value_format': + case 'field_array': + case 'day_size': + case 'month_size': + case 'year_size': + case 'all_extra': + case 'day_extra': + case 'month_extra': + case 'year_extra': + case 'field_order': + case 'field_separator': + case 'month_value_format': + case 'month_empty': + case 'day_empty': + case 'year_empty': + $$_key = (string)$_value; + break; + + case 'all_empty': + $$_key = (string)$_value; + $day_empty = $month_empty = $year_empty = $all_empty; + break; + + case 'display_days': + case 'display_months': + case 'display_years': + case 'year_as_text': + case 'reverse_years': + $$_key = (bool)$_value; + break; + + default: + $smarty->trigger_error("[html_select_date] unknown parameter $_key", E_USER_WARNING); + + } + } + + if(preg_match('!^-\d+$!',$time)) { + // negative timestamp, use date() + $time = date('Y-m-d',$time); + } + // If $time is not in format yyyy-mm-dd + if (!preg_match('/^\d{0,4}-\d{0,2}-\d{0,2}$/', $time)) { + // use smarty_make_timestamp to get an unix timestamp and + // strftime to make yyyy-mm-dd + $time = strftime('%Y-%m-%d', smarty_make_timestamp($time)); + } + // Now split this in pieces, which later can be used to set the select + $time = explode("-", $time); + + // make syntax "+N" or "-N" work with start_year and end_year + if (preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match)) { + if ($match[1] == '+') { + $end_year = strftime('%Y') + $match[2]; + } else { + $end_year = strftime('%Y') - $match[2]; + } + } + if (preg_match('!^(\+|\-)\s*(\d+)$!', $start_year, $match)) { + if ($match[1] == '+') { + $start_year = strftime('%Y') + $match[2]; + } else { + $start_year = strftime('%Y') - $match[2]; + } + } + if (strlen($time[0]) > 0) { + if ($start_year > $time[0] && !isset($params['start_year'])) { + // force start year to include given date if not explicitly set + $start_year = $time[0]; + } + if($end_year < $time[0] && !isset($params['end_year'])) { + // force end year to include given date if not explicitly set + $end_year = $time[0]; + } + } + + $field_order = strtoupper($field_order); + + $html_result = $month_result = $day_result = $year_result = ""; + + if ($display_months) { + $month_names = array(); + $month_values = array(); + if(isset($month_empty)) { + $month_names[''] = $month_empty; + $month_values[''] = ''; + } + for ($i = 1; $i <= 12; $i++) { + $month_names[$i] = strftime($month_format, mktime(0, 0, 0, $i, 1, 2000)); + $month_values[$i] = strftime($month_value_format, mktime(0, 0, 0, $i, 1, 2000)); + } + + $month_result .= ''; + } + + if ($display_days) { + $days = array(); + if (isset($day_empty)) { + $days[''] = $day_empty; + $day_values[''] = ''; + } + for ($i = 1; $i <= 31; $i++) { + $days[] = sprintf($day_format, $i); + $day_values[] = sprintf($day_value_format, $i); + } + + $day_result .= ''; + } + + if ($display_years) { + if (null !== $field_array){ + $year_name = $field_array . '[' . $prefix . 'Year]'; + } else { + $year_name = $prefix . 'Year'; + } + if ($year_as_text) { + $year_result .= ' $years, + 'values' => $yearvals, + 'selected' => $time[0], + 'print_result' => false), + $smarty); + $year_result .= ''; + } + } + + // Loop thru the field_order field + for ($i = 0; $i <= 2; $i++){ + $c = substr($field_order, $i, 1); + switch ($c){ + case 'D': + $html_result .= $day_result; + break; + + case 'M': + $html_result .= $month_result; + break; + + case 'Y': + $html_result .= $year_result; + break; + } + // Add the field seperator + if($i != 2) { + $html_result .= $field_separator; + } + } + + return $html_result; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_select_time.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_select_time.php new file mode 100644 index 000000000..00cd1ae88 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_select_time.php @@ -0,0 +1,192 @@ + + * Name: html_select_time
+ * Purpose: Prints the dropdowns for time selection + * @link http://smarty.php.net/manual/en/language.function.html.select.time.php {html_select_time} + * (Smarty online manual) + * @param array + * @param Smarty + * @return string + * @uses smarty_make_timestamp() + */ +function smarty_function_html_select_time($params, &$smarty) +{ + require_once $smarty->_get_plugin_filepath('shared','make_timestamp'); + require_once $smarty->_get_plugin_filepath('function','html_options'); + /* Default values. */ + $prefix = "Time_"; + $time = time(); + $display_hours = true; + $display_minutes = true; + $display_seconds = true; + $display_meridian = true; + $use_24_hours = true; + $minute_interval = 1; + $second_interval = 1; + /* Should the select boxes be part of an array when returned from PHP? + e.g. setting it to "birthday", would create "birthday[Hour]", + "birthday[Minute]", "birthday[Seconds]" & "birthday[Meridian]". + Can be combined with prefix. */ + $field_array = null; + $all_extra = null; + $hour_extra = null; + $minute_extra = null; + $second_extra = null; + $meridian_extra = null; + + foreach ($params as $_key=>$_value) { + switch ($_key) { + case 'prefix': + case 'time': + case 'field_array': + case 'all_extra': + case 'hour_extra': + case 'minute_extra': + case 'second_extra': + case 'meridian_extra': + $$_key = (string)$_value; + break; + + case 'display_hours': + case 'display_minutes': + case 'display_seconds': + case 'display_meridian': + case 'use_24_hours': + $$_key = (bool)$_value; + break; + + case 'minute_interval': + case 'second_interval': + $$_key = (int)$_value; + break; + + default: + $smarty->trigger_error("[html_select_time] unknown parameter $_key", E_USER_WARNING); + } + } + + $time = smarty_make_timestamp($time); + + $html_result = ''; + + if ($display_hours) { + $hours = $use_24_hours ? range(0, 23) : range(1, 12); + $hour_fmt = $use_24_hours ? '%H' : '%I'; + for ($i = 0, $for_max = count($hours); $i < $for_max; $i++) + $hours[$i] = sprintf('%02d', $hours[$i]); + $html_result .= '\n"; + } + + if ($display_minutes) { + $all_minutes = range(0, 59); + for ($i = 0, $for_max = count($all_minutes); $i < $for_max; $i+= $minute_interval) + $minutes[] = sprintf('%02d', $all_minutes[$i]); + $selected = intval(floor(strftime('%M', $time) / $minute_interval) * $minute_interval); + $html_result .= '\n"; + } + + if ($display_seconds) { + $all_seconds = range(0, 59); + for ($i = 0, $for_max = count($all_seconds); $i < $for_max; $i+= $second_interval) + $seconds[] = sprintf('%02d', $all_seconds[$i]); + $selected = intval(floor(strftime('%S', $time) / $second_interval) * $second_interval); + $html_result .= '\n"; + } + + if ($display_meridian && !$use_24_hours) { + $html_result .= '\n"; + } + + return $html_result; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_table.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_table.php new file mode 100644 index 000000000..0f6d03b93 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.html_table.php @@ -0,0 +1,137 @@ + + * Name: html_table
+ * Date: Feb 17, 2003
+ * Purpose: make an html table from an array of data
+ * Input:
+ * - loop = array to loop through + * - cols = number of columns + * - rows = number of rows + * - table_attr = table attributes + * - tr_attr = table row attributes (arrays are cycled) + * - td_attr = table cell attributes (arrays are cycled) + * - trailpad = value to pad trailing cells with + * - vdir = vertical direction (default: "down", means top-to-bottom) + * - hdir = horizontal direction (default: "right", means left-to-right) + * - inner = inner loop (default "cols": print $loop line by line, + * $loop will be printed column by column otherwise) + * + * + * Examples: + *
+ * {table loop=$data}
+ * {table loop=$data cols=4 tr_attr='"bgcolor=red"'}
+ * {table loop=$data cols=4 tr_attr=$colors}
+ * 
+ * @author Monte Ohrt + * @version 1.0 + * @link http://smarty.php.net/manual/en/language.function.html.table.php {html_table} + * (Smarty online manual) + * @param array + * @param Smarty + * @return string + */ +function smarty_function_html_table($params, &$smarty) +{ + $table_attr = 'border="1"'; + $tr_attr = ''; + $td_attr = ''; + $cols = 3; + $rows = 3; + $trailpad = ' '; + $vdir = 'down'; + $hdir = 'right'; + $inner = 'cols'; + + if (!isset($params['loop'])) { + $smarty->trigger_error("html_table: missing 'loop' parameter"); + return; + } + + foreach ($params as $_key=>$_value) { + switch ($_key) { + case 'loop': + $$_key = (array)$_value; + break; + + case 'cols': + case 'rows': + $$_key = (int)$_value; + break; + + case 'table_attr': + case 'trailpad': + case 'hdir': + case 'vdir': + case 'inner': + $$_key = (string)$_value; + break; + + case 'tr_attr': + case 'td_attr': + $$_key = $_value; + break; + } + } + + $loop_count = count($loop); + if (empty($params['rows'])) { + /* no rows specified */ + $rows = ceil($loop_count/$cols); + } elseif (empty($params['cols'])) { + if (!empty($params['rows'])) { + /* no cols specified, but rows */ + $cols = ceil($loop_count/$rows); + } + } + + $output = "\n"; + + for ($r=0; $r<$rows; $r++) { + $output .= "\n"; + $rx = ($vdir == 'down') ? $r*$cols : ($rows-1-$r)*$cols; + + for ($c=0; $c<$cols; $c++) { + $x = ($hdir == 'right') ? $rx+$c : $rx+$cols-1-$c; + if ($inner!='cols') { + /* shuffle x to loop over rows*/ + $x = floor($x/$cols) + ($x%$cols)*$rows; + } + + if ($x<$loop_count) { + $output .= "" . $loop[$x] . "\n"; + } else { + $output .= "$trailpad\n"; + } + } + $output .= "\n"; + } + $output .= "
\n"; + + return $output; +} + +function smarty_function_html_table_cycle($name, $var, $no) { + if(!is_array($var)) { + $ret = $var; + } else { + $ret = $var[$no % count($var)]; + } + + return ($ret) ? ' '.$ret : ''; +} + + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.mailto.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.mailto.php new file mode 100644 index 000000000..a4f4d2d5d --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.mailto.php @@ -0,0 +1,143 @@ + + * Name: mailto
+ * Date: May 21, 2002 + * Purpose: automate mailto address link creation, and optionally + * encode them.
+ * Input:
+ * - address = e-mail address + * - text = (optional) text to display, default is address + * - encode = (optional) can be one of: + * * none : no encoding (default) + * * javascript : encode with javascript + * * hex : encode with hexidecimal (no javascript) + * - cc = (optional) address(es) to carbon copy + * - bcc = (optional) address(es) to blind carbon copy + * - subject = (optional) e-mail subject + * - newsgroups = (optional) newsgroup(s) to post to + * - followupto = (optional) address(es) to follow up to + * - extra = (optional) extra tags for the href link + * + * Examples: + *
+ * {mailto address="me@domain.com"}
+ * {mailto address="me@domain.com" encode="javascript"}
+ * {mailto address="me@domain.com" encode="hex"}
+ * {mailto address="me@domain.com" subject="Hello to you!"}
+ * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
+ * {mailto address="me@domain.com" extra='class="mailto"'}
+ * 
+ * @link http://smarty.php.net/manual/en/language.function.mailto.php {mailto} + * (Smarty online manual) + * @version 1.2 + * @author Monte Ohrt + * @author credits to Jason Sweat (added cc, bcc and subject functionality) + * @param array + * @param Smarty + * @return string + */ +function smarty_function_mailto($params, &$smarty) +{ + $extra = ''; + + if (empty($params['address'])) { + $smarty->trigger_error("mailto: missing 'address' parameter"); + return; + } else { + $address = $params['address']; + } + + $text = $address; + + // netscape and mozilla do not decode %40 (@) in BCC field (bug?) + // so, don't encode it. + $mail_parms = array(); + foreach ($params as $var=>$value) { + switch ($var) { + case 'cc': + case 'bcc': + case 'followupto': + if (!empty($value)) + $mail_parms[] = $var.'='.str_replace('%40','@',rawurlencode($value)); + break; + + case 'subject': + case 'newsgroups': + $mail_parms[] = $var.'='.rawurlencode($value); + break; + + case 'extra': + case 'text': + $$var = $value; + + default: + } + } + + $mail_parm_vals = ''; + for ($i=0; $itrigger_error("mailto: 'encode' parameter must be none, javascript or hex"); + return; + } + + if ($encode == 'javascript' ) { + $string = 'document.write(\''.$text.'\');'; + + $js_encode = ''; + for ($x=0; $x < strlen($string); $x++) { + $js_encode .= '%' . bin2hex($string[$x]); + } + + return ''; + + } elseif ($encode == 'hex') { + + preg_match('!^(.*)(\?.*)$!',$address,$match); + if(!empty($match[2])) { + $smarty->trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript."); + return; + } + $address_encode = ''; + for ($x=0; $x < strlen($address); $x++) { + if(preg_match('!\w!',$address[$x])) { + $address_encode .= '%' . bin2hex($address[$x]); + } else { + $address_encode .= $address[$x]; + } + } + $text_encode = ''; + for ($x=0; $x < strlen($text); $x++) { + $text_encode .= '&#x' . bin2hex($text[$x]).';'; + } + + $mailto = "mailto:"; + return ''.$text_encode.''; + + } else { + // no encoding + return ''.$text.''; + + } + +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.math.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.math.php new file mode 100644 index 000000000..c080d4dfe --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.math.php @@ -0,0 +1,82 @@ + + * Name: math
+ * Purpose: handle math computations in template
+ * @link http://smarty.php.net/manual/en/language.function.math.php {math} + * (Smarty online manual) + * @param array + * @param Smarty + * @return string + */ +function smarty_function_math($params, &$smarty) +{ + // be sure equation parameter is present + if (empty($params['equation'])) { + $smarty->trigger_error("math: missing equation parameter"); + return; + } + + $equation = $params['equation']; + + // make sure parenthesis are balanced + if (substr_count($equation,"(") != substr_count($equation,")")) { + $smarty->trigger_error("math: unbalanced parenthesis"); + return; + } + + // match all vars in equation, make sure all are passed + preg_match_all("!\!(0x)([a-zA-Z][a-zA-Z0-9_]*)!",$equation, $match); + $allowed_funcs = array('int','abs','ceil','cos','exp','floor','log','log10', + 'max','min','pi','pow','rand','round','sin','sqrt','srand','tan'); + foreach($match[2] as $curr_var) { + if (!in_array($curr_var,array_keys($params)) && !in_array($curr_var, $allowed_funcs)) { + $smarty->trigger_error("math: parameter $curr_var not passed as argument"); + return; + } + } + + foreach($params as $key => $val) { + if ($key != "equation" && $key != "format" && $key != "assign") { + // make sure value is not empty + if (strlen($val)==0) { + $smarty->trigger_error("math: parameter $key is empty"); + return; + } + if (!is_numeric($val)) { + $smarty->trigger_error("math: parameter $key: is not numeric"); + return; + } + $equation = preg_replace("/\b$key\b/",$val, $equation); + } + } + + eval("\$smarty_math_result = ".$equation.";"); + + if (empty($params['format'])) { + if (empty($params['assign'])) { + return $smarty_math_result; + } else { + $smarty->assign($params['assign'],$smarty_math_result); + } + } else { + if (empty($params['assign'])){ + printf($params['format'],$smarty_math_result); + } else { + $smarty->assign($params['assign'],sprintf($params['format'],$smarty_math_result)); + } + } +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.popup.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.popup.php new file mode 100644 index 000000000..80bd62aaf --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.popup.php @@ -0,0 +1,110 @@ + + * Name: popup
+ * Purpose: make text pop up in windows via overlib + * @link http://smarty.php.net/manual/en/language.function.popup.php {popup} + * (Smarty online manual) + * @param array + * @param Smarty + * @return string + */ +function smarty_function_popup($params, &$smarty) +{ + $append = ''; + foreach ($params as $_key=>$_value) { + switch ($_key) { + case 'text': + case 'trigger': + $$_key = (string)$_value; + break; + + case 'caption': + case 'closetext': + case 'status': + $append .= ',' . strtoupper($_key) . ",'" . str_replace("'","\'",$_value) . "'"; + break; + + case 'fgcolor': + case 'bgcolor': + case 'textcolor': + case 'capcolor': + case 'closecolor': + case 'textfont': + case 'captionfont': + case 'closefont': + case 'fgbackground': + case 'bgbackground': + case 'inarray': + case 'caparray': + case 'capicon': + case 'background': + case 'frame': + case 'function': + $append .= ',' . strtoupper($_key) . ",'$_value'"; + break; + + case 'textsize': + case 'captionsize': + case 'closesize': + case 'width': + case 'height': + case 'border': + case 'offsetx': + case 'offsety': + case 'snapx': + case 'snapy': + case 'fixx': + case 'fixy': + case 'padx': + case 'pady': + case 'timeout': + case 'delay': + $append .= ',' . strtoupper($_key) . ",$_value"; + break; + + case 'sticky': + case 'left': + case 'right': + case 'center': + case 'above': + case 'below': + case 'noclose': + case 'autostatus': + case 'autostatuscap': + case 'fullhtml': + case 'hauto': + case 'vauto': + if ($_value) $append .= ',' . strtoupper($_key); + break; + + default: + $smarty->trigger_error("[popup] unknown parameter $_key", E_USER_WARNING); + } + } + + if (empty($text) && !isset($inarray) && empty($function)) { + $smarty->trigger_error("overlib: attribute 'text' or 'inarray' or 'function' required"); + return false; + } + + if (empty($trigger)) { $trigger = "onmouseover"; } + + $retval = $trigger . '="return overlib(\''.preg_replace(array("!'!","![\r\n]!"),array("\'",'\r'),$text).'\''; + $retval .= $append . ');" onmouseout="nd();"'; + + return $retval; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.popup_init.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.popup_init.php new file mode 100644 index 000000000..f62c33c13 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/function.popup_init.php @@ -0,0 +1,39 @@ + + * Name: popup_init
+ * Purpose: initialize overlib + * @link http://smarty.php.net/manual/en/language.function.popup.init.php {popup_init} + * (Smarty online manual) + * @param array + * @param Smarty + * @return string + */ +function smarty_function_popup_init($params, &$smarty) +{ + $zindex = 1000; + + if (!empty($params['zindex'])) { + $zindex = $params['zindex']; + } + + if (!empty($params['src'])) { + return '' . "\n" + . '' . "\n"; + } else { + $smarty->trigger_error("popup_init: missing src parameter"); + } +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.capitalize.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.capitalize.php new file mode 100644 index 000000000..2b9169cef --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.capitalize.php @@ -0,0 +1,42 @@ + + * Name: capitalize
+ * Purpose: capitalize words in the string + * @link http://smarty.php.net/manual/en/language.modifiers.php#LANGUAGE.MODIFIER.CAPITALIZE + * capitalize (Smarty online manual) + * @param string + * @return string + */ +function smarty_modifier_capitalize($string, $uc_digits = false) +{ + smarty_modifier_capitalize_ucfirst(null, $uc_digits); + return preg_replace_callback('!\b\w+\b!', 'smarty_modifier_capitalize_ucfirst', $string); +} + +function smarty_modifier_capitalize_ucfirst($string, $uc_digits = null) +{ + static $_uc_digits = false; + + if(isset($uc_digits)) { + $_uc_digits = $uc_digits; + return; + } + + if(!preg_match('!\d!',$string[0]) || $_uc_digits) + return ucfirst($string[0]); + else + return $string[0]; +} + + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.cat.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.cat.php new file mode 100644 index 000000000..f5dc3d689 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.cat.php @@ -0,0 +1,33 @@ + + * Name: cat
+ * Date: Feb 24, 2003 + * Purpose: catenate a value to a variable + * Input: string to catenate + * Example: {$var|cat:"foo"} + * @link http://smarty.php.net/manual/en/language.modifier.cat.php cat + * (Smarty online manual) + * @author Monte Ohrt + * @version 1.0 + * @param string + * @param string + * @return string + */ +function smarty_modifier_cat($string, $cat) +{ + return $string . $cat; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.count_characters.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.count_characters.php new file mode 100644 index 000000000..49ce655e8 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.count_characters.php @@ -0,0 +1,31 @@ + + * Name: count_characteres
+ * Purpose: count the number of characters in a text + * @link http://smarty.php.net/manual/en/language.modifier.count.characters.php + * count_characters (Smarty online manual) + * @param string + * @param boolean include whitespace in the character count + * @return integer + */ +function smarty_modifier_count_characters($string, $include_spaces = false) +{ + if ($include_spaces) + return(strlen($string)); + + return preg_match_all("/[^\s]/",$string, $match); +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.count_paragraphs.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.count_paragraphs.php new file mode 100644 index 000000000..6a9833c97 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.count_paragraphs.php @@ -0,0 +1,28 @@ + + * Name: count_paragraphs
+ * Purpose: count the number of paragraphs in a text + * @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php + * count_paragraphs (Smarty online manual) + * @param string + * @return integer + */ +function smarty_modifier_count_paragraphs($string) +{ + // count \r or \n characters + return count(preg_split('/[\r\n]+/', $string)); +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.count_sentences.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.count_sentences.php new file mode 100644 index 000000000..0c210f08f --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.count_sentences.php @@ -0,0 +1,28 @@ + + * Name: count_sentences + * Purpose: count the number of sentences in a text + * @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php + * count_sentences (Smarty online manual) + * @param string + * @return integer + */ +function smarty_modifier_count_sentences($string) +{ + // find periods with a word before but not after. + return preg_match_all('/[^\s]\.(?!\w)/', $string, $match); +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.count_words.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.count_words.php new file mode 100644 index 000000000..42c8a741c --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.count_words.php @@ -0,0 +1,32 @@ + + * Name: count_words
+ * Purpose: count the number of words in a text + * @link http://smarty.php.net/manual/en/language.modifier.count.words.php + * count_words (Smarty online manual) + * @param string + * @return integer + */ +function smarty_modifier_count_words($string) +{ + // split text by ' ',\r,\n,\f,\t + $split_array = preg_split('/\s+/',$string); + // count matches that contain alphanumerics + $word_count = preg_grep('/[a-zA-Z0-9\\x80-\\xff]/', $split_array); + + return count($word_count); +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.date_format.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.date_format.php new file mode 100644 index 000000000..2f36b3b79 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.date_format.php @@ -0,0 +1,48 @@ +_get_plugin_filepath('shared','make_timestamp'); +/** + * Smarty date_format modifier plugin + * + * Type: modifier
+ * Name: date_format
+ * Purpose: format datestamps via strftime
+ * Input:
+ * - string: input date string + * - format: strftime format for output + * - default_date: default date if $string is empty + * @link http://smarty.php.net/manual/en/language.modifier.date.format.php + * date_format (Smarty online manual) + * @param string + * @param string + * @param string + * @return string|void + * @uses smarty_make_timestamp() + */ +function smarty_modifier_date_format($string, $format="%b %e, %Y", $default_date=null) +{ + if (substr(PHP_OS,0,3) == 'WIN') { + $_win_from = array ('%e', '%T', '%D'); + $_win_to = array ('%#d', '%H:%M:%S', '%m/%d/%y'); + $format = str_replace($_win_from, $_win_to, $format); + } + if($string != '') { + return strftime($format, smarty_make_timestamp($string)); + } elseif (isset($default_date) && $default_date != '') { + return strftime($format, smarty_make_timestamp($default_date)); + } else { + return; + } +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.debug_print_var.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.debug_print_var.php new file mode 100644 index 000000000..b9bb18488 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.debug_print_var.php @@ -0,0 +1,56 @@ + + * Name: debug_print_var
+ * Purpose: formats variable contents for display in the console + * @link http://smarty.php.net/manual/en/language.modifier.debug.print.var.php + * debug_print_var (Smarty online manual) + * @param array|object + * @param integer + * @param integer + * @return string + */ +function smarty_modifier_debug_print_var($var, $depth = 0, $length = 40) +{ + $_replace = array("\n"=>'\n', "\r"=>'\r', "\t"=>'\t'); + if (is_array($var)) { + $results = "Array (".count($var).")"; + foreach ($var as $curr_key => $curr_val) { + $return = smarty_modifier_debug_print_var($curr_val, $depth+1, $length); + $results .= "
".str_repeat(' ', $depth*2)."".strtr($curr_key, $_replace)." => $return"; + } + } else if (is_object($var)) { + $object_vars = get_object_vars($var); + $results = "".get_class($var)." Object (".count($object_vars).")"; + foreach ($object_vars as $curr_key => $curr_val) { + $return = smarty_modifier_debug_print_var($curr_val, $depth+1, $length); + $results .= "
".str_repeat(' ', $depth*2)."$curr_key => $return"; + } + } else if (is_resource($var)) { + $results = ''.(string)$var.''; + } else if (empty($var) && $var != "0") { + $results = 'empty'; + } else { + if (strlen($var) > $length ) { + $results = substr($var, 0, $length-3).'...'; + } else { + $results = $var; + } + $results = htmlspecialchars($results); + $results = strtr($results, $_replace); + } + return $results; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.default.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.default.php new file mode 100644 index 000000000..8268e396f --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.default.php @@ -0,0 +1,31 @@ + + * Name: default
+ * Purpose: designate default value for empty variables + * @link http://smarty.php.net/manual/en/language.modifier.default.php + * default (Smarty online manual) + * @param string + * @param string + * @return string + */ +function smarty_modifier_default($string, $default = '') +{ + if (!isset($string) || $string === '') + return $default; + else + return $string; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.escape.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.escape.php new file mode 100644 index 000000000..0a0270c56 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.escape.php @@ -0,0 +1,89 @@ + + * Name: escape
+ * Purpose: Escape the string according to escapement type + * @link http://smarty.php.net/manual/en/language.modifier.escape.php + * escape (Smarty online manual) + * @param string + * @param html|htmlall|url|quotes|hex|hexentity|javascript + * @return string + */ +function smarty_modifier_escape($string, $esc_type = 'html') +{ + switch ($esc_type) { + case 'html': + return htmlspecialchars($string, ENT_QUOTES); + + case 'htmlall': + return htmlentities($string, ENT_QUOTES); + + case 'url': + return urlencode($string); + + case 'quotes': + // escape unescaped single quotes + return preg_replace("%(?'\\\\',"'"=>"\\'",'"'=>'\\"',"\r"=>'\\r',"\n"=>'\\n',''<\/')); + + case 'mail': + // safe way to display e-mail address on a web page + return str_replace(array('@', '.'),array(' [AT] ', ' [DOT] '), $string); + + case 'nonstd': + // escape non-standard chars, such as ms document quotes + $_res = ''; + for($_i = 0, $_len = strlen($string); $_i < $_len; $_i++) { + $_ord = ord($string{$_i}); + // non-standard char, escape it + if($_ord >= 126){ + $_res .= '&#' . $_ord . ';'; + } + else { + $_res .= $string{$_i}; + } + } + return $_res; + + default: + return $string; + } +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.indent.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.indent.php new file mode 100644 index 000000000..1642bac3d --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.indent.php @@ -0,0 +1,27 @@ + + * Name: indent
+ * Purpose: indent lines of text + * @link http://smarty.php.net/manual/en/language.modifier.indent.php + * indent (Smarty online manual) + * @param string + * @param integer + * @param string + * @return string + */ +function smarty_modifier_indent($string,$chars=4,$char=" ") +{ + return preg_replace('!^!m',str_repeat($char,$chars),$string); +} + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.lower.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.lower.php new file mode 100644 index 000000000..0b4d1517d --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.lower.php @@ -0,0 +1,25 @@ + + * Name: lower
+ * Purpose: convert string to lowercase + * @link http://smarty.php.net/manual/en/language.modifier.lower.php + * lower (Smarty online manual) + * @param string + * @return string + */ +function smarty_modifier_lower($string) +{ + return strtolower($string); +} + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.nl2br.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.nl2br.php new file mode 100644 index 000000000..86a28d207 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.nl2br.php @@ -0,0 +1,35 @@ + + * Name: nl2br
+ * Date: Feb 26, 2003 + * Purpose: convert \r\n, \r or \n to <
> + * Input:
+ * - contents = contents to replace + * - preceed_test = if true, includes preceeding break tags + * in replacement + * Example: {$text|nl2br} + * @link http://smarty.php.net/manual/en/language.modifier.nl2br.php + * nl2br (Smarty online manual) + * @version 1.0 + * @author Monte Ohrt + * @param string + * @return string + */ +function smarty_modifier_nl2br($string) +{ + return nl2br($string); +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.regex_replace.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.regex_replace.php new file mode 100644 index 000000000..b9cc865ea --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.regex_replace.php @@ -0,0 +1,29 @@ + + * Name: regex_replace
+ * Purpose: regular epxression search/replace + * @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php + * regex_replace (Smarty online manual) + * @param string + * @param string|array + * @param string|array + * @return string + */ +function smarty_modifier_regex_replace($string, $search, $replace) +{ + return preg_replace($search, $replace, $string); +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.replace.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.replace.php new file mode 100644 index 000000000..2a43515f7 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.replace.php @@ -0,0 +1,29 @@ + + * Name: replace
+ * Purpose: simple search/replace + * @link http://smarty.php.net/manual/en/language.modifier.replace.php + * replace (Smarty online manual) + * @param string + * @param string + * @param string + * @return string + */ +function smarty_modifier_replace($string, $search, $replace) +{ + return str_replace($search, $replace, $string); +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.spacify.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.spacify.php new file mode 100644 index 000000000..dad057f9b --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.spacify.php @@ -0,0 +1,29 @@ + + * Name: spacify
+ * Purpose: add spaces between characters in a string + * @link http://smarty.php.net/manual/en/language.modifier.spacify.php + * spacify (Smarty online manual) + * @param string + * @param string + * @return string + */ +function smarty_modifier_spacify($string, $spacify_char = ' ') +{ + return implode($spacify_char, + preg_split('//', $string, -1, PREG_SPLIT_NO_EMPTY)); +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.string_format.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.string_format.php new file mode 100644 index 000000000..efd621506 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.string_format.php @@ -0,0 +1,28 @@ + + * Name: string_format
+ * Purpose: format strings via sprintf + * @link http://smarty.php.net/manual/en/language.modifier.string.format.php + * string_format (Smarty online manual) + * @param string + * @param string + * @return string + */ +function smarty_modifier_string_format($string, $format) +{ + return sprintf($format, $string); +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.strip.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.strip.php new file mode 100644 index 000000000..738c6407e --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.strip.php @@ -0,0 +1,33 @@ + + * Name: strip
+ * Purpose: Replace all repeated spaces, newlines, tabs + * with a single space or supplied replacement string.
+ * Example: {$var|strip} {$var|strip:" "} + * Date: September 25th, 2002 + * @link http://smarty.php.net/manual/en/language.modifier.strip.php + * strip (Smarty online manual) + * @author Monte Ohrt + * @version 1.0 + * @param string + * @param string + * @return string + */ +function smarty_modifier_strip($text, $replace = ' ') +{ + return preg_replace('!\s+!', $replace, $text); +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.strip_tags.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.strip_tags.php new file mode 100644 index 000000000..45f1ec14d --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.strip_tags.php @@ -0,0 +1,31 @@ + + * Name: strip_tags
+ * Purpose: strip html tags from text + * @link http://smarty.php.net/manual/en/language.modifier.strip.tags.php + * strip_tags (Smarty online manual) + * @param string + * @param boolean + * @return string + */ +function smarty_modifier_strip_tags($string, $replace_with_space = true) +{ + if ($replace_with_space) + return preg_replace('!<[^>]*?>!', ' ', $string); + else + return strip_tags($string); +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.truncate.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.truncate.php new file mode 100644 index 000000000..15a26ba97 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.truncate.php @@ -0,0 +1,43 @@ + + * Name: truncate
+ * Purpose: Truncate a string to a certain length if necessary, + * optionally splitting in the middle of a word, and + * appending the $etc string. + * @link http://smarty.php.net/manual/en/language.modifier.truncate.php + * truncate (Smarty online manual) + * @param string + * @param integer + * @param string + * @param boolean + * @return string + */ +function smarty_modifier_truncate($string, $length = 80, $etc = '...', + $break_words = false) +{ + if ($length == 0) + return ''; + + if (strlen($string) > $length) { + $length -= strlen($etc); + if (!$break_words) + $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1)); + + return substr($string, 0, $length).$etc; + } else + return $string; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.upper.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.upper.php new file mode 100644 index 000000000..69960ae72 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.upper.php @@ -0,0 +1,25 @@ + + * Name: upper
+ * Purpose: convert string to uppercase + * @link http://smarty.php.net/manual/en/language.modifier.upper.php + * upper (Smarty online manual) + * @param string + * @return string + */ +function smarty_modifier_upper($string) +{ + return strtoupper($string); +} + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.wordwrap.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.wordwrap.php new file mode 100644 index 000000000..b9a9fe94b --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/modifier.wordwrap.php @@ -0,0 +1,28 @@ + + * Name: wordwrap
+ * Purpose: wrap a string of text at a given length + * @link http://smarty.php.net/manual/en/language.modifier.wordwrap.php + * wordwrap (Smarty online manual) + * @param string + * @param integer + * @param string + * @param boolean + * @return string + */ +function smarty_modifier_wordwrap($string,$length=80,$break="\n",$cut=false) +{ + return wordwrap($string,$length,$break,$cut); +} + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/outputfilter.trimwhitespace.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/outputfilter.trimwhitespace.php new file mode 100644 index 000000000..9979e8586 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/outputfilter.trimwhitespace.php @@ -0,0 +1,75 @@ + + * Type: outputfilter
+ * Name: trimwhitespace
+ * Date: Jan 25, 2003
+ * Purpose: trim leading white space and blank lines from + * template source after it gets interpreted, cleaning + * up code and saving bandwidth. Does not affect + * <
>
and blocks.
+ * Install: Drop into the plugin directory, call + * $smarty->load_filter('output','trimwhitespace'); + * from application. + * @author Monte Ohrt + * @author Contributions from Lars Noschinski + * @version 1.3 + * @param string + * @param Smarty + */ +function smarty_outputfilter_trimwhitespace($source, &$smarty) +{ + // Pull out the script blocks + preg_match_all("!]+>.*?!is", $source, $match); + $_script_blocks = $match[0]; + $source = preg_replace("!]+>.*?!is", + '@@@SMARTY:TRIM:SCRIPT@@@', $source); + + // Pull out the pre blocks + preg_match_all("!
.*?
!is", $source, $match); + $_pre_blocks = $match[0]; + $source = preg_replace("!
.*?
!is", + '@@@SMARTY:TRIM:PRE@@@', $source); + + // Pull out the textarea blocks + preg_match_all("!]+>.*?!is", $source, $match); + $_textarea_blocks = $match[0]; + $source = preg_replace("!]+>.*?!is", + '@@@SMARTY:TRIM:TEXTAREA@@@', $source); + + // remove all leading spaces, tabs and carriage returns NOT + // preceeded by a php close tag. + $source = trim(preg_replace('/((?)\n)[\s]+/m', '\1', $source)); + + // replace script blocks + smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:SCRIPT@@@",$_script_blocks, $source); + + // replace pre blocks + smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:PRE@@@",$_pre_blocks, $source); + + // replace textarea blocks + smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:TEXTAREA@@@",$_textarea_blocks, $source); + + return $source; +} + +function smarty_outputfilter_trimwhitespace_replace($search_str, $replace, &$subject) { + $_len = strlen($search_str); + $_pos = 0; + for ($_i=0, $_count=count($replace); $_i<$_count; $_i++) + if (($_pos=strpos($subject, $search_str, $_pos))!==false) + $subject = substr_replace($subject, $replace[$_i], $_pos, $_len); + else + break; + +} + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/shared.escape_special_chars.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/shared.escape_special_chars.php new file mode 100644 index 000000000..515763abe --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/shared.escape_special_chars.php @@ -0,0 +1,30 @@ + + * Purpose: used by other smarty functions to escape + * special chars except for already escaped ones + * @param string + * @return string + */ +function smarty_function_escape_special_chars($string) +{ + if(!is_array($string)) { + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); + $string = htmlspecialchars($string); + $string = str_replace(array('%%%SMARTY_START%%%','%%%SMARTY_END%%%'), array('&',';'), $string); + } + return $string; +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/shared.make_timestamp.php b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/shared.make_timestamp.php new file mode 100644 index 000000000..acdd77735 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/libs/plugins/shared.make_timestamp.php @@ -0,0 +1,43 @@ + + * Purpose: used by other smarty functions to make a timestamp + * from a string. + * @param string + * @return string + */ +function smarty_make_timestamp($string) +{ + if(empty($string)) { + $string = "now"; + } + $time = strtotime($string); + if (is_numeric($time) && $time != -1) + return $time; + + // is mysql timestamp format of YYYYMMDDHHMMSS? + if (preg_match('/^\d{14}$/', $string)) { + $time = mktime(substr($string,8,2),substr($string,10,2),substr($string,12,2), + substr($string,4,2),substr($string,6,2),substr($string,0,4)); + + return $time; + } + + // couldn't recognize it, try to return a time + $time = (int) $string; + if ($time > 0) + return $time; + else + return time(); +} + +/* vim: set expandtab: */ + +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/misc/smarty_icon.README b/livesupport/modules/htmlUI/var/html/Smarty/misc/smarty_icon.README new file mode 100644 index 000000000..a5b4d05cc --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/misc/smarty_icon.README @@ -0,0 +1,6 @@ +Feel free to put the smarty icon on your site. +You can cut-and-paste the following code, be sure +to adjust the path to the image: + + + diff --git a/livesupport/modules/htmlUI/var/html/Smarty/misc/smarty_icon.gif b/livesupport/modules/htmlUI/var/html/Smarty/misc/smarty_icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d5196995c01db0c78f6ff1b3191f6dbd8225460 GIT binary patch literal 1102 zcmV-U1hM-^Nk%w1VORhk0K@K%8hp3>uF}*>IK+LDJ02ToY6b{k0s;mR5gTJw1d(D=iHT)q372PX8&;7YW1W>|5f>sC2BMag zT7g8WWf2Y&6Axer2B1z44gn4iVFtVp3kVLs5qSX*1ep;A$G%S+!oLf|3mPH=#lytj zHbaSwj1LD26%z*sV9g&37a9c~1sWF*00Z&^0|oUL{R#}oa3z2~dIB9F2%w>%z6=uP z(HkJ4VM7W1Gzu{Ycrk>?BAOySADAW}z&yjwnQxVF+ONUw zj!(rl0GFGU$~y@_fd&*%pum9R4H3!zA|E|~fdwR0aKHk&s5C-9E&y)(7H2AY+Ull&6Xl=U5QjaE`Ee(01Ht=uZJ=4SAeDT(vck zkr@n$Rssevv`qw1c8E#?1$tyC>JoO3D5-qq4b0lZ7diGC!Uzm zX(ExB0f{7`f*R@|nTGlSWskv`K#VhfS7S#}n8Xi1nM48zC~Z9QK?8RD!3HS63hT!j zy-H=DbzBly;CBhq8iQR596$lf9aChx1_AV4kU=Vdd{>Wnn^&i zoXe56^wt{)2l(cz@4o!@>+in+2Q09^B6MJ|3?0Ofu)zz%a4^FOe{itE3PWr$#Scd; zvBMHK>@dRxL)`Jg43E6=!zO1;^2!!pEb_@CXZ%9LEq4%d$tBMm@y;Kc{PD^^*Q_zh zFn4S;&pLzbfy*k>d@{~5L(Q_#EFXO|$yV2Vv&tBw{PNQ&Pn>kkT^l_!$3&04HPvjl U?e^Pnzum&zbk}Y7+#vt}JGB pear list + +If you don't see PHPUnit, install with this: + +$> pear install PHPUnit + +Edit the config.php file, +be sure everything is defined correctly. + +Be sure the following directories are present: + +templates +configs +templates_c (writable) +cache (writable) + +Then run from the command line: +php -q smarty_unit_test.php + +Or from the web browser: +http://www.your_domain.com/path/to/smarty_unit_test_gui.php + +This will run a unit test for every component +of Smarty and dump the results. All should pass +with flying colors. :) diff --git a/livesupport/modules/htmlUI/var/html/Smarty/unit_test/config.php b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/config.php new file mode 100644 index 000000000..5e7da0561 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/config.php @@ -0,0 +1,5 @@ + diff --git a/livesupport/modules/htmlUI/var/html/Smarty/unit_test/configs/globals_double_quotes.conf b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/configs/globals_double_quotes.conf new file mode 100644 index 000000000..5abc475eb --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/configs/globals_double_quotes.conf @@ -0,0 +1 @@ +foo = "bar" diff --git a/livesupport/modules/htmlUI/var/html/Smarty/unit_test/configs/globals_single_quotes.conf b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/configs/globals_single_quotes.conf new file mode 100644 index 000000000..4517b7bd1 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/configs/globals_single_quotes.conf @@ -0,0 +1 @@ +foo = 'bar' diff --git a/livesupport/modules/htmlUI/var/html/Smarty/unit_test/smarty_unit_test.php b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/smarty_unit_test.php new file mode 100644 index 000000000..c56a61a0e --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/smarty_unit_test.php @@ -0,0 +1,10 @@ + toString(); +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/unit_test/smarty_unit_test_gui.php b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/smarty_unit_test_gui.php new file mode 100644 index 000000000..03309d4cb --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/smarty_unit_test_gui.php @@ -0,0 +1,10 @@ + toHTML(); +?> diff --git a/livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/assign_var.tpl b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/assign_var.tpl new file mode 100644 index 000000000..acc4b66a4 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/assign_var.tpl @@ -0,0 +1 @@ +{$foo} diff --git a/livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/constant.tpl b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/constant.tpl new file mode 100644 index 000000000..7ae11f1dc --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/constant.tpl @@ -0,0 +1 @@ +{$smarty.const.TEST_CONSTANT} diff --git a/livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/index.tpl b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/index.tpl new file mode 100644 index 000000000..fb6aad233 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/index.tpl @@ -0,0 +1 @@ +TEST STRING diff --git a/livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/parse_math.tpl b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/parse_math.tpl new file mode 100644 index 000000000..0b787d363 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/parse_math.tpl @@ -0,0 +1,12 @@ +{foreach name=loop from=$items item=i} +{$smarty.foreach.loop.iteration+2} +{$smarty.foreach.loop.iteration+$flt} +{$smarty.foreach.loop.iteration+$obj->six()} +{$smarty.foreach.loop.iteration+$obj->ten} +{/foreach} +{$obj->ten+$flt} +{$obj->ten*$flt} +{$obj->six()+$obj->ten} +{$obj->ten+$obj->ten} +{$obj->six()+$flt} +{$obj->six()+$items.0} diff --git a/livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/parse_obj_meth.tpl b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/parse_obj_meth.tpl new file mode 100644 index 000000000..ab198327f --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/templates/parse_obj_meth.tpl @@ -0,0 +1,8 @@ +{$obj->meth($foo, 2.5)} +{$obj->meth(2.5, $foo)} +{$obj->meth(2.5)} +{$obj->meth($obj->val, "foo")} +{$obj->meth("foo", $obj->val)} +{$obj->meth("foo", $foo)} +{$obj->meth($obj->arr.one, 2)} +{$obj->meth($obj->meth("foo", $foo))} diff --git a/livesupport/modules/htmlUI/var/html/Smarty/unit_test/test_cases.php b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/test_cases.php new file mode 100644 index 000000000..2df920e90 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/Smarty/unit_test/test_cases.php @@ -0,0 +1,450 @@ + 'one', 'two' => 2); + var $ten = 10; + + function meth($a="a", $b="b") { + return "$a:$b"; + } + + function six() { + return 6; + } +} + + +class SmartyTest extends PHPUnit_TestCase { + // contains the object handle of the string class + var $abc; + // contains the last triggered error's errorlevel + var $errorlevel; + + // constructor of the test suite + function SmartyTest($name) { + $this->PHPUnit_TestCase($name); + } + + // called before the test functions will be executed + // this function is defined in PHPUnit_TestCase and overwritten + // here + function setUp() { + // create a new instance of String with the + // string 'abc' + $this->smarty = new Smarty; + } + // called after the test functions are executed + // this function is defined in PHPUnit_TestCase and overwritten + // here + function tearDown() { + // delete your instance + unset($this->smarty); + } + + // dummy errorhandler for functions that are supposed to call trigger_error() + function error_handler($errorlevel) { + if ($errorlevel) $this->errorlevel = $errorlevel; + } + + /* DIRECTORY TESTS */ + + // test that template_dir exists + function test_template_dir_exists() { + $this->assertTrue(file_exists($this->smarty->template_dir)); + } + // test that template_dir is a directory + function test_template_dir_is_dir() { + $this->assertTrue(is_dir($this->smarty->template_dir)); + } + // test that template_dir is readable + function test_template_dir_is_readable() { + $this->assertTrue(is_readable($this->smarty->template_dir)); + } + // test that config_dir exists + function test_config_dir_exists() { + $this->assertTrue(file_exists($this->smarty->config_dir)); + } + // test that config_dir is a directory + function test_config_dir_is_dir() { + $this->assertTrue(is_dir($this->smarty->config_dir)); + } + // test that config_dir is readable + function test_config_dir_is_readable() { + $this->assertTrue(is_readable($this->smarty->config_dir)); + } + // test that compile_dir exists + function test_compile_dir_exists() { + $this->assertTrue(file_exists($this->smarty->compile_dir)); + } + // test that compile_dir is a directory + function test_compile_dir_is_dir() { + $this->assertTrue(is_dir($this->smarty->compile_dir)); + } + // test that compile_dir is readable + function test_compile_dir_is_readable() { + $this->assertTrue(is_readable($this->smarty->compile_dir)); + } + // test that compile_dir is writable + function test_compile_dir_is_writable() { + $this->assertTrue(is_writable($this->smarty->compile_dir)); + } + // test that cache_dir exists + function test_cache_dir_exists() { + $this->assertTrue(file_exists($this->smarty->cache_dir)); + } + // test that cache_dir is a directory + function test_cache_dir_is_dir() { + $this->assertTrue(is_dir($this->smarty->cache_dir)); + } + // test that cache_dir is readable + function test_cache_dir_is_readable() { + $this->assertTrue(is_readable($this->smarty->cache_dir)); + } + // test that cache_dir is writable + function test_cache_dir_is_writable() { + $this->assertTrue(is_writable($this->smarty->cache_dir)); + } + + /* METHOD EXISTS TESTS */ + function test_assign_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'assign')); + } + function test_assign_by_ref_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'assign_by_ref')); + } + function test_append_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'append')); + } + function test_append_by_ref_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'append_by_ref')); + } + function test_clear_assign_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'clear_assign')); + } + function test_register_function_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'register_function')); + } + function test_unregister_function_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'unregister_function')); + } + function test_register_object_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'register_object')); + } + function test_unregister_object_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'unregister_object')); + } + function test_register_block_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'register_block')); + } + function test_unregister_block_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'unregister_block')); + } + function test_register_compiler_function_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'register_compiler_function')); + } + function test_unregister_compiler_function_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'unregister_compiler_function')); + } + function test_register_modifier_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'register_modifier')); + } + function test_unregister_modifier_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'unregister_modifier')); + } + function test_register_resource_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'register_resource')); + } + function test_unregister_resource_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'unregister_resource')); + } + function test_register_prefilter_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'register_prefilter')); + } + function test_unregister_prefilter_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'unregister_prefilter')); + } + function test_register_postfilter_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'register_postfilter')); + } + function test_unregister_postfilter_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'unregister_postfilter')); + } + function test_register_outputfilter_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'register_outputfilter')); + } + function test_unregister_outputfilter_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'unregister_outputfilter')); + } + function test_load_filter_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'load_filter')); + } + function test_clear_cache_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'clear_cache')); + } + function test_clear_all_cache_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'clear_all_cache')); + } + function test_is_cached_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'is_cached')); + } + function test_clear_all_assign_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'clear_all_assign')); + } + function test_clear_compiled_tpl_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'clear_compiled_tpl')); + } + function test_template_exists_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'template_exists')); + } + function test_get_template_vars_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'get_template_vars')); + } + function test_get_config_vars_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'get_config_vars')); + } + function test_trigger_error_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'trigger_error')); + } + function test_display_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'display')); + } + function test_fetch_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'fetch')); + } + function test_config_load_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'config_load')); + } + function test_get_registered_object_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'get_registered_object')); + } + function test_clear_config_method_exists() { + $this->assertTrue(method_exists($this->smarty, 'clear_config')); + } + function test_get_plugin_filepath() { + $this->assertTrue(method_exists($this->smarty, '_get_plugin_filepath')); + } + + + function test_clear_compiled_tpl() { + $this->assertTrue($this->smarty->clear_compiled_tpl()); + } + + /* DISPLAY TESTS */ + + // test that display() executes properly + function test_call_to_display() { + ob_start(); + $this->smarty->display('index.tpl'); + $output = ob_get_contents(); + ob_end_clean(); + $this->assertEquals($output, 'TEST STRING'); + } + + /* FETCH TESTS */ + + // test that fetch() executes properly + function test_call_to_fetch() { + $this->assertEquals($this->smarty->fetch('index.tpl'), 'TEST STRING'); + } + + /* ASSIGN TESTS */ + + // test assigning a simple template variable + function test_assign_var() { + $this->smarty->assign('foo', 'bar'); + $this->assertEquals($this->smarty->fetch('assign_var.tpl'), 'bar'); + } + + /* PARSING TESTS */ + + // test assigning and calling an object + function test_parse_obj_meth() { + $obj = new Obj(); + $this->smarty->assign('obj', $obj); + $this->smarty->assign('foo', 'foo'); + $this->assertEquals('foo:2.5 +2.5:foo +2.5:b +val:foo +foo:val +foo:foo +one:2 +foo:foo:b', $this->smarty->fetch('parse_obj_meth.tpl')); + } + + // test assigning and calling an object + function test_parse_math() { + $obj = new Obj(); + $this->smarty->assign('obj', $obj); + $this->smarty->assign('flt', 2.5); + $this->smarty->assign('items', array(1, 2)); + $this->assertEquals('3 +3.5 +7 +11 +4 +4.5 +8 +12 +12.5 +25 +16 +20 +8.5 +7', $this->smarty->fetch('parse_math.tpl')); + } + + /* CONFIG FILE TESTS */ + + // test assigning a double quoted global variable + function test_config_load_globals_double_quotes() { + // load the global var + $this->smarty->config_load('globals_double_quotes.conf'); + // test that it is assigned + $this->assertEquals($this->smarty->_config[0]['vars']['foo'], 'bar'); + } + + // test assigning a single quoted global variable + function test_config_load_globals_single_quotes() { + // load the global var + $this->smarty->config_load('globals_single_quotes.conf'); + // test that it is assigned + $this->assertEquals($this->smarty->_config[0]['vars']['foo'], 'bar'); + } + + // test loading and running modifier.escape.php + function test_escape_modifier_get_plugins_filepath() { + $filepath = $this->smarty->_get_plugin_filepath('modifier', 'escape'); + $this->assertTrue($filepath); + } + + function test_escape_modifier_include_file() { + $filepath = $this->smarty->_get_plugin_filepath('modifier', 'escape'); + $this->assertTrue(include($filepath)); + } + + function test_escape_modifier_function_exists() { + $this->assertTrue(function_exists('smarty_modifier_escape')); + } + + function test_escape_modifier_escape_default() { + $string = smarty_modifier_escape(""); + $this->assertEquals('<html><body></body></html>', + $string); + } + + function test_escape_modifier_escape_html() { + $string = smarty_modifier_escape("", 'html'); + $this->assertEquals('<html><body></body></html>', + $string); + } + + function test_escape_modifier_escape_htmlall() { + $string = smarty_modifier_escape("", 'htmlall'); + $this->assertEquals('<html><body></body></html>', + $string); + } + + function test_escape_modifier_escape_url() { + $string = smarty_modifier_escape("http://test.com?foo=bar", 'url'); + $this->assertEquals('http%3A%2F%2Ftest.com%3Ffoo%3Dbar', $string); + } + + function test_escape_modifier_escape_quotes() { + $string = smarty_modifier_escape("'\\'\\''", 'quotes'); + $this->assertEquals("\\'\\'\\'\\'", $string); + } + + function test_escape_modifier_escape_hex() { + $string = smarty_modifier_escape("abcd", 'hex'); + $this->assertEquals('%61%62%63%64', $string); + } + + function test_escape_modifier_escape_hexentity() { + $string = smarty_modifier_escape("ABCD", 'hexentity'); + $this->assertEquals('ABCD', $string); + } + + function test_escape_modifier_escape_javascript() { + $string = smarty_modifier_escape("\r\n\\", 'javascript'); + $this->assertEquals('\\r\\n\\\\', $string); + } + + + function test_core_is_secure_file_exists() { + $file = SMARTY_CORE_DIR . 'core.is_secure.php'; + $this->assertTrue(file_exists($file)); + } + + function test_core_is_secure_file_include() { + $file = SMARTY_CORE_DIR . 'core.is_secure.php'; + $this->assertTrue(include($file)); + } + + function test_core_is_secure_function_exists() { + $this->assertTrue(function_exists('smarty_core_is_secure')); + } + + function test_core_is_secure_function_is_secure_true() { + $security = $this->smarty->security; + $this->smarty->security = true; + + /* check if index.tpl is secure (should be true) */ + $params = array('resource_type' => 'file', + 'resource_base_path' => dirname(__FILE__) . '/templates', + 'resource_name' => dirname(__FILE__) . '/templates/index.tpl'); + $this->assertTrue(smarty_core_is_secure($params, $this->smarty)); + $this->smarty->security = $security; + } + + function test_core_is_secure_function_is_secure_false() { + $security = $this->smarty->security; + $this->smarty->security = true; + /* check if test_cases.php is secure (should be false) */ + $params = array('resource_type' => 'file', + 'resource_base_path' => dirname(__FILE__) . '/templates', + 'resource_name' => __FILE__); + $this->assertFalse(smarty_core_is_secure($params, $this->smarty)); + $this->smarty->security = $security; + + } + + // test constants and security + function test_core_is_secure_function_smarty_var_const() { + define('TEST_CONSTANT', 'test constant'); + $this->assertEquals('test constant', $this->smarty->fetch('constant.tpl', + null, 'var_const')); + } + + function test_core_is_secure_function_smarty_var_const_allowed() { + $security = $this->smarty->security; + $security_settings = $this->smarty->security_settings; + $this->smarty->security_settings['ALLOW_CONSTANTS'] = true; + $this->smarty->security = true; + $this->assertEquals('test constant', $this->smarty->fetch('constant.tpl', + null, 'var_const_allowed')); + $this->smarty->security_settings = $security_settings; + $this->smarty->security = $security; + } + + function test_core_is_secure_function_smarty_var_const_not_allowed() { + $security = $this->smarty->security; + $this->smarty->security = true; + /* catch errors: */ + $this->errorlevel = null; + set_error_handler(array(&$this, 'error_handler')); + $this->smarty->fetch('constant.tpl', null, 'var_const_not_allowed'); + restore_error_handler(); + + $this->assertEquals( $this->errorlevel, E_USER_WARNING); + $this->smarty->security = $security; + } + +} + +?> diff --git a/livesupport/modules/htmlUI/var/html/SmartyDynamic_example.php b/livesupport/modules/htmlUI/var/html/SmartyDynamic_example.php new file mode 100644 index 000000000..95f71c8ca --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/SmartyDynamic_example.php @@ -0,0 +1,108 @@ + + * @author Alexey Borzov + * + * $Id: SmartyDynamic_example.php,v 1.1 2005/02/03 16:55:35 sebastian Exp $ + */ + +require_once 'HTML/QuickForm.php'; +require_once 'HTML/QuickForm/Renderer/Array.php'; +// fix this if your Smarty is somewhere else +require_once 'Smarty/libs/Smarty.class.php'; + +$form = new HTML_QuickForm('frmTest', 'post'); + +$form->setDefaults(array( + 'itxtTest' => 'Test Text Box', + 'itxaTest' => 'Hello World', + 'iselTest' => array('B', 'C'), + 'name' => array('first' => 'Thomas', 'last' => 'Schulz'), + 'iradYesNo' => 'Y', + 'ichkABCD' => array('A'=>true,'D'=>true) +)); + +$form->addElement('header', '', 'Normal Elements'); + +$form->addElement('hidden', 'ihidTest', 'hiddenField'); + +$form->addElement('text', 'itxtTest', array('Test Text', 'note' => 'Note for Testtext element.')); + +$form->addElement('textarea', 'itxaTest', 'Test TextArea', 'cols="40" rows="2"'); + +// will be later assigned to style green +$form->addElement('password', 'ipwdTest', 'Test Password'); +$select =& $form->addElement( + 'select', + 'iselTest', + array('Test Select', 'note' => 'We recommend to check at least two categories!'), + array('A'=>'A * * * * (luxory)', 'B'=>'B * * *','C'=>'C * *','D'=>'D * (simple)') + ); +$select->setSize(4); +$select->setMultiple(true); + +$form->addElement('submit', 'isubTest', 'Test Submit'); + +$form->addElement('header', '', 'Grouped Elements'); + +$checkbox[] = &HTML_QuickForm::createElement('checkbox', 'A', null, 'A'); +$checkbox[] = &HTML_QuickForm::createElement('checkbox', 'B', null, 'B'); +$checkbox[] = &HTML_QuickForm::createElement('checkbox', 'C', null, 'C'); +$checkbox[] = &HTML_QuickForm::createElement('checkbox', 'D', null, 'D'); +$form->addGroup($checkbox, 'ichkABCD', 'ABCD', array(' ', '
')); + +// will be later assigned to style fancygroup +$radio[] = &HTML_QuickForm::createElement('radio', null, null, 'Yes', 'Y'); +$radio[] = &HTML_QuickForm::createElement('radio', null, null, 'No', 'N'); +$form->addGroup($radio, 'iradYesNo', 'Yes/No'); + +// will be later assigned to style fancygroup +$name['first'] = &HTML_QuickForm::createElement('text', 'first', 'First:'); +$name['first']->setSize(20); +$name['last'] = &HTML_QuickForm::createElement('text', 'last', 'Last:'); +$name['last']->setSize(30); +$form->addGroup($name, 'name', 'Name'); + +// add some 'required' rules to show "stars" and (possible) errors... +$form->addRule('itxtTest', 'Test Text is a required field', 'required'); +$form->addRule('itxaTest', 'Test TextArea is a required field', 'required'); +$form->addGroupRule('iradYesNo', 'Check Yes or No', 'required'); +$form->addGroupRule('name', array('last' => array(array('Last name is required', 'required')))); + +// try to validate the form +if ($form->validate()) { + $form->freeze(); +} + +$renderer =& new HTML_QuickForm_Renderer_Array(true, true); + +// give some elements aditional style informations +$renderer->setElementStyle(array( + 'ipwdTest' => 'green', + 'iradYesNo' => 'fancygroup', + 'name' => 'fancygroup' +)); + +$form->accept($renderer); + +// setup a template object +$tpl =& new Smarty; +$tpl->template_dir = './templates'; +$tpl->compile_dir = './templates_c'; + +// assign array with form data +$tpl->assign('form', $renderer->toArray()); + +// capture the array stucture +// (only for showing in sample template) +ob_start(); +print_r($renderer->toArray()); +$tpl->assign('dynamic_array', ob_get_contents()); +ob_end_clean(); + +// render and display the template +$tpl->display('smarty-dynamic.tpl'); + +?> diff --git a/livesupport/modules/htmlUI/var/html/SmartyStatic_example.php b/livesupport/modules/htmlUI/var/html/SmartyStatic_example.php new file mode 100644 index 000000000..1bc4ae7e7 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/SmartyStatic_example.php @@ -0,0 +1,137 @@ + + * @author Thomas Schulz + * + * $Id: SmartyStatic_example.php,v 1.1 2005/02/03 16:55:35 sebastian Exp $ + */ + +require_once 'HTML/QuickForm.php'; +require_once 'HTML/QuickForm/Renderer/ArraySmarty.php'; +// fix this if your Smarty is somewhere else +require_once 'Smarty/libs/Smarty.class.php'; + +// Form name will be used to find the placeholders. + +$form = new HTML_QuickForm('form', 'POST'); + +// Fills with some defaults values + +$defaultValues['company'] = 'Mamasam'; +$defaultValues['country'] = array(); +$defaultValues['name'] = array('first'=>'Bertrand', 'last'=>'Mansion'); +$defaultValues['phone'] = array('513', '123', '4567'); +$form->setDefaults($defaultValues); + +// Hidden + +$form->addElement('hidden', 'session', '1234567890'); + +// Personal information + +$form->addElement('header', 'personal', 'Personal Information'); + +$form->addElement('hidden', 'ihidTest', 'hiddenField'); +$form->addElement('text', 'email', 'Your email:'); +$form->addElement('password', 'pass', array('Your password:', 'note'=>'Please, choose a 8-10 characters password.'), 'size=10'); +$name['last'] = &HTML_QuickForm::createElement('text', 'first', 'First', 'size=10'); +$name['first'] = &HTML_QuickForm::createElement('text', 'last', 'Last', 'size=10'); +$form->addGroup($name, 'name', 'Name:', ', '); +$areaCode = &HTML_QuickForm::createElement('text', '', null,'size=4 maxlength=3'); +$phoneNo1 = &HTML_QuickForm::createElement('text', '', null, 'size=4 maxlength=3'); +$phoneNo2 = &HTML_QuickForm::createElement('text', '', null, 'size=5 maxlength=4'); +$form->addGroup(array($areaCode, $phoneNo1, $phoneNo2), 'phone', 'Telephone:', '-'); + +// Company information + +$form->addElement('header', 'company_info', 'Company Information'); + +$form->addElement('text', 'company', 'Company:', 'size=20'); + +$str[] = &HTML_QuickForm::createElement('text', '', null, 'size=20'); +$str[] = &HTML_QuickForm::createElement('text', '', null, 'size=20'); +$form->addGroup($str, 'street', 'Street:', '
'); + +$addr['zip'] = &HTML_QuickForm::createElement('text', 'zip', 'Zip', 'size=6 maxlength=10'); +$addr['city'] = &HTML_QuickForm::createElement('text', 'city', 'City', 'size=15'); +$form->addGroup($addr, 'address', 'Zip, city:'); + +$select = array('' => 'Please select...', 'AU' => 'Australia', 'FR' => 'France', 'DE' => 'Germany', 'IT' => 'Italy'); +$form->addElement('select', 'country', 'Country:', $select); + +$checkbox[] = &HTML_QuickForm::createElement('checkbox', 'A', null, 'A'); +$checkbox[] = &HTML_QuickForm::createElement('checkbox', 'B', null, 'B'); +$checkbox[] = &HTML_QuickForm::createElement('checkbox', 'C', null, 'C'); +$checkbox[] = &HTML_QuickForm::createElement('checkbox', 'D', null, 'D'); +$form->addGroup($checkbox, 'destination', 'Destination:', array(' ', '
')); + +// Other elements + +$form->addElement('checkbox', 'news', '', " Check this box if you don't want to receive our newsletter."); + +$form->addElement('reset', 'reset', 'Reset'); +$form->addElement('submit', 'submit', 'Register'); + +// Adds some validation rules + +$form->addRule('email', 'Email address is required', 'required'); +$form->addGroupRule('name', 'Name is required', 'required'); +$form->addRule('pass', 'Password must be between 8 to 10 characters', 'rangelength', array(8, 10)); +$form->addRule('country', 'Country is a required field', 'required'); +$form->addGroupRule('destination', 'Please check at least two boxes', 'required', null, 2); +$form->addGroupRule('phone', 'Please fill all phone fields', 'required'); +$form->addGroupRule('phone', 'Values must be numeric', 'numeric'); + +$AddrRules['zip'][0] = array('Zip code is required', 'required'); +$AddrRules['zip'][1] = array('Zip code is numeric only', 'numeric'); +$AddrRules['city'][0] = array('City is required', 'required'); +$AddrRules['city'][1] = array('City is letters only', 'lettersonly'); +$form->addGroupRule('address', $AddrRules); + +// Tries to validate the form +if ($form->validate()) { + // Form is validated, then freezes the data + $form->freeze(); +} + +// setup a template object +$tpl =& new Smarty; +$tpl->template_dir = './templates'; +$tpl->compile_dir = './templates_c'; + +$renderer =& new HTML_QuickForm_Renderer_ArraySmarty($tpl, true); + +$renderer->setRequiredTemplate( + '{if $error} + {$label|upper} + {else} + {$label} + {if $required} + * + {/if} + {/if}' + ); + +$renderer->setErrorTemplate( + '{if $error} + {$error}
+ {/if}{$html}' + ); + +$form->accept($renderer); + +// assign array with form data +$tpl->assign('form', $renderer->toArray()); + +// capture the array stucture +ob_start(); +print_r($renderer->toArray()); +$tpl->assign('static_array', ob_get_contents()); +ob_end_clean(); + +// render and display the template +$tpl->display('smarty-static.tpl'); + +?> diff --git a/livesupport/modules/htmlUI/var/html/clock.php b/livesupport/modules/htmlUI/var/html/clock.php new file mode 100644 index 000000000..99a2fa4f6 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/clock.php @@ -0,0 +1,178 @@ + date('H'), + 'minute'=> date('m'), + 'second'=> date('s') +); + +?> + + + + + + + +server time is: +
+local time is:    + diff --git a/livesupport/modules/htmlUI/var/html/img/a_Fernsehturm.jpg b/livesupport/modules/htmlUI/var/html/img/a_Fernsehturm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..80329059580440b4cc8fcf9d5853f69b71048fd5 GIT binary patch literal 18300 zcmbTdcU%)``!||hbuFma5Je#?hzJp5p$p_ulqw)yX<0?32@&Zn^Q;O80+AX4A&Ur+ z8WBS1S?Pj^^iHG%2rY#G2}ver{JrP%p7ZB>&IIyFm@so??)$#J<+?^ZBK`?GWNK() z2>T6sq(cvw7=*!Z-@1PDPuoXs9=@0-7@*h|>&{|DQS z9l!q${rtXT=MHGwxpOD<>emK6@A&Qi`Tzg<$gfZQf7-+?zrBaSe%tli|7@`Td;1MK z#jZbg@7cRg;y2ii|FsW#{$G3lUpo)Me*X;$Z|9C(yLRq`4igFOgY7)L>&ThQ*Z(+b zb$_?K-?1xyC*|%@xKaK^%DR_z_UeOY&-d;-E`8#pjN&<^^U5k}>Kd9_+Bya|Zy6dH zo0!_z+SxnYz31rm@X=#;4^J=ufWV;OkkGIfFQcMkUd6^Gr=+H()egaEgpaSFck9d zzb@YHUm^eYdoc97|9=JjzhnO2A&dWo9p3YsGVIfi-_F2(Km6N{!@r5gVEcFc2EEyF z7>0rg;qMz#N>n!L+*tXPjtq~61By?u#}-q*rC=t-FmJ{kE+r|NrtqJUrgDtH=&jM@ zDEw=yRgLijJ6m^8)N9cf+idW9`K^zRADm95+<1qD7br_`WeIDWVCtMU%2b2@N6V|H zQ_b7n*2kt##c%_~u$@16HmtlmqMQxnp-Im$d+Lnjk>#+qgxT{O zmKPTUI{g;Ommd`v`6vlP|J{7{C3GI>$85W!V^Ed$uYdL&6uR+JK166G!M}uI;?-Xx z4^-NG4VB#VAw^b>>_AWlZKJj2&UbV^qYJvOVc9mKqlizL{V54@`NPbh$wWWXk z*QHFSDcmqiO+J1ZVZvos594p&lb6m*Ja^#JtI> z6T=9mzJ8SPZ7Wsje|$KnN#xL3F2nk`9okQ*CWifIBw2wn4v$8JoAMVD%zP%quud}Z z!}MJ5mGK{7wixy^Q*L+64N(q#pv>oo^D_3*5OP*^{mJ#b#WD1n7`FUDgTU#d5_)jp z$&@Dak^1|2=BL`82n|YZ?f2oJlGXP{6rw`KFugOS?`Kyle9>eTj2O0Si~x>lw|yw= zPq5@i&%FeiwFZ)f8SCHTb3s>HU)Hv*kQ=6?0_*0FpX%ZY|PtF-7xQIZ8 zuLyvRkLWj>`~zax-|(U5)!V=YoAEjLKlBIG7%tI0Q?=8MM1Sz`iDo~SbcZGRa!q(+ zOS(AHojB&1;;2UR5*UrSM}dQi-_os&j`DwuH+u`1Q$Uw@SeJBsB047LO#f#6yDA(I zDjTwYXF0Fv?%jb+*Zxe->WS8`pt0yP&q#m`!Au)9M@s&yF^0umVpU~rB0{T7eAJlp zW?)vN^cXc#EyZk|AIOgtSo6xU2;MB3SNyQ*O?KGYwQR$-R%6QFV_NUy<|j`iKS<$y zJu8NFdGYJ(G`sa{;H3L!45L*$Pyb*jf9=#1Og6d?%<}w^iPERgJ6>nsw%fIO+I>ik zDUGSKnKSaCw${PbuLcXy`H>HVxR_-6ry8Lc*5j3u=cD)0F(Q7Ge|lBQ$k=WXi*Du? zhTVmhwgjP>V9Bt#S)`4+gl?#)I-eLDda^Ocpv?MwC;!S{Dv?vTd-c|2VTqPU!yl`i ztBg2L#;qDt1wJ5?1P$J1LEM4*)xxAZh)6N)QsgAnKh7!Q^&Lt_($NE=Ra#4Sx$Bpo zrIxNZa~H&Q*7$OAWWnCGv$cuSD}P+n{d(bHoVGRU+-zsGrWj_7105YQGK#L|!Z9|Z z)Ll#YXR>IxbknHNle(wz(gec+ zUp4hxMYzO=lvSA&=pAFH0(cHyJ3s|CQ5)!Gg%pu_=vu`z=0u3EswslGzkAn*^x&t) zRo1R%2kN@cT1OVlD=XHfY&`{6b$cp?Q)0ednQ$w%Jn(vfUU;I5_OixH`QlwplRv$x zZcK#qL7BCOIJ9TDq8+a0{2r~5{`-+c`Dh8L=(Yz>d;6@@Nr5E{i1#^CRBpN&_kYY}US2vrNsa647~Tg^A?qgR_KWW&ji zk-D!PBcgN2^3{6^$$!WhuIp&gpmevSp^W`c&7{55Q!M(eWL@1@LJCJSuFln{F+!Gi zJLhuptSeip&jXa~71m%#L=#kB_L@9JAce;Zy1IIFmO;H)5tmj!3YIl~?yCpx|9lx^ z%u2`QG1g1JVZ1+Tq+x)P>zm$P60gLtz;gmU_{#dN{e&gqDxT0t`pV0()558hrrr3k z_$br~H>9|i6Zx2^QfU2B&>#QkAeNI7Gma{XIQR8a%|+Ao3mAc7L~q~bpmH= zHOhJ$9^SQl*@k3C3Ty)Ew~i&g5#C^TF<9fs_zh-7>%M!XQH^xV+Un&@|;J!t2Acjp45}8)35nB_MOe?S%ohNn@|h+ z{xe$F6p2wb(FSi>n^&^EDw^i+#3(K|saSm!!$w(K)?_Mu^*uez+I)Q5j-GK#Mmo_d zu47^Kk;;jsh;3Wv`U?EnGizNH^Nta!&TLE^YEQlFtl25jkq8Y+P5*|6&xiU!-D`pL z`X9Q7TNQiK{NZaG2yIlPytC2zd!T(mbd~2C?y34X`DEH`vS!GKgvM4iSo4lqCpkALNTnrc3`X+PM;5;HSC4A$!W5lgaqs5zMcMPAQAQ5 z%{oxo8a(D#*|79EZ!96qKR1pjwbsAMc~6b*6zRJXh^7f)BGhe%K`68Dd8Y~}oQoSU zz%%U@@$eW12;`gfOP zI9M}y1&G1$kNI#^bkyfGgUM=JLXVMLVuN;g@5QM1Rv@6$-?uV15GZkKk3+!l@EgZA z>gvSTV}8KmSX^>~&a-#m9%Trc$IDZxoBee=4DZGp%Dq%e^LmpHXWJ&f1T-QUC6kfq z?agA?L0#<%OEPOS>+_QLy|Vzy+L&I^Fg&-88g_MdHB$?kdiX3d6JB{E1^8gsjksR* znL>_J4C3@@rJJA+UWUL+kuQePal&;Ho+Xe^_lZlL`dqXSUx=J9bR|~e!kwn-YtR>* zth|U7)NRBxAZbI>B~bZKJj6cb7QpK8{A01=48G4s1I@Kgi*`#RN zZwF4W9SwF;u8cD{&hKw24%jDEC#@x0ZhSU^uYuXcnFE#0K4+q&`iyCw6UhpBO2Ud{ zWic%D0ATg_v=V;i*%Q~p{ZS^iFXHnKMn1B>oKo+uz3xO*Ei$^-Uq5>aJ1#SF`(b(Y zss55h>>ByJWp;bc;b-$`ca!3i+d;YE)7kD8110J3D`S`pMOA+nMy|Vg6 z_usQz1s30ZGm14&$QAylrnYx00p4;vD07og7h{Z>T~|oF4h1+4rowxyS#ERp^k-N#T*U z`wzgtT+nDTXMgWSUuNLye<&GRRDnu6GGj}%WJa{Wl(*a8Cp(54n6%Z~E!zTHGJLS&y)tfIkj~J#W?5M6SUq2f^qP0wK)h%N| zsds^pp=8;!ft6$%sLniDho{;Sb&nM*o9&i)ODbu57DZpduX%E8Q*EA-O?wH5xa1+` zOD*b-tOcooDbE+_-sVGJ?tF7M8nGjq@d!2v$gQwSMpZui+myw)d}WZQH|D zF1r6V&!xhVUCPVb!(C$7>9u4tG3>y&aK^Z@kUln{W1u=$J`PdYWHKL+>xIa4{|+Z# zFRAxy`IcA-;z>b%QYJ1B2XJ!^W|J4LwTo9e+U7uOj!n=JVmT>Zw$B;0?e z>%$>G{-+gO*LwDJVyzZhzRgX`O~31@Zc?i)DW^Xw}f`E@#sjXeJ!D-u3$jHJmu?$ z#on&_`%A$xt-r~&>$y0v5z!N2&T5ucMboo?oN439-j3&d{$foI( znl7e) zCqXf;Ki}BJw21GKk6l;FSl@nW(-a%%1*6_F#D%T*%p9h#`@qnIE>)t;_dwNWh zP90$2nuuJ@7xYNne^`<@b@Waz?@)Ka@;y0J)!oXhBLS9tPq>hsiQ+TRh3JFz!5>0m zexefsMSsx6uu7U^c|S=8GeNuOuFl@ zNJu_!69}itVAfD&^*d(+IqYN2{Z!AzU!#IvbaPumn* z2cB2CTbrhcqBpk%5|CRp_Yv?Bp;27ki_S;!B$T_^E~f*I)}V3oVG~=tsLrH^iP8t< zh35E{)pJ<|7ltx*%mwrKxh$(ukkpL>@3z8)g5kuvSvn-{)}_3<4!>%dRT4Tsx@S+| z2!`%oe2pqfW6(!p6qLv)8ml%e95>L_Qf~kFe ztGMR;8~tOzi6QVByl6^0k93@QB z$tV8(T!t97R6v>JdjU79_y?A1^nj+kCQ$uaL^SnG=g2iLgY3$o7otB_1&tF}+kG;0 zwdjP zCt2S`|2(9)t^7om!x2YHt?{w-3M=5yMJqhdRjxq{Q=nC?MvyQJ*K2Hw^}q$8I&oy& z#auROvsh`|$7<6cP@Vja`Z(EgdttuYnXIVdmFgx)^t6!tekG9_h@S$2d4sN1(oJis z#W95|ULyN<$Lb6V5Rw)|nuRs)8((iScAO#lKJw8_leGz^6-5yFq4y@KXQ*0&;=W7^ zR8PJnBt5v8j^bM$Cihi1$<$TVM_Bug^z_|T!Jxtp)WI-zt@w4s9oo5eq3^@ z!`?EwS^qpw7dU=-tIh@z8J-D;O;l9pG-n&+YLM~*l9y;}?DwEf z8Y{y^uGl@#u^0eWHKn(X+=9U2(@?b|c38?Ht4}gh4C6_Z3pD>$YoNqAD@)Rg;|Sny zf47=(^`D2N_`6dWaV%P*eP_gF;#Z2ukn($^?xemLCWa;0-(68Wp>j0eabXVM7v~XjG z6v$=|Bm<1dV0s*H2{mblo;1uAkb39wWVTt17{(aXh3qHRY3i|Xt4N~n%HgeWMTl{? zy{%{dVJvw1*I>ZVBxH$c**N#?XZ-!(A0h zlr6m?xpdAM=Azx3@@*i>FsKNU3HF#9=>+*Jemv~k0x_&&8=D6F1Gz6s@Nfz@FHoJ> zp~3kyVMC3<={FRPs@;+AO?vxIt4s--8Ab3j>PPjUV2Y zNmoR)b%s$G@kigO^rP9u;{vLwpki800>c_^t`Tq=iv#5$SSxZdk_NBG$!t}J9ZuIE zX^u48LCT-<$WqwDV7{Nch}CcJ0V5y2r3$m8{*Il{$NG?4geEaPETva@diG7)*qmGR z5`w_A;lhnZ_$5v*N~A~_s}HptV;P;W2A`y;i(vyY%NzPflb+Hn8CDCY8mRdZK{N$n zN@*U}z-bMH_*SE6oCZ0Unixgezo{X0W z5+SnLE)DflCx`FX-fQd#$YNHiQt_Jv-B%QQAOg==Q01c<+}7ux_+l)li&oJ&SA|g| zc6m&xk@a`&0LAfNdL&oTpnQCb5Hui&rGlZ>>CoEo6a%?PDuNw5;t$`ltPdYnQa;ii&zD zz>)@jfUVz^1$(4e4TMr6L{GQOvjwlPJXa(ml`^#bP&{~9NLvoA9^C1WFcPaSFEUO@SH|s|; zR{=z>Gp;Wid*B2EOIAz!B{{hksC~WPr|fqT(_%HP>c&#SLyuMR58B`$!&0hoX&W%L z>P0Gqcnq7#j5#Cq=p~3D&wpZppU*-Aw=rsF$N#h&J0oXLGk@7GjKU^OZ|GxIYXH>? z7qEPLJU9Y)M;>7qjrx&YnTVGt)`ccZh*;k;dJQG)BK%=Y^gNQ!*wrMQq(Hi5h*aG2 z15|BPZn8q7pt=OZXk%05^oSP=^zz5iq~Qa?p<2s}p-0#F77Q|Vq{uxn5|xiVDIF-6 zZY+k$`kAGF$P<=X2|jf6z>!4mhvMd9_&jJoa?5VYVc1q=o_LZ zQKna4a3F++;MkJ*##e33>_1_l5)he-I(tP|Sm(ja#1lJq%TbY-ekrB1b5%36D6KkL zew?HFoG}&2=N2ASDz&F6cz9wIs#tcJQ@rA44MKR&5cgxFg}!LcZu{1it0oE*wmws^ zM73kh;MFgziece<;Xq-+cGMc^9KRfwdcjIC>9;RqBM> zzkEDQwX81qv8tLt(E6#|JLXV#M2}D4S&D`R4eM2m!ZMp@n zC>M5%VNr0r%$z*UZXg#D*g&MTi0yYFFxs2#ajl<7KLL#g#H!9z+zr>oY7m6mrS@>% zu6ym=GZW{#Ju3NfPCxppZl4$yvh6Qc?W70It_kiClsmbRCHD!b+Yd6mT&JRoIs5d< zh=3hoAY5RPoC$dgoWq5k)etK7y++R|@(;S|qb(WMh`-j`P~6LQ@Qz=L(l+Ub&%qc{ z#EA+s+N-IfvG_R`qaI-ELMgp|9mSEtzPNDIVkrqx6FgExy;|3Rt($HpTB>vx4;HQz z8kQ((0~b843zd+9ATcaf#OK<_d$7=l9w@N@ZxfWje|HofoYPA&W|s`Z*V zN)47(9^lCw^YpR6cYgfjW$?TJ#XQsR_A)dUGaovPS}|Dfpvj40o=a2GDb@q$Du9ZK z#j%9iFK(NAqoOA1L->MrMM@^S8H@qnB(>AupB+c=ujI^fsz0M>`^=xg`8T^*Cii8nvF{wU;jvqbb40E>{4^hSfTwysRk zwU?4@gi|f5LaUkcc0qi{sUkw!9JwtWam>37#dc_FilxOYsnKBr0jehe7k4ONwm$k&|&Wu9DU*UP8vV_ z(qHaOt8H;Yu_XURm-6(YVTprCx3%-)b1{tQIz9;84SCdZrAzlx%fk~g>Fw?{Wh!=1 zcGbTWmv}s$4>0KH$Aw0nHYS<~aig=CZzuWkN-QR~@ur1i(1|JuxQo?Z4 z&V1-2557%k*%7roG0eBWxt*#1`kY^W)*}^}8|g?%jNlnr1B(#aPy|Svu9futq8_A3 z#3@530kg$3WToy*B=Ba4a0XhAB9&XySVCWNM4>Q2K|+1*_A4rm=TI4Ol6Pj7 zlrVLk!Ww>|MoGo4ncLWBpEXAqRji{z{UiNPqxq7|VSMKN+Xy1E)s1bZm%U$IQyT~y zqQ`;Ue2@0QoHD2XmL|4YHT7;i(ky|*2x11`sfoH9AS?X^UV)A|%aUyRoY{jzrmQqx zr;?% z*-nmsW&+lFo)d5!ILJefLrR)TBOdu&JVgx^!&X zlu(hN;}^$A3;Bete0kJw>XVQ=5E}s$Yi9dn+&?a5ZJ!f(hdzwcqAtYi2i$2(!%y?% zmj6W^-cL|V;bHF9KE}*uj%krl+yJ}w=$3ZL3>%Uqc>i)n0HpMv^+y@;6&5d9j?8?* zfe{0FDBu}_e(_0 z(;#q{)15U1x^f=V67R?2mu^7>Xecvep|84%qkquRsblf|)F-+VajHc7)I~^pkTL0# zsGlbc%=m|Y)ZJJR#@qUE)S)`UQNXF~i^KCGyuQv;%g)8hY5sK&<<+-Tm{1 z3F;s6OB%zmMDt<;F>KFpv&5^EEq|}!%%CLrXGsmtjHNK`BNpxyNo>xMFCY6GStojsRa$9SXqQ%;WA$TQAQ7+{k9PJc{eUuWVt{(hDW|~_UzBn`Uc^}i_3Oiz-o(E z_2Vv|*2~2io*a~R`s*LGq;y26UM?U6I?J#rjJZb#kbPfz#IPcQ&0uD3%&)YpDoyPO zk9Y~H=#yPe{9cA-o)D=tl|i)_@S5!6V z0IOc$!Tuc%$an564DwgcTOxj5%^4uiqK7u+h(Cognct( zaWN10RsF@jxUij}i1g2!_cV^^%@b(Kz?*(5IdafaR4?=qeNZheskbU#wmT zV&!BA6-1TlP<7#;;`3%x@-5L=TDD31;2SY4?0J4DxHY+1>jki`bJ+|_E6dB%s(9R50i(y)MtWSN^w3s6Iad=d~)JfKN z%1pMqIW#k30_wWm?hRgaBbWED{F&^OF`sUU6xjltb^!<2 zSLJG=lLWyWRNv$s&}ma_4gm{xBw>{Pd6Lb^z)DF{=03SOhW*|XuG^9l#m zNhpF?Pz0#3&qdnAUahSjT>H7GZnhT=89|{`#$0KS{zRvqBu&fVT;dK%3yGEN$jJoxF^MogvZSt&H=pvaJaeu}{=tOey zN-V3Qv6nxLQ{-;FyaMDwI>_aN72Ar4`Er1qg>S4jnz+{$Qy>HbdBS8$S zFS#nc^11#(_<4YFSqk+W{SyzB=f1+ncUuS~TlBJmqH5S`WairNhs`kHVWmV{c2Pj7DkFXN9m@m_jM7WRv`LYZR`g{zb!y?_ahXX zPgpSrbu~TxtaUT1Act&e7J8J@ff~*AhaBL-W%wCVhYpaFsxm9wwk3CtT8)Mt9LGJu zO39x?NiwV|u!iLh-W?m%mxSHA-fUdUCMeBvP2Hj(*Qd~^HML2V5uj@=A3D~B`(juD zfTadE?ge|O`+-OBy&5%z-9AMjwc$RQ#Mm{3>!E>H+vkCYi^uzb!WhzFs6D4$lQIJ; z`(5~GO>C}K!56w1hSUTRiHaz}YwJEf{QXm3OXVKOzR{*w?xUtPDA{z4ww@O;bLW9W zSovjF{Q=#sbiu*bkJpA|tQ(K)gx3kozfn13>m(*3x=*c!JpR$nEwCbX3o;ZrGU+l_a zQuuPHe;BkU17{4@&!QVr#-%niU-}&B9P?&i@BWM$%_=x@LiiOy)F|z7lC<=7MK80C zI9Ge+c;lI3ShT)TU2V#p0h0ROkmPO761y&9OHQJ!k(OVagSa+2= z*_&(TYj;A_8^cergpmKsF9!?{P*icF*gvlptsW>^maNe-61e2NC<0aoBTgwff^E~G z0t=bxVPTEE6C_Y}#2EdYg0kk<`>*lqe|>h}dRP+xZ1!EL!`cjbrg4)X&tZMR zD*GPdV=7^)F!GPu7^tQoUkt}E;yT0hht%#+lCBg$R&W5R1ofCXYT1s02YM`!qqy)L z_qr<_*e(Mns`zI`^u#3TucG`yU^Z45_;X=&2rl2r)=pFaU2e6d0t<9cU>`x$ph()X z(TgZnEqv>ye7`WfmZ%LVs&X>y5xI>f&}-N*W#^NllOg`M_W&T%5+l4K;?2@Ib z#sjRCtyZhD8==Q9QH51hV8aR+hWN*jUPOv+|CDogc&I|R?z--}F)b2G*jK-maN=CM zBz1~S%qGwfQmXlV6*#6Tk!f>b4llUYt;VIMk1sLj#)tUOUikbsPAs7SA}eXZ$~ zTU``To2BnMLbB0IucX%XAnWkLZ=N26WIULnu#SU{TYe~nWS;GS8OxDKp#2N_;=SF) zu$R(*u~ukB!$w3hko(pFZIxQlix#L>_Hdk#b1m4&|mj}ZeTCu zyz-wfJd5b5zzEVd4@cA!=dEc!QoL3RNDY|sYY|cTkWe1blQ5_P34Nsohj;l2(MtVN z2}WK1AvY!(jTrEia)HE>77D#-b)dmvBPKA2_!LqIGLUsiX3mOzI9vgY|QNHY2ONDIrObrysffy(K9gD!sw;=6`qsV-2FvV<+a@$xUmjhr{n>1c)FdcA4x=V*1#kK13xun0Hs-f&e2VCr-? z-DrALbIo^z^rqczbFj#apCy#EsBB0)Ic{P$8M{tvfgjV14NN!lM9tXb^V4g?p#EYg zxga&Eo6yYtPnrJr9}~{a`-J0!`Bjc$c`X4IPGGz?t4u?ZP8ul#_RDkl&JERpv(${ zI1e`iP5@YU+7EeSC0=(y4AXRd=%(O>;L5CR;#~-i3utV$3evY4#CBH`qm#JvVIul* z_FYoCe7SISMjh~J350;?KO+%($l6Q-IAvJImR%gTgp#2Ml5cziAD<7iY{c#eRS3go4Diub%&2l$&5vfKeW4GyH5!KE|Ey2d2;8cugEZ86G z3HOOG;}sKm=lI)Q_61dZ?i}bDu6dXRW3WSSczd<}i={Ucrzo0To z!iiq9PDsN+Zv15zhv?Ny-2o2ioIcbRYBfLnZSA{iFTzwM7Fsk($8t+716c2NB8(lF z*t8iyhK#A?y_dcE>`9;6h%{#FA_moe7V5=Axsk4&C9YnTSnZO*iD4!-N-l6|19K{r{k?VblMcVgAI5zRSy&SwB0d zgGyc7;@PTH&E$(F`_>ud`-?X7h4!Wrom5z1=v@lD8fWwP9>6SMhS$ak7#+eJ0asZ%_`0*A+g72 z3+X)wQF}-7Nu^AawTGd^jJb5r{A8odP=e@Ta+ebGT&8J^cb9y#B>q9LL7I4++0@SL#vHQ=>`OY{a0N`K5084lzuH1ZAebhua^&%^EBe(Sq0X zRQwXOOfeRAxl^vLP99-CL%Gk!eM)jCCbK87Yg+H&>tiO=V6@88SoT!KM;9*#f?9v$ zD)ozu5mk$iVGQz+rjX}lxt3-ONtk^9rd94o&`b182mY=LxUu=opRsNG zilEswR*^z?zbQ4G%WYrb3)Ff2vu)K?+c#08*b|>JQL8=2oWCfItlEH)B|sp3$_vfy z5yM7EG~gwAx9(wtz4!1N7Nm)QsEstCn8`VFfb z@$hP7adV?&P2fw+3#*}-r#KB%uwqq~l8^(6+C_X)*5Q2|>=VFL_&sh@Z4y+zNBtoJ zkj;?}l2WQFT~h?cmY3mbIwvLkTIBq;gXgs9kR9eOm+aBWqlC*K} zhU$N+XrD$b1E|a|@HHw&Jp!S_%#P)M62sEM>(y!$VvEUqg{@nVH;d6NTn3nC5J<%6 zU?f$_^1T|G8;3*-Ynw*MwdKir-O)N5#+C!aIb*%Sm=76njN5(DiC70+%;rdcxP zo$NCaFp2pO)gIJG>bFA$c{`rB<`ij>v~$UyRUnUAU%pfd7v{y_m#_zBoVEQ+5a5&3 zsC|QC*ten$S!@UP@%E|LdsQKgumxYC3QqBGvr^sE*m?)qg=kQAy!%vEx}}2k@Fvhz z^;)*Y`MOBZQ-emfj*9e8cOqs94X)_g=01p4rRB4LpU3@y$=CWXVmMzPhb-CZ%N!GJ zL*1j^fKXzZPpEE`W>KTCr+JTuZ?ZO`Vqzk+-;dvykJef(E$xHIb*R6;($|IC5ZymZ z=xg-lWwV2PB8fkA)zyY-PlyJ)XR!0LcYi6@^*-5aU-jQ7`2V0K;&xiL@6B=8VbK> zah#IWkjpT?$_$(!0Kvbe(`Yf@PlZKQK;}oxd&kZDgN(&HQJD<40ks6ZzhYg6J)s7V zB7JrCA=W%jVf-t_s*Z+vK%D^io{$E8vfSR(zuoExF{Eq|&04sqC@`HU{)ww?bRt|X zoCp@pz~|lhET(;o@{hbQ6+tTfjwU=>=p;s6`mUOjRmhAI!=uJ;TRRw4#vh&VUL~RX|)bq z$-gV8l8*z#u#`*Bpz_KmE{cB?^0toRh3Dz(;FDjaoc|8s`Du=sc1BRaZR;k9?#78- z6iJT2M_+6n_RKP8)7rAo7k7<@f8a@jj@{4#m9H6|!-;OAxC?L^s3WqjtLxQ8~@vxj3elsP#|c*x1wwH_;?HjZ7tOS5gvnK!@4yXYq&UC#o^Q7r$s*H3Qf_(JDsp z`fLqQa{^xTbjtEV@veR5=##Jf0v$MCrv{*O+f@l+BmD<&ct)x9fKgitIqJ3f{pk_- zmPYudd1M9X8i+*xGQ_}r>t}Ch5E^iqjV^{-UasF!Gr&wZ7{dtBxtwdEHoJ*MvY{5q z8qTnwmHJZ_VPN_xJVUAu3EdIq?|?7Q)2Z{}Idd0F>v6X~RUYO)ZJ{FB7*N-N=%M2} zcyFJGCdz5NDy?k(vAu_@cU+XFtUq*3zV}}9+4U>e_wV6!E3lG2pz878NN*#o%FJhE z9nF|^KGJI!rm-4MN>G51|FyCBkR{^IH}3Pifw~6KvbknjR#G=SkKnaWJ(;P~^~#h}jg}T^OOCek=M`LEDzW|0NSCP(5pR|SsaS88 zuF-7tKd$DIruOqYYpEH)a%GZJD+Fo6LvB&HC4PvBf;5l|yz;j}Zmn;TcILf{%v+($W0YP$eN3DmEc_)E%a* zz(=g>oOU{O5x7GiKq|RS8^m z$29{3OOUd|E=7sv(dNco_4s3%_z%{FL}AKD{C`J5Y7;w%hQLANzR=;GibhWVg| zfEri1A}Rm6zlA6h#Kaea(L1l91f9c9lzrCkf@DTQ+_@!=8W_ZZ?ge!j!aY#EZ;f@U z2o~&+iq;@q&<3)&6n^%d-Z0tpGzpWZMN}2s+GZHH>(QS`)~e{T>kgov%E{k`rdJ}; zxcLVkK2t#4WS&?We>f?X>F8OGG{^bCnJA8CwySr8o$VI9k80HA!TF2TJDv{7M@6{+ zyD^5_XBN=&@itKB17Y94b0m)+7UP3GCj(dPmWfPR#ww zLyEwx;O5|yMhlu}KOF+@F|u%I>FHbKS}Dkgn-8HfV|8mq#DBwb7LHhh4lf9ktFusv ziV)8uSZ;;ht}{CdZ&U+1+A$4aq;gCta8rR@`#0?W%^fO=}n z?z1aHy&znd(0;e7)p+5*`WQ>3l<*b9FhM0?`h$EWs^p{LrTF`@+DBgVfo44AgIP}( zu6|Il(#F-e4*LWv=Zc8)x@1!XcK+ZNBE~zoJ{MbkX3+Sgtt^I1RT}YRb`WU?51Yo( z8f)a{Pi#ExO23FTBHndWto3otV+J#|9K*8I_e!9~zaB3Cx`MPQ5try6Z9IQvgL}90W#HW0fI7d}$w`KgDrK9QDNIjwLmO zZ$yt}Mr655ZicGQd`()TS%_;WYT`NSils;jN{m>da(6tIgX83ju)F`&$zG;Kxg8hj^2+r=nB=q8Z1RuksPfn z9{_@BjFbq`<;IrITfufXrC&3dCbJUmgp%^ zn@qlL4OR@x!aOdcwz42%XX>6I>xJe6Xr5b|Q)Dq2dxzSW@cLjsXowghG$_(V*cj&k z%g%O}_oIBjP+|$;DpDZna>FTl?DaVJI{I4tRuO7VK=rFsqb~*x9e=(D@5L2ez6%^8 z0iT5@XZCLC)DIoGdxN$LIZluWU3IK4OU;jKY84e#&NMzl&xH;yx#n^7Po_?DpgW%m z3Lnsrh9Ep2OJ$ws=krc9(2^K(`(L(Ea9f{P7l--!3lNQH_wH8<9uJlq62oS|FrMzb z^GJ!&mLqQRL{?wll+huyo?OD%C@7@a|B%I4Az3LM&zX{ff$3x%{)JybCB3RKw6ku2{twsT2FW>f*Y znYvVHmP*@>(}mD|gB$Xrq3{=7hS;x8J_(vs7V#U+v|OT+nN9suPz-gtA^1AA^wfMI zaf2*-EFw{0T7LKNU6B|DoueS6tna(*T2X@&6X@4EW;Jv|9mwC zvyaeO_u;mR09Z-mNHv}lP#PZ!x*pAWbVBMvFctEA#A2S+HI@5`-vQ1^3uD_DfZm2_jmsQD)?;0 zUbZKtn>U7*@;z$OTt=(&@$*;WPwjzc_Aid!GWm9kzwF!f{tx*3)8e?V(tH+|FB0Qp z{Mmg^{Ff1im*{?R;!H1+Q+sk^ss1$T{{WHl*(!)>bawpei}HDY#xY&ym1L@l=jL(uSLt8LnXO3Cy*T}!_y_gQ8Wy*a+E~O(ulrwj z+ZE{AE}Oe)+q-Yx?Oz9tsmj^!;n%aJ>-rv*VG72oi~K**w614@#@^!U=1(r#(ifH6 z`-qj`RZ?y-k5-Nfj`Ds-&bqdxHnFK(Y8O8*oAN^s@Ih>!>f`?awsl@4#?$vze+**1 zIm6k~jDM9V{onBA!%kl!=2UW9{oli-YH3NAX^Q;6-TGG@S#nbK{S9{c9c8{Ze82D= zpZ%`84K5`gKHdl2uL`T>QR%82y~FRz{kS8R&;I~zYwo-upR(e`Px-KTi2c%~Fa5OmKM^5*AFVCD zooX`sqU#428P;0${{Vsi0P)(#@yGm&dWZY= zKl)h}d4KZupZJmH&*NV|(D0P|%U1{SeIu_{r|`>%#0T!j{(t9{bed26doTO{0Q`2m zd|&WaslQfqmj3{M{s#X5&by5-?l1e5;9@tW>mSs*zrp#x(B5CVwebhU{{Zo3sgrST)xtbf&iz$@~v_V)h(l9S<|`x7lc^y#Ws y)%Z#O040VS{=8!U0QA}M9Dn}+B&IIyFm@so??)$#J<+?^ZBK`?GWNK() z2>T6sq(cvw7=*!Z-@1PDPuoXs9=@0-7@*h|>&{|DQS z9l!q${rtXT=MHGwxpOD<>emK6@A&Qi`Tzg<$gfZQf7-+?zrBaSe%tli|7@`Td;1MK z#jZbg@7cRg;y2ii|FsW#{$G3lUpo)Me*X;$Z|9C(yLRq`4igFOgY7)L>&ThQ*Z(+b zb$_?K-?1xyC*|%@xKaK^%DR_z_UeOY&-d;-E`8#pjN&<^^U5k}>Kd9_+Bya|Zy6dH zo0!_z+SxnYz31rm@X=#;4^J=ufWV;OkkGIfFQcMkUd6^Gr=+H()egaEgpaSFck9d zzb@YHUm^eYdoc97|9=JjzhnO2A&dWo9p3YsGVIfi-_F2(Km6N{!@r5gVEcFc2EEyF z7>0rg;qMz#N>n!L+*tXPjtq~61By?u#}-q*rC=t-FmJ{kE+r|NrtqJUrgDtH=&jM@ zDEw=yRgLijJ6m^8)N9cf+idW9`K^zRADm95+<1qD7br_`WeIDWVCtMU%2b2@N6V|H zQ_b7n*2kt##c%_~u$@16HmtlmqMQxnp-Im$d+Lnjk>#+qgxT{O zmKPTUI{g;Ommd`v`6vlP|J{7{C3GI>$85W!V^Ed$uYdL&6uR+JK166G!M}uI;?-Xx z4^-NG4VB#VAw^b>>_AWlZKJj2&UbV^qYJvOVc9mKqlizL{V54@`NPbh$wWWXk z*QHFSDcmqiO+J1ZVZvos594p&lb6m*Ja^#JtI> z6T=9mzJ8SPZ7Wsje|$KnN#xL3F2nk`9okQ*CWifIBw2wn4v$8JoAMVD%zP%quud}Z z!}MJ5mGK{7wixy^Q*L+64N(q#pv>oo^D_3*5OP*^{mJ#b#WD1n7`FUDgTU#d5_)jp z$&@Dak^1|2=BL`82n|YZ?f2oJlGXP{6rw`KFugOS?`Kyle9>eTj2O0Si~x>lw|yw= zPq5@i&%FeiwFZ)f8SCHTb3s>HU)Hv*kQ=6?0_*0FpX%ZY|PtF-7xQIZ8 zuLyvRkLWj>`~zax-|(U5)!V=YoAEjLKlBIG7%tI0Q?=8MM1Sz`iDo~SbcZGRa!q(+ zOS(AHojB&1;;2UR5*UrSM}dQi-_os&j`DwuH+u`1Q$Uw@SeJBsB047LO#f#6yDA(I zDjTwYXF0Fv?%jb+*Zxe->WS8`pt0yP&q#m`!Au)9M@s&yF^0umVpU~rB0{T7eAJlp zW?)vN^cXc#EyZk|AIOgtSo6xU2;MB3SNyQ*O?KGYwQR$-R%6QFV_NUy<|j`iKS<$y zJu8NFdGYJ(G`sa{;H3L!45L*$Pyb*jf9=#1Og6d?%<}w^iPERgJ6>nsw%fIO+I>ik zDUGSKnKSaCw${PbuLcXy`H>HVxR_-6ry8Lc*5j3u=cD)0F(Q7Ge|lBQ$k=WXi*Du? zhTVmhwgjP>V9Bt#S)`4+gl?#)I-eLDda^Ocpv?MwC;!S{Dv?vTd-c|2VTqPU!yl`i ztBg2L#;qDt1wJ5?1P$J1LEM4*)xxAZh)6N)QsgAnKh7!Q^&Lt_($NE=Ra#4Sx$Bpo zrIxNZa~H&Q*7$OAWWnCGv$cuSD}P+n{d(bHoVGRU+-zsGrWj_7105YQGK#L|!Z9|Z z)Ll#YXR>IxbknHNle(wz(gec+ zUp4hxMYzO=lvSA&=pAFH0(cHyJ3s|CQ5)!Gg%pu_=vu`z=0u3EswslGzkAn*^x&t) zRo1R%2kN@cT1OVlD=XHfY&`{6b$cp?Q)0ednQ$w%Jn(vfUU;I5_OixH`QlwplRv$x zZcK#qL7BCOIJ9TDq8+a0{2r~5{`-+c`Dh8L=(Yz>d;6@@Nr5E{i1#^CRBpN&_kYY}US2vrNsa647~Tg^A?qgR_KWW&ji zk-D!PBcgN2^3{6^$$!WhuIp&gpmevSp^W`c&7{55Q!M(eWL@1@LJCJSuFln{F+!Gi zJLhuptSeip&jXa~71m%#L=#kB_L@9JAce;Zy1IIFmO;H)5tmj!3YIl~?yCpx|9lx^ z%u2`QG1g1JVZ1+Tq+x)P>zm$P60gLtz;gmU_{#dN{e&gqDxT0t`pV0()558hrrr3k z_$br~H>9|i6Zx2^QfU2B&>#QkAeNI7Gma{XIQR8a%|+Ao3mAc7L~q~bpmH= zHOhJ$9^SQl*@k3C3Ty)Ew~i&g5#C^TF<9fs_zh-7>%M!XQH^xV+Un&@|;J!t2Acjp45}8)35nB_MOe?S%ohNn@|h+ z{xe$F6p2wb(FSi>n^&^EDw^i+#3(K|saSm!!$w(K)?_Mu^*uez+I)Q5j-GK#Mmo_d zu47^Kk;;jsh;3Wv`U?EnGizNH^Nta!&TLE^YEQlFtl25jkq8Y+P5*|6&xiU!-D`pL z`X9Q7TNQiK{NZaG2yIlPytC2zd!T(mbd~2C?y34X`DEH`vS!GKgvM4iSo4lqCpkALNTnrc3`X+PM;5;HSC4A$!W5lgaqs5zMcMPAQAQ5 z%{oxo8a(D#*|79EZ!96qKR1pjwbsAMc~6b*6zRJXh^7f)BGhe%K`68Dd8Y~}oQoSU zz%%U@@$eW12;`gfOP zI9M}y1&G1$kNI#^bkyfGgUM=JLXVMLVuN;g@5QM1Rv@6$-?uV15GZkKk3+!l@EgZA z>gvSTV}8KmSX^>~&a-#m9%Trc$IDZxoBee=4DZGp%Dq%e^LmpHXWJ&f1T-QUC6kfq z?agA?L0#<%OEPOS>+_QLy|Vzy+L&I^Fg&-88g_MdHB$?kdiX3d6JB{E1^8gsjksR* znL>_J4C3@@rJJA+UWUL+kuQePal&;Ho+Xe^_lZlL`dqXSUx=J9bR|~e!kwn-YtR>* zth|U7)NRBxAZbI>B~bZKJj6cb7QpK8{A01=48G4s1I@Kgi*`#RN zZwF4W9SwF;u8cD{&hKw24%jDEC#@x0ZhSU^uYuXcnFE#0K4+q&`iyCw6UhpBO2Ud{ zWic%D0ATg_v=V;i*%Q~p{ZS^iFXHnKMn1B>oKo+uz3xO*Ei$^-Uq5>aJ1#SF`(b(Y zss55h>>ByJWp;bc;b-$`ca!3i+d;YE)7kD8110J3D`S`pMOA+nMy|Vg6 z_usQz1s30ZGm14&$QAylrnYx00p4;vD07og7h{Z>T~|oF4h1+4rowxyS#ERp^k-N#T*U z`wzgtT+nDTXMgWSUuNLye<&GRRDnu6GGj}%WJa{Wl(*a8Cp(54n6%Z~E!zTHGJLS&y)tfIkj~J#W?5M6SUq2f^qP0wK)h%N| zsds^pp=8;!ft6$%sLniDho{;Sb&nM*o9&i)ODbu57DZpduX%E8Q*EA-O?wH5xa1+` zOD*b-tOcooDbE+_-sVGJ?tF7M8nGjq@d!2v$gQwSMpZui+myw)d}WZQH|D zF1r6V&!xhVUCPVb!(C$7>9u4tG3>y&aK^Z@kUln{W1u=$J`PdYWHKL+>xIa4{|+Z# zFRAxy`IcA-;z>b%QYJ1B2XJ!^W|J4LwTo9e+U7uOj!n=JVmT>Zw$B;0?e z>%$>G{-+gO*LwDJVyzZhzRgX`O~31@Zc?i)DW^Xw}f`E@#sjXeJ!D-u3$jHJmu?$ z#on&_`%A$xt-r~&>$y0v5z!N2&T5ucMboo?oN439-j3&d{$foI( znl7e) zCqXf;Ki}BJw21GKk6l;FSl@nW(-a%%1*6_F#D%T*%p9h#`@qnIE>)t;_dwNWh zP90$2nuuJ@7xYNne^`<@b@Waz?@)Ka@;y0J)!oXhBLS9tPq>hsiQ+TRh3JFz!5>0m zexefsMSsx6uu7U^c|S=8GeNuOuFl@ zNJu_!69}itVAfD&^*d(+IqYN2{Z!AzU!#IvbaPumn* z2cB2CTbrhcqBpk%5|CRp_Yv?Bp;27ki_S;!B$T_^E~f*I)}V3oVG~=tsLrH^iP8t< zh35E{)pJ<|7ltx*%mwrKxh$(ukkpL>@3z8)g5kuvSvn-{)}_3<4!>%dRT4Tsx@S+| z2!`%oe2pqfW6(!p6qLv)8ml%e95>L_Qf~kFe ztGMR;8~tOzi6QVByl6^0k93@QB z$tV8(T!t97R6v>JdjU79_y?A1^nj+kCQ$uaL^SnG=g2iLgY3$o7otB_1&tF}+kG;0 zwdjP zCt2S`|2(9)t^7om!x2YHt?{w-3M=5yMJqhdRjxq{Q=nC?MvyQJ*K2Hw^}q$8I&oy& z#auROvsh`|$7<6cP@Vja`Z(EgdttuYnXIVdmFgx)^t6!tekG9_h@S$2d4sN1(oJis z#W95|ULyN<$Lb6V5Rw)|nuRs)8((iScAO#lKJw8_leGz^6-5yFq4y@KXQ*0&;=W7^ zR8PJnBt5v8j^bM$Cihi1$<$TVM_Bug^z_|T!Jxtp)WI-zt@w4s9oo5eq3^@ z!`?EwS^qpw7dU=-tIh@z8J-D;O;l9pG-n&+YLM~*l9y;}?DwEf z8Y{y^uGl@#u^0eWHKn(X+=9U2(@?b|c38?Ht4}gh4C6_Z3pD>$YoNqAD@)Rg;|Sny zf47=(^`D2N_`6dWaV%P*eP_gF;#Z2ukn($^?xemLCWa;0-(68Wp>j0eabXVM7v~XjG z6v$=|Bm<1dV0s*H2{mblo;1uAkb39wWVTt17{(aXh3qHRY3i|Xt4N~n%HgeWMTl{? zy{%{dVJvw1*I>ZVBxH$c**N#?XZ-!(A0h zlr6m?xpdAM=Azx3@@*i>FsKNU3HF#9=>+*Jemv~k0x_&&8=D6F1Gz6s@Nfz@FHoJ> zp~3kyVMC3<={FRPs@;+AO?vxIt4s--8Ab3j>PPjUV2Y zNmoR)b%s$G@kigO^rP9u;{vLwpki800>c_^t`Tq=iv#5$SSxZdk_NBG$!t}J9ZuIE zX^u48LCT-<$WqwDV7{Nch}CcJ0V5y2r3$m8{*Il{$NG?4geEaPETva@diG7)*qmGR z5`w_A;lhnZ_$5v*N~A~_s}HptV;P;W2A`y;i(vyY%NzPflb+Hn8CDCY8mRdZK{N$n zN@*U}z-bMH_*SE6oCZ0Unixgezo{X0W z5+SnLE)DflCx`FX-fQd#$YNHiQt_Jv-B%QQAOg==Q01c<+}7ux_+l)li&oJ&SA|g| zc6m&xk@a`&0LAfNdL&oTpnQCb5Hui&rGlZ>>CoEo6a%?PDuNw5;t$`ltPdYnQa;ii&zD zz>)@jfUVz^1$(4e4TMr6L{GQOvjwlPJXa(ml`^#bP&{~9NLvoA9^C1WFcPaSFEUO@SH|s|; zR{=z>Gp;Wid*B2EOIAz!B{{hksC~WPr|fqT(_%HP>c&#SLyuMR58B`$!&0hoX&W%L z>P0Gqcnq7#j5#Cq=p~3D&wpZppU*-Aw=rsF$N#h&J0oXLGk@7GjKU^OZ|GxIYXH>? z7qEPLJU9Y)M;>7qjrx&YnTVGt)`ccZh*;k;dJQG)BK%=Y^gNQ!*wrMQq(Hi5h*aG2 z15|BPZn8q7pt=OZXk%05^oSP=^zz5iq~Qa?p<2s}p-0#F77Q|Vq{uxn5|xiVDIF-6 zZY+k$`kAGF$P<=X2|jf6z>!4mhvMd9_&jJoa?5VYVc1q=o_LZ zQKna4a3F++;MkJ*##e33>_1_l5)he-I(tP|Sm(ja#1lJq%TbY-ekrB1b5%36D6KkL zew?HFoG}&2=N2ASDz&F6cz9wIs#tcJQ@rA44MKR&5cgxFg}!LcZu{1it0oE*wmws^ zM73kh;MFgziece<;Xq-+cGMc^9KRfwdcjIC>9;RqBM> zzkEDQwX81qv8tLt(E6#|JLXV#M2}D4S&D`R4eM2m!ZMp@n zC>M5%VNr0r%$z*UZXg#D*g&MTi0yYFFxs2#ajl<7KLL#g#H!9z+zr>oY7m6mrS@>% zu6ym=GZW{#Ju3NfPCxppZl4$yvh6Qc?W70It_kiClsmbRCHD!b+Yd6mT&JRoIs5d< zh=3hoAY5RPoC$dgoWq5k)etK7y++R|@(;S|qb(WMh`-j`P~6LQ@Qz=L(l+Ub&%qc{ z#EA+s+N-IfvG_R`qaI-ELMgp|9mSEtzPNDIVkrqx6FgExy;|3Rt($HpTB>vx4;HQz z8kQ((0~b843zd+9ATcaf#OK<_d$7=l9w@N@ZxfWje|HofoYPA&W|s`Z*V zN)47(9^lCw^YpR6cYgfjW$?TJ#XQsR_A)dUGaovPS}|Dfpvj40o=a2GDb@q$Du9ZK z#j%9iFK(NAqoOA1L->MrMM@^S8H@qnB(>AupB+c=ujI^fsz0M>`^=xg`8T^*Cii8nvF{wU;jvqbb40E>{4^hSfTwysRk zwU?4@gi|f5LaUkcc0qi{sUkw!9JwtWam>37#dc_FilxOYsnKBr0jehe7k4ONwm$k&|&Wu9DU*UP8vV_ z(qHaOt8H;Yu_XURm-6(YVTprCx3%-)b1{tQIz9;84SCdZrAzlx%fk~g>Fw?{Wh!=1 zcGbTWmv}s$4>0KH$Aw0nHYS<~aig=CZzuWkN-QR~@ur1i(1|JuxQo?Z4 z&V1-2557%k*%7roG0eBWxt*#1`kY^W)*}^}8|g?%jNlnr1B(#aPy|Svu9futq8_A3 z#3@530kg$3WToy*B=Ba4a0XhAB9&XySVCWNM4>Q2K|+1*_A4rm=TI4Ol6Pj7 zlrVLk!Ww>|MoGo4ncLWBpEXAqRji{z{UiNPqxq7|VSMKN+Xy1E)s1bZm%U$IQyT~y zqQ`;Ue2@0QoHD2XmL|4YHT7;i(ky|*2x11`sfoH9AS?X^UV)A|%aUyRoY{jzrmQqx zr;?% z*-nmsW&+lFo)d5!ILJefLrR)TBOdu&JVgx^!&X zlu(hN;}^$A3;Bete0kJw>XVQ=5E}s$Yi9dn+&?a5ZJ!f(hdzwcqAtYi2i$2(!%y?% zmj6W^-cL|V;bHF9KE}*uj%krl+yJ}w=$3ZL3>%Uqc>i)n0HpMv^+y@;6&5d9j?8?* zfe{0FDBu}_e(_0 z(;#q{)15U1x^f=V67R?2mu^7>Xecvep|84%qkquRsblf|)F-+VajHc7)I~^pkTL0# zsGlbc%=m|Y)ZJJR#@qUE)S)`UQNXF~i^KCGyuQv;%g)8hY5sK&<<+-Tm{1 z3F;s6OB%zmMDt<;F>KFpv&5^EEq|}!%%CLrXGsmtjHNK`BNpxyNo>xMFCY6GStojsRa$9SXqQ%;WA$TQAQ7+{k9PJc{eUuWVt{(hDW|~_UzBn`Uc^}i_3Oiz-o(E z_2Vv|*2~2io*a~R`s*LGq;y26UM?U6I?J#rjJZb#kbPfz#IPcQ&0uD3%&)YpDoyPO zk9Y~H=#yPe{9cA-o)D=tl|i)_@S5!6V z0IOc$!Tuc%$an564DwgcTOxj5%^4uiqK7u+h(Cognct( zaWN10RsF@jxUij}i1g2!_cV^^%@b(Kz?*(5IdafaR4?=qeNZheskbU#wmT zV&!BA6-1TlP<7#;;`3%x@-5L=TDD31;2SY4?0J4DxHY+1>jki`bJ+|_E6dB%s(9R50i(y)MtWSN^w3s6Iad=d~)JfKN z%1pMqIW#k30_wWm?hRgaBbWED{F&^OF`sUU6xjltb^!<2 zSLJG=lLWyWRNv$s&}ma_4gm{xBw>{Pd6Lb^z)DF{=03SOhW*|XuG^9l#m zNhpF?Pz0#3&qdnAUahSjT>H7GZnhT=89|{`#$0KS{zRvqBu&fVT;dK%3yGEN$jJoxF^MogvZSt&H=pvaJaeu}{=tOey zN-V3Qv6nxLQ{-;FyaMDwI>_aN72Ar4`Er1qg>S4jnz+{$Qy>HbdBS8$S zFS#nc^11#(_<4YFSqk+W{SyzB=f1+ncUuS~TlBJmqH5S`WairNhs`kHVWmV{c2Pj7DkFXN9m@m_jM7WRv`LYZR`g{zb!y?_ahXX zPgpSrbu~TxtaUT1Act&e7J8J@ff~*AhaBL-W%wCVhYpaFsxm9wwk3CtT8)Mt9LGJu zO39x?NiwV|u!iLh-W?m%mxSHA-fUdUCMeBvP2Hj(*Qd~^HML2V5uj@=A3D~B`(juD zfTadE?ge|O`+-OBy&5%z-9AMjwc$RQ#Mm{3>!E>H+vkCYi^uzb!WhzFs6D4$lQIJ; z`(5~GO>C}K!56w1hSUTRiHaz}YwJEf{QXm3OXVKOzR{*w?xUtPDA{z4ww@O;bLW9W zSovjF{Q=#sbiu*bkJpA|tQ(K)gx3kozfn13>m(*3x=*c!JpR$nEwCbX3o;ZrGU+l_a zQuuPHe;BkU17{4@&!QVr#-%niU-}&B9P?&i@BWM$%_=x@LiiOy)F|z7lC<=7MK80C zI9Ge+c;lI3ShT)TU2V#p0h0ROkmPO761y&9OHQJ!k(OVagSa+2= z*_&(TYj;A_8^cergpmKsF9!?{P*icF*gvlptsW>^maNe-61e2NC<0aoBTgwff^E~G z0t=bxVPTEE6C_Y}#2EdYg0kk<`>*lqe|>h}dRP+xZ1!EL!`cjbrg4)X&tZMR zD*GPdV=7^)F!GPu7^tQoUkt}E;yT0hht%#+lCBg$R&W5R1ofCXYT1s02YM`!qqy)L z_qr<_*e(Mns`zI`^u#3TucG`yU^Z45_;X=&2rl2r)=pFaU2e6d0t<9cU>`x$ph()X z(TgZnEqv>ye7`WfmZ%LVs&X>y5xI>f&}-N*W#^NllOg`M_W&T%5+l4K;?2@Ib z#sjRCtyZhD8==Q9QH51hV8aR+hWN*jUPOv+|CDogc&I|R?z--}F)b2G*jK-maN=CM zBz1~S%qGwfQmXlV6*#6Tk!f>b4llUYt;VIMk1sLj#)tUOUikbsPAs7SA}eXZ$~ zTU``To2BnMLbB0IucX%XAnWkLZ=N26WIULnu#SU{TYe~nWS;GS8OxDKp#2N_;=SF) zu$R(*u~ukB!$w3hko(pFZIxQlix#L>_Hdk#b1m4&|mj}ZeTCu zyz-wfJd5b5zzEVd4@cA!=dEc!QoL3RNDY|sYY|cTkWe1blQ5_P34Nsohj;l2(MtVN z2}WK1AvY!(jTrEia)HE>77D#-b)dmvBPKA2_!LqIGLUsiX3mOzI9vgY|QNHY2ONDIrObrysffy(K9gD!sw;=6`qsV-2FvV<+a@$xUmjhr{n>1c)FdcA4x=V*1#kK13xun0Hs-f&e2VCr-? z-DrALbIo^z^rqczbFj#apCy#EsBB0)Ic{P$8M{tvfgjV14NN!lM9tXb^V4g?p#EYg zxga&Eo6yYtPnrJr9}~{a`-J0!`Bjc$c`X4IPGGz?t4u?ZP8ul#_RDkl&JERpv(${ zI1e`iP5@YU+7EeSC0=(y4AXRd=%(O>;L5CR;#~-i3utV$3evY4#CBH`qm#JvVIul* z_FYoCe7SISMjh~J350;?KO+%($l6Q-IAvJImR%gTgp#2Ml5cziAD<7iY{c#eRS3go4Diub%&2l$&5vfKeW4GyH5!KE|Ey2d2;8cugEZ86G z3HOOG;}sKm=lI)Q_61dZ?i}bDu6dXRW3WSSczd<}i={Ucrzo0To z!iiq9PDsN+Zv15zhv?Ny-2o2ioIcbRYBfLnZSA{iFTzwM7Fsk($8t+716c2NB8(lF z*t8iyhK#A?y_dcE>`9;6h%{#FA_moe7V5=Axsk4&C9YnTSnZO*iD4!-N-l6|19K{r{k?VblMcVgAI5zRSy&SwB0d zgGyc7;@PTH&E$(F`_>ud`-?X7h4!Wrom5z1=v@lD8fWwP9>6SMhS$ak7#+eJ0asZ%_`0*A+g72 z3+X)wQF}-7Nu^AawTGd^jJb5r{A8odP=e@Ta+ebGT&8J^cb9y#B>q9LL7I4++0@SL#vHQ=>`OY{a0N`K5084lzuH1ZAebhua^&%^EBe(Sq0X zRQwXOOfeRAxl^vLP99-CL%Gk!eM)jCCbK87Yg+H&>tiO=V6@88SoT!KM;9*#f?9v$ zD)ozu5mk$iVGQz+rjX}lxt3-ONtk^9rd94o&`b182mY=LxUu=opRsNG zilEswR*^z?zbQ4G%WYrb3)Ff2vu)K?+c#08*b|>JQL8=2oWCfItlEH)B|sp3$_vfy z5yM7EG~gwAx9(wtz4!1N7Nm)QsEstCn8`VFfb z@$hP7adV?&P2fw+3#*}-r#KB%uwqq~l8^(6+C_X)*5Q2|>=VFL_&sh@Z4y+zNBtoJ zkj;?}l2WQFT~h?cmY3mbIwvLkTIBq;gXgs9kR9eOm+aBWqlC*K} zhU$N+XrD$b1E|a|@HHw&Jp!S_%#P)M62sEM>(y!$VvEUqg{@nVH;d6NTn3nC5J<%6 zU?f$_^1T|G8;3*-Ynw*MwdKir-O)N5#+C!aIb*%Sm=76njN5(DiC70+%;rdcxP zo$NCaFp2pO)gIJG>bFA$c{`rB<`ij>v~$UyRUnUAU%pfd7v{y_m#_zBoVEQ+5a5&3 zsC|QC*ten$S!@UP@%E|LdsQKgumxYC3QqBGvr^sE*m?)qg=kQAy!%vEx}}2k@Fvhz z^;)*Y`MOBZQ-emfj*9e8cOqs94X)_g=01p4rRB4LpU3@y$=CWXVmMzPhb-CZ%N!GJ zL*1j^fKXzZPpEE`W>KTCr+JTuZ?ZO`Vqzk+-;dvykJef(E$xHIb*R6;($|IC5ZymZ z=xg-lWwV2PB8fkA)zyY-PlyJ)XR!0LcYi6@^*-5aU-jQ7`2V0K;&xiL@6B=8VbK> zah#IWkjpT?$_$(!0Kvbe(`Yf@PlZKQK;}oxd&kZDgN(&HQJD<40ks6ZzhYg6J)s7V zB7JrCA=W%jVf-t_s*Z+vK%D^io{$E8vfSR(zuoExF{Eq|&04sqC@`HU{)ww?bRt|X zoCp@pz~|lhET(;o@{hbQ6+tTfjwU=>=p;s6`mUOjRmhAI!=uJ;TRRw4#vh&VUL~RX|)bq z$-gV8l8*z#u#`*Bpz_KmE{cB?^0toRh3Dz(;FDjaoc|8s`Du=sc1BRaZR;k9?#78- z6iJT2M_+6n_RKP8)7rAo7k7<@f8a@jj@{4#m9H6|!-;OAxC?L^s3WqjtLxQ8~@vxj3elsP#|c*x1wwH_;?HjZ7tOS5gvnK!@4yXYq&UC#o^Q7r$s*H3Qf_(JDsp z`fLqQa{^xTbjtEV@veR5=##Jf0v$MCrv{*O+f@l+BmD<&ct)x9fKgitIqJ3f{pk_- zmPYudd1M9X8i+*xGQ_}r>t}Ch5E^iqjV^{-UasF!Gr&wZ7{dtBxtwdEHoJ*MvY{5q z8qTnwmHJZ_VPN_xJVUAu3EdIq?|?7Q)2Z{}Idd0F>v6X~RUYO)ZJ{FB7*N-N=%M2} zcyFJGCdz5NDy?k(vAu_@cU+XFtUq*3zV}}9+4U>e_wV6!E3lG2pz878NN*#o%FJhE z9nF|^KGJI!rm-4MN>G51|FyCBkR{^IH}3Pifw~6KvbknjR#G=SkKnaWJ(;P~^~#h}jg}T^OOCek=M`LEDzW|0NSCP(5pR|SsaS88 zuF-7tKd$DIruOqYYpEH)a%GZJD+Fo6LvB&HC4PvBf;5l|yz;j}Zmn;TcILf{%v+($W0YP$eN3DmEc_)E%a* zz(=g>oOU{O5x7GiKq|RS8^m z$29{3OOUd|E=7sv(dNco_4s3%_z%{FL}AKD{C`J5Y7;w%hQLANzR=;GibhWVg| zfEri1A}Rm6zlA6h#Kaea(L1l91f9c9lzrCkf@DTQ+_@!=8W_ZZ?ge!j!aY#EZ;f@U z2o~&+iq;@q&<3)&6n^%d-Z0tpGzpWZMN}2s+GZHH>(QS`)~e{T>kgov%E{k`rdJ}; zxcLVkK2t#4WS&?We>f?X>F8OGG{^bCnJA8CwySr8o$VI9k80HA!TF2TJDv{7M@6{+ zyD^5_XBN=&@itKB17Y94b0m)+7UP3GCj(dPmWfPR#ww zLyEwx;O5|yMhlu}KOF+@F|u%I>FHbKS}Dkgn-8HfV|8mq#DBwb7LHhh4lf9ktFusv ziV)8uSZ;;ht}{CdZ&U+1+A$4aq;gCta8rR@`#0?W%^fO=}n z?z1aHy&znd(0;e7)p+5*`WQ>3l<*b9FhM0?`h$EWs^p{LrTF`@+DBgVfo44AgIP}( zu6|Il(#F-e4*LWv=Zc8)x@1!XcK+ZNBE~zoJ{MbkX3+Sgtt^I1RT}YRb`WU?51Yo( z8f)a{Pi#ExO23FTBHndWto3otV+J#|9K*8I_e!9~zaB3Cx`MPQ5try6Z9IQvgL}90W#HW0fI7d}$w`KgDrK9QDNIjwLmO zZ$yt}Mr655ZicGQd`()TS%_;WYT`NSils;jN{m>da(6tIgX83ju)F`&$zG;Kxg8hj^2+r=nB=q8Z1RuksPfn z9{_@BjFbq`<;IrITfufXrC&3dCbJUmgp%^ zn@qlL4OR@x!aOdcwz42%XX>6I>xJe6Xr5b|Q)Dq2dxzSW@cLjsXowghG$_(V*cj&k z%g%O}_oIBjP+|$;DpDZna>FTl?DaVJI{I4tRuO7VK=rFsqb~*x9e=(D@5L2ez6%^8 z0iT5@XZCLC)DIoGdxN$LIZluWU3IK4OU;jKY84e#&NMzl&xH;yx#n^7Po_?DpgW%m z3Lnsrh9Ep2OJ$ws=krc9(2^K(`(L(Ea9f{P7l--!3lNQH_wH8<9uJlq62oS|FrMzb z^GJ!&mLqQRL{?wll+huyo?OD%C@7@a|B%I4Az3LM&zX{ff$3x%{)JybCB3RKw6ku2{twsT2FW>f*Y znYvVHmP*@>(}mD|gB$Xrq3{=7hS;x8J_(vs7V#U+v|OT+nN9suPz-gtA^1AA^wfMI zaf2*-EFw{0T7LKNU6B|DoueS6tna(*T2X@&6X@4EW;Jv|9mwC zvyaeO_u;mR09Z-mNHv}lP#PZ!x*pAWbVBMvFctEA#A2S+HI@5`-vQ1^3uD_DfZm2_jmsQD)?;0 zUbZKtn>U7*@;z$OTt=(&@$*;WPwjzc_Aid!GWm9kzwF!f{tx*3)8e?V(tH+|FB0Qp z{Mmg^{Ff1im*{?R;!H1+Q+sk^ss1$T{{WHl*(!)>bawpei}HDY#xY&ym1L@l=jL(uSLt8LnXO3Cy*T}!_y_gQ8Wy*a+E~O(ulrwj z+ZE{AE}Oe)+q-Yx?Oz9tsmj^!;n%aJ>-rv*VG72oi~K**w614@#@^!U=1(r#(ifH6 z`-qj`RZ?y-k5-Nfj`Ds-&bqdxHnFK(Y8O8*oAN^s@Ih>!>f`?awsl@4#?$vze+**1 zIm6k~jDM9V{onBA!%kl!=2UW9{oli-YH3NAX^Q;6-TGG@S#nbK{S9{c9c8{Ze82D= zpZ%`84K5`gKHdl2uL`T>QR%82y~FRz{kS8R&;I~zYwo-upR(e`Px-KTi2c%~Fa5OmKM^5*AFVCD zooX`sqU#428P;0${{Vsi0P)(#@yGm&dWZY= zKl)h}d4KZupZJmH&*NV|(D0P|%U1{SeIu_{r|`>%#0T!j{(t9{bed26doTO{0Q`2m zd|&WaslQfqmj3{M{s#X5&by5-?l1e5;9@tW>mSs*zrp#x(B5CVwebhU{{Zo3sgrST)xtbf&iz$@~v_V)h(l9S<|`x7lc^y#Ws y)%Z#O040VS{=8!U0QA}M9Dn}+Br!i%ECgN2OLv7>~qd_&UJmizVCavSbuoeyWX3{dY=2apPN6!eI>{$Ni zfS|O{{zKYk!ZHqCki!I+PGVM(2+F*+Ro3zIl8Wx-kR(yD0|()9@<)!Us;O(}ozy>t z#u%Lb`;3L9l{L=E`P_Mz3;(!!`&_x|>*pU38WtWA85K=TzLj!2_0HY2?3~=Zd-oqa z%zs>5Qd&kYuXytOMP2>NhQ_8>@7mtCcQ8A?N%{bmjjFM`Zr zokS6sc~((vt0+p>aY^=a$Y-$wDth0KEdK}Xe=kR z113P_v(Bqc(V{)<{2oH4mV{d)*l+F0>0qpF99_0(>!fvn9;r%_*bkpvLsvjm1xN&v zleP3w7qA?9)}i)LqpWt1mcRDBy|{sYB-zg1)Z2N?(>ZqMc0L)xRgDN|G9URwL5diQ zR)8w7?C4DbwTq>y()Iq4DSww75jsdh$aYrfXKU%^M*ux|++TNJAKsT_I_XG$K$nVI z+*KPs<*OnVVg5SiZq4;Btbat7l0?2+gdA$iF;|X(f&C*kM=Ekt@*s+pJLP0}ELTL3 zJmVC3iBVHiX`n0(a&egfmCm(uSn=WU=$_*294i-U6c6_798ZdF6pBk&z>-aHpbiYP z8mZ1oinTSAA<%pgu|kK{k1^eu+fE%;T@d6aCH(~#)V5QNo1c3$TroGrV$7Sm$6MaG z4VwMdtn7w1Y~s<(1G~hasuX*(t2-tJ_L56z`0Uw^IWlI}>@YCgYGSslUSvVY*lVdb znq0wun8-Zw(VB%-PnkoUu;7lQ+ECH3AEzY?cZu#+s&YKzI-!mf5Zb$yGm_&6$+U~E z5K#q`D#0lFcdO$Tz=;e--}6ZXl(tr?%o(P>%{^{~*{MkBOuMbY*wdqnSxNNnojY8i z5(Y2TI7rsz(N1^)oHB(iN1Z9M?jjcl`f1j=R%9k8_Xn8m6JAhuLzZ}BV|Tf@3Zr$d zT_<oI86E+Cg0&t)eGhmtmy@&lQW!VAb9(!i zd!QbxpAMJzSkWGl6zpO%;&Mq%v%USpQlqbaN0f|DYe9&o8(TZf7ud~)h+s6c@Q+VFQDLMitqz22xA|A>AAr}fMl1!-y4ZYWQqA*vll`!Y2O?<0JV zme>=z5M*jy>SAIYrx}viz-C?ouNMSuVVw zm7VRxP>7#q(D z05uEW60<}&&Lfu#J)Eoz6ho=J@DPwu8VCypdx;Z?5oOm~nIV{Mr;P3<)xz(z{TE5U zIrZ9Z(!pBBivbbBry@(_&|n%DXVwL<2OqptNHNidD7ktxZ3t6uw3~oYNn-A7y23ZuHCCWb+^ zco3u9PF3@Y1v5pM^m@bFNq_muDJRaJeE|kCD%He=g)P@gZM-R2JJUj5EyqKI)uAd< zR!m}?PKYqX3};`?&T%}KC1;MFff9p6;mBC^DMGfbpXUfyxoRqM&U%u7bLKSe_*(

vOTPVs<%>` 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 X?q5$zD+b diff --git a/livesupport/modules/htmlUI/var/html/rightmouseclick.html b/livesupport/modules/htmlUI/var/html/rightmouseclick.html new file mode 100644 index 000000000..a6fe8ac79 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/rightmouseclick.html @@ -0,0 +1,26 @@ + + + + + Untitled + + + + + + +xxxxx + + \ No newline at end of file diff --git a/livesupport/modules/htmlUI/var/html/templates/examples/smarty-dynamic-fancygroup.tpl b/livesupport/modules/htmlUI/var/html/templates/examples/smarty-dynamic-fancygroup.tpl new file mode 100644 index 000000000..f4636586b --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/examples/smarty-dynamic-fancygroup.tpl @@ -0,0 +1,28 @@ + + + + + {if $element.required}*{/if}{$element.label}: + + + + {foreach key=gkey item=gitem from=$element.elements} + + {if $gitem.type eq "radio"} + + {else} + + + {/if} + + {/foreach} +
+ {$gitem.html} + + {if $gitem.required}*{/if} + {$gitem.label} + + {$gitem.html} +
+ + diff --git a/livesupport/modules/htmlUI/var/html/templates/examples/smarty-dynamic-green.tpl b/livesupport/modules/htmlUI/var/html/templates/examples/smarty-dynamic-green.tpl new file mode 100644 index 000000000..38313141e --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/examples/smarty-dynamic-green.tpl @@ -0,0 +1,9 @@ + + + + {$element.label}: + + {if $element.error}{$element.error}
{/if} + {$element.html}{if $element.required}*{/if} + + diff --git a/livesupport/modules/htmlUI/var/html/templates/examples/smarty-dynamic.tpl b/livesupport/modules/htmlUI/var/html/templates/examples/smarty-dynamic.tpl new file mode 100644 index 000000000..a9dfb5520 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/examples/smarty-dynamic.tpl @@ -0,0 +1,134 @@ + + + + + Smarty template for Array renderer + + + + + +{$form.javascript} + + + {$form.hidden} + + {foreach item=sec key=i from=$form.sections} + + + + + {foreach item=element from=$sec.elements} + + + {if $element.style} + {include file="smarty-dynamic-`$element.style`.tpl} + + {* + NOTE: Another way ist to have smarty template code in + $element.style. In this case you can do: + + {if $element.style} + {eval var=$element.style} + *} + + + {elseif $element.type eq "submit" or $element.type eq "reset"} + {if not $form.frozen} + + + + + {/if} + + + {else} + + {if $element.type eq "textarea"} + + + + + {/if} + {/foreach} + {/foreach} + + {if $form.requirednote and not $form.frozen} + + + + + {/if} + + +
+ {$sec.header}
 {$element.html}
+ {if $element.required}*{/if}{$element.label}
+ {else} +
+ {if $element.required}*{/if}{$element.label}: + {/if} + {if $element.error}{$element.error}
{/if} + {if $element.type eq "group"} + {foreach key=gkey item=gitem from=$element.elements} + {$gitem.label} + {$gitem.html}{if $gitem.required}*{/if} + {if $element.separator}{cycle values=$element.separator}{/if} + {/foreach} + {else} + {$element.html} + {/if} +
{$element.label_note}
+
 {$form.requirednote}
+ +  +

Collected Errors:
+{foreach key=name item=error from=$form.errors} + {$error} in element [{$name}]
+{/foreach} +

+ +  +

Best Practice:
+Use only one dynamic form template like this for your
+Smarty driven project. You include this where
+to place a form with the formdata-Array rendered by
+SmartyDynamic QuickForm Renderer as option:

+ +
+{ldelim}include file=form-dynamic.tpl form=$formdata{rdelim}
+
+ +  +

The used "Dynamic" Array

+
+{$dynamic_array|htmlentities}
+
+ + + diff --git a/livesupport/modules/htmlUI/var/html/templates/filedata.tpl b/livesupport/modules/htmlUI/var/html/templates/filedata.tpl new file mode 100644 index 000000000..655d949a1 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/filedata.tpl @@ -0,0 +1,14 @@ +{* Smarty template *} +
+
+{if $fMetaData} + +{/if} +{if $fInfo} + {$fInfo} +{/if} +
+ + + +
diff --git a/livesupport/modules/htmlUI/var/html/templates/footer.tpl b/livesupport/modules/htmlUI/var/html/templates/footer.tpl new file mode 100644 index 000000000..c62269fe9 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/footer.tpl @@ -0,0 +1,6 @@ +{*Smarty template*} + + + + + diff --git a/livesupport/modules/htmlUI/var/html/templates/form_parts/dynForm_plain.tpl b/livesupport/modules/htmlUI/var/html/templates/form_parts/dynForm_plain.tpl new file mode 100644 index 000000000..e2e75d377 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/form_parts/dynForm_plain.tpl @@ -0,0 +1,60 @@ +{$dynform.javascript} + +{$dynform.hidden} + +{foreach item=element from=$dynform.elements} + + + {if $element.style} + {include file="smarty-dynamic-`$element.style`.tpl} + {/if} + {* + NOTE: Another way ist to have smarty template code in + $element.style. In this case you can do: + + {if $element.style} + {eval var=$element.style} + {/if} + *} + + + {if $element.type eq 'static'} + {$element.html} + + {else} +
+ {if $element.required}*{/if} + {if $element.label}{$element.label}:{/if} + + + {if $element.error}{$element.error}
{/if} + {if $element.type eq "group"} + {foreach key=gkey item=gitem from=$element.elements} + {$gitem.label} + {$gitem.html}{if $gitem.required}*{/if} + {if $element.separator}{cycle values=$element.separator}{/if} + {/foreach} + {else} + {$element.html} + {/if} +
{$element.label_note}
+ +
+ {/if} +{/foreach} + + {if $dynform.requirednote and not $dynform.frozen} +
+ {$dynform.requirednote} +
+ {/if} + + + + diff --git a/livesupport/modules/htmlUI/var/html/templates/form_parts/dynForm_sections.tpl b/livesupport/modules/htmlUI/var/html/templates/form_parts/dynForm_sections.tpl new file mode 100644 index 000000000..6581bf304 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/form_parts/dynForm_sections.tpl @@ -0,0 +1,79 @@ +{$dynform.javascript} + + + {$dynform.hidden} + + {foreach item=sec key=i from=$dynform.sections} + + + + + {foreach item=element from=$sec.elements} + + + {if $element.style} + {include file="smarty-dynamic-`$element.style`.tpl} + + {* + NOTE: Another way ist to have smarty template code in + $element.style. In this case you can do: + + {if $element.style} + {eval var=$element.style} + *} + + + {elseif $element.type eq "submit" or $element.type eq "reset"} + {if not $dynform.frozen} + + + + + {/if} + + + {else} + + {if $element.type eq "textarea"} + + + + + {/if} + {/foreach} + {/foreach} + + {if $dynform.requirednote and not $dynform.frozen} + + + + + {/if} + + +
+ {$sec.header}
 {$element.html}
+ {if $element.required}*{/if}{$element.label}
+ {else} +
+ {if $element.required}*{/if}{$element.label}: + {/if} + {if $element.error}{$element.error}
{/if} + {if $element.type eq "group"} + {foreach key=gkey item=gitem from=$element.elements} + {$gitem.label} + {$gitem.html}{if $gitem.required}*{/if} + {if $element.separator}{cycle values=$element.separator}{/if} + {/foreach} + {else} + {$element.html} + {/if} +
{$element.label_note}
+
 {$dynform.requirednote}
+ +  +

Collected Errors:
+{foreach key=name item=error from=$dynform.errors} + {$error} in element [{$name}]
+{/foreach} +

diff --git a/livesupport/modules/htmlUI/var/html/templates/form_parts/error.tpl b/livesupport/modules/htmlUI/var/html/templates/form_parts/error.tpl new file mode 100644 index 000000000..2b7324e08 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/form_parts/error.tpl @@ -0,0 +1 @@ +{if $error}{$error}{/if}{$html} diff --git a/livesupport/modules/htmlUI/var/html/templates/form_parts/required.tpl b/livesupport/modules/htmlUI/var/html/templates/form_parts/required.tpl new file mode 100644 index 000000000..da842f16b --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/form_parts/required.tpl @@ -0,0 +1,10 @@ +{if $error} + {$label|upper} +{else} + {$label} + +{/if} + +{if $required} + * +{/if} diff --git a/livesupport/modules/htmlUI/var/html/templates/form_parts/requirednote.tpl b/livesupport/modules/htmlUI/var/html/templates/form_parts/requirednote.tpl new file mode 100644 index 000000000..9927d8eed --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/form_parts/requirednote.tpl @@ -0,0 +1 @@ +* are required diff --git a/livesupport/modules/htmlUI/var/html/templates/header.tpl b/livesupport/modules/htmlUI/var/html/templates/header.tpl new file mode 100644 index 000000000..b55a645ec --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/header.tpl @@ -0,0 +1,13 @@ +{*Smarty template*} + + + + + + {include file="script/basics.js.tpl"} + + + + + + \ No newline at end of file diff --git a/livesupport/modules/htmlUI/var/html/templates/login.tpl b/livesupport/modules/htmlUI/var/html/templates/login.tpl new file mode 100644 index 000000000..c14a66c3a --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/login.tpl @@ -0,0 +1,19 @@ +{*Smarty template*} + +{include file="header.tpl"} +{$loginform.javascript} + +
+
+
+ {$loginform.hidden} + + + + +
{$loginform.login.label}{$loginform.login.html}
{$loginform.pass.label}{$loginform.pass.html}
{$loginform.requirednote}{$loginform.Submit.html}
+
+
+
+{include file="footer.tpl"} + diff --git a/livesupport/modules/htmlUI/var/html/templates/main.tpl b/livesupport/modules/htmlUI/var/html/templates/main.tpl new file mode 100644 index 000000000..8b7d67c72 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/main.tpl @@ -0,0 +1,7 @@ +{*Smarty template*} + +{include file="header.tpl"} +{include file="masterpanel.tpl"} +{include file="footer.tpl"} + + diff --git a/livesupport/modules/htmlUI/var/html/templates/masterpanel.tpl b/livesupport/modules/htmlUI/var/html/templates/masterpanel.tpl new file mode 100644 index 000000000..7b2a921b2 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/masterpanel.tpl @@ -0,0 +1,55 @@ +{*Smarty template*} +
+ +{include file="statusbar.tpl"} + +{if $showMenuTop} + {include file="menu_top.tpl"} +{/if} + +{if $showPath} + {include file="path.tpl"} +{/if} + +{if $showTree} + {include file="tree.tpl"} +{/if} + +{if $showObjects} + {include file="objects.tpl"} +{/if} + +{if $showPermissions} + {include file="permissions.tpl"} +{/if} + +{if $showNewFileForm} + {include file="newfileform.tpl"} +{/if} + +{if ($showSearchForm || $showSearchRes)} + {include file="search.tpl"} +{/if} + +{if $showSubjects} + {include file="subjects.tpl"} +{/if} + +{if $showFile} + {include file="filedata.tpl"} +{/if} + +{if $showMetaDataForm} + {include file="metadataform.tpl"} +{/if} + +{if $showSystemPrefs} + {include file="systemPrefs.tpl"} +{/if} + +{if $showUploadForm} + {include file="uploadform.tpl"} +{/if} + +
+ diff --git a/livesupport/modules/htmlUI/var/html/templates/menu_top.tpl b/livesupport/modules/htmlUI/var/html/templates/menu_top.tpl new file mode 100644 index 000000000..5b4a22626 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/menu_top.tpl @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/livesupport/modules/htmlUI/var/html/templates/metadataform.tpl b/livesupport/modules/htmlUI/var/html/templates/metadataform.tpl new file mode 100644 index 000000000..e7d7fc558 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/metadataform.tpl @@ -0,0 +1,124 @@ +{literal} + +{/literal} + +
+
+ {$mDataForm.tabs} + {$mDataForm.langswitch} + {foreach from=$mDataForm.pages key=key item=dynform} + {include file="form_parts/dynForm_plain.tpl"} + {/foreach} +
+
+ + diff --git a/livesupport/modules/htmlUI/var/html/templates/newfileform.tpl b/livesupport/modules/htmlUI/var/html/templates/newfileform.tpl new file mode 100644 index 000000000..4fb7f50e4 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/newfileform.tpl @@ -0,0 +1,7 @@ +{*Smarty template*} + +
+
+ {$newfileform} +
+
diff --git a/livesupport/modules/htmlUI/var/html/templates/objects.tpl b/livesupport/modules/htmlUI/var/html/templates/objects.tpl new file mode 100644 index 000000000..880a6cf75 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/objects.tpl @@ -0,0 +1,60 @@ +
+ + +{if $structure.msg} + +{/if} + +{if count($structure.listdata)} + {foreach from=$structure.listdata item=o} + + + + + {/foreach} +{else} + +{/if} +
+ {if $structure.tree} + {str_repeat str=' ' count=$o.level} + {else} + {str_repeat str=' ' count=3} + {/if} + [{$o.name}]:   + + + + {$a.$o.type} +  [rename] +  [move] +  [copy] + {* +  [replicate] + *} +  [permissions] +
+   + {if ($delOverride eq $o.id)} + [DEL] + {else} + [DEL] + {/if} + {if $o.type != 'Folder'} +  [Access] +  [Analyze] +  [MetaData] + {/if} + {if $o.type eq 'Replica'} +   (->$o.target}) + {/if} +   +
No objects
+ +
\ No newline at end of file diff --git a/livesupport/modules/htmlUI/var/html/templates/path.tpl b/livesupport/modules/htmlUI/var/html/templates/path.tpl new file mode 100644 index 000000000..5dd307a2f --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/path.tpl @@ -0,0 +1,17 @@ +{*Smarty template*} + +
+ + [Tree view]  |  + {foreach from=$structure.pathdata item=o} + [{$o.name}] + {if ($o.type eq 'Folder')} + / + {/if} + {/foreach} + + +
diff --git a/livesupport/modules/htmlUI/var/html/templates/permissions.tpl b/livesupport/modules/htmlUI/var/html/templates/permissions.tpl new file mode 100644 index 000000000..f91fbf102 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/permissions.tpl @@ -0,0 +1,67 @@ +
+ + + + + {if (is_array($perms.perms) && count($perms.perms)>0)} + + {foreach from=$perms.perms item=row} + {if $row.type eq 'A'} + {assign var='da' value='allow'} + {else} + {if $row.type eq 'D'} + {assign var='da' value='deny'} + {else} + {assign var='da' value=$row.type} + {/if} + {/if} + + + + + + + + {/foreach} + {else} + + {/if} +
Subject NameActionPermission
{* > *}{$row.login}{$row.action}{$da} + [remove] +
No Permissions set.
+ +
+ +
+ +Add Permission + + +for Action + + +to Subject + + + + +
+ +
\ No newline at end of file diff --git a/livesupport/modules/htmlUI/var/html/templates/popup/_close.tpl b/livesupport/modules/htmlUI/var/html/templates/popup/_close.tpl new file mode 100644 index 000000000..223c4d596 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/popup/_close.tpl @@ -0,0 +1,3 @@ + diff --git a/livesupport/modules/htmlUI/var/html/templates/popup/_reload_parent.tpl b/livesupport/modules/htmlUI/var/html/templates/popup/_reload_parent.tpl new file mode 100644 index 000000000..73898a7fb --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/popup/_reload_parent.tpl @@ -0,0 +1,4 @@ + diff --git a/livesupport/modules/htmlUI/var/html/templates/popup/login.tpl b/livesupport/modules/htmlUI/var/html/templates/popup/login.tpl new file mode 100644 index 000000000..ce27c02e9 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/popup/login.tpl @@ -0,0 +1,22 @@ +{*Smarty template*} + +{include file="header.tpl"} +{$loginform.javascript} + +
+
+
+ {$loginform.hidden} + + + + + +
{$loginform.login.label}{$loginform.login.html}
{$loginform.pass.label}{$loginform.pass.html}
{$loginform.langid.label}{$loginform.langid.html}
{$loginform.requirednote}{$loginform.Submit.html} {$loginform.cancel.html}
+
+
+
+ + + + diff --git a/livesupport/modules/htmlUI/var/html/templates/popup/logout.tpl b/livesupport/modules/htmlUI/var/html/templates/popup/logout.tpl new file mode 100644 index 000000000..b3300f19c --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/popup/logout.tpl @@ -0,0 +1,20 @@ +{*Smarty template*} + +{include file="header.tpl"} + +
+
+
+ + + +
{tra 0='Are you sure to logout $1' 1=$user.login}
+   + +
+
+
+
+ + + diff --git a/livesupport/modules/htmlUI/var/html/templates/popup/signover.tpl b/livesupport/modules/htmlUI/var/html/templates/popup/signover.tpl new file mode 100644 index 000000000..d0d73ae49 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/popup/signover.tpl @@ -0,0 +1,20 @@ +{*Smarty template*} + +{include file="header.tpl"} + +
+
+
+ + + +
{tra 0='Are you sure to logout $1' 1=$user.login}
+   + +
+
+
+
+ + + \ No newline at end of file diff --git a/livesupport/modules/htmlUI/var/html/templates/script/basics.js.tpl b/livesupport/modules/htmlUI/var/html/templates/script/basics.js.tpl new file mode 100644 index 000000000..4a6faacf5 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/script/basics.js.tpl @@ -0,0 +1,49 @@ + diff --git a/livesupport/modules/htmlUI/var/html/templates/script/clock.js.tpl b/livesupport/modules/htmlUI/var/html/templates/script/clock.js.tpl new file mode 100644 index 000000000..994a5d669 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/script/clock.js.tpl @@ -0,0 +1,168 @@ +{literal} + + + + +{/literal} diff --git a/livesupport/modules/htmlUI/var/html/templates/search.tpl b/livesupport/modules/htmlUI/var/html/templates/search.tpl new file mode 100644 index 000000000..6be6cdb1c --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/search.tpl @@ -0,0 +1,35 @@ +{*Smarty template*} + +{if $showSearchForm} + {literal} + + {/literal} +
+
+ {foreach from=$searchform item=dynform} + {include file="form_parts/dynForm_plain.tpl"} + {/foreach} +
+
+{/if} + +{if $showSearchRes} +
+ + {if (count($searchres.search))} + {foreach from=$searchres.search item=s} +
{$s.gunid} + [XML] + [Form] +
+ {/foreach} + {else} + No match found. + {/if} + +
+{/if} \ No newline at end of file diff --git a/livesupport/modules/htmlUI/var/html/templates/smarty-static.tpl b/livesupport/modules/htmlUI/var/html/templates/smarty-static.tpl new file mode 100644 index 000000000..63ca1d56f --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/smarty-static.tpl @@ -0,0 +1,156 @@ + + + + + Smarty template for ArraySmarty renderer: 2 column layout example + +{$form.javascript} + + + + +
+{$form.hidden} + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
{$form.header.personal}
{$form.name.label}{$form.name.error} + + + + + + + + + +
{$form.name.first.html}{$form.name.last.html}
{$form.name.first.label}{$form.name.last.label}
+
{$form.phone.label}{$form.phone.html}
{$form.email.label}{$form.email.html}
{$form.pass.label_note}
{$form.pass.label}{$form.pass.html}
+
+ + + + + + + + + + + + + + + + + + + + + + +
{$form.header.company_info}
{$form.company.label}{$form.company.html}
{$form.street.label}{$form.street.html}
{$form.address.label}{$form.address.error} + + + + + + + + + +
{$form.address.zip.html}{$form.address.city.html}
{$form.address.zip.label}{$form.address.city.label}
+
{$form.country.label}{$form.country.html}
{$form.destination.label}{$form.destination.html}
+
+ + + + + + + + + +
{$form.requirednote}{$form.reset.html} {$form.submit.html}

{$form.news.html}
+ +
+ +
+Collected Errors:
+{foreach key=name item=error from=$form.errors} + {$error} in element [{$name}]
+{/foreach} + +  +

The used "Static" Array

+
+{$static_array|htmlentities}
+
+ + + \ No newline at end of file diff --git a/livesupport/modules/htmlUI/var/html/templates/statusbar.tpl b/livesupport/modules/htmlUI/var/html/templates/statusbar.tpl new file mode 100644 index 000000000..f5c4b5f0f --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/statusbar.tpl @@ -0,0 +1,30 @@ +{include file="script/clock.js.tpl"} +
+ +
+ server time +
+ +
+ +
+ local time +
+ +
+ +
+ +
+ +
+ {$statusbar.stationName} +
+ {$statusbar.frequency} +
+ +
+ {include file="userinfo.tpl"} +
+ +
diff --git a/livesupport/modules/htmlUI/var/html/templates/styles.css b/livesupport/modules/htmlUI/var/html/templates/styles.css new file mode 100644 index 000000000..e1ee45adf --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/styles.css @@ -0,0 +1,147 @@ + body { + background-color : ThreedLightShadow; + font-family : monospace; +} + +#masterpanel { + text-align: center; + background-color : ThreedLightShadow; + height: 610px; + font-family : monospace; +} + +#statusbar { + text-align: center; + width: 610px; + border-style : dotted; + padding : 5px; + height : 70px; +} + +.statusbaritem { + width : 100px; + height : 50px; + border-style : dotted; + padding : 3px; + float : left; +} + +#login { + width : 300px; + border-style : dotted; + padding : 5px; + margin-top: 20px; +} + +#tree { + text-align : left; + width: 610px; + border-style : dotted; + padding : 5px; + margin-top: 20px; +} + +#menu_top { + text-align: center; + width: 610px; + border-style : dotted; + padding : 5px; + margin-top: 10px; +} + +#path { + text-align: center; + width: 610px; + border-style : dotted; + padding : 5px; + margin-top: 10px; +} + +#objects { + width: 610px; + border-style : dotted; + padding : 5px; + margin-top: 10px; +} + + +#permissions { + width: 610px; + border-style : dotted; + padding : 5px; + margin-top: 10px; +} + +#subjects { + width: 610px; + border-style : dotted; + padding : 5px; + margin-top: 10px; +} + +#newfileform { + width: 610px; + border-style : dotted; + padding : 5px; + margin-top: 10px; +} + +#searchform { + width: 610px; + border-style : dotted; + padding : 5px; + margin-top: 10px; +} + +#searchres { + text-align: center; + width: 300px; + border-style : dotted; + padding : 5px; + margin-top: 10px; +} + +#footer { + + text-align: center; + width: 98%; + border-style : dotted; + padding : 5px; + margin-top: 20px; + font-size : x-small; +} + +#filedata { + width: 610px; + border-style : dotted; + padding : 5px; + margin-top: 10px; +} + +#mdataform {; + width: 610px; + border-style : dotted; + padding : 5px; + margin-top: 10px; +} + +.dynformelement { + padding-bottom : 6px; + text-align : right; +} + +#systemPrefs { + width: 610px; + border-style : dotted; + padding : 5px; + margin-top: 10px; +} + +a { + text-decoration: none; +} + +.header { + color: #FFF; + background-color: #999; +} \ No newline at end of file diff --git a/livesupport/modules/htmlUI/var/html/templates/subjects.tpl b/livesupport/modules/htmlUI/var/html/templates/subjects.tpl new file mode 100644 index 000000000..a6ee6814c --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/subjects.tpl @@ -0,0 +1,87 @@ +{* Smarty template *} +
+ +{if $changePassForm} + {$changePassForm} +{/if} + +{if $groups} + + + + {if (is_array($groups.rows) && count($groups.rows)>0)} + {foreach from=$groups.rows item=row} + + + {if ($row.type=='G')}(G){else}(U){/if} + + + {/foreach} + {else} + + {/if} + +
Subjects in group {$groups.gname}
{$row.id} + {if ($row.type=='G')} + {$row.login} + {else} + {$row.login} + {/if} + + + [remove from Group] + +
No Members
+
+ {$addSubj2GroupForm} +{/if} + +{if $subjects} + + + + + {if (is_array($subjects.subj) && count($subjects.subj)>0)} + {foreach from=$subjects.subj item=c} + + + + {if ($c.type == 'G')} + G: {$c.cnt} + {else} + (U) + {/if} + + + + {/foreach} + {else} + + {/if} + +
Subjects
idLoginUser/Group
{$c.id} + {if ($c.type eq 'G')} + {$c.login} + {else} + {$c.login} + {/if} + + [remove] + {if ($c.type != 'G')} + [change Password] + {/if} +
no subject
+ +
+
+ [Add User] +          + [Add Group] +

+ {$addSubjectForm} +
+{/if} + +
\ No newline at end of file diff --git a/livesupport/modules/htmlUI/var/html/templates/systemPrefs.tpl b/livesupport/modules/htmlUI/var/html/templates/systemPrefs.tpl new file mode 100644 index 000000000..a2d34fb2a --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/systemPrefs.tpl @@ -0,0 +1,5 @@ +
+
+{include file="form_parts/dynForm_sections.tpl"} +
+
diff --git a/livesupport/modules/htmlUI/var/html/templates/tree.tpl b/livesupport/modules/htmlUI/var/html/templates/tree.tpl new file mode 100644 index 000000000..5bb17f78c --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/tree.tpl @@ -0,0 +1,20 @@ +{*Smarty template*} + +
+ +{if is_array($structure.treedata)} + {foreach from=$structure.treedata item=o} +
+ {$structure.treedata.type} + {if $structure.treedata.tree} + {str_repeat str=' ' count=3} + {else} + {str_repeat str='  ' count=$o.level} + {/if} + + [{$o.name}]
+
+ {/foreach} +{/if} + +
diff --git a/livesupport/modules/htmlUI/var/html/templates/uploadform.tpl b/livesupport/modules/htmlUI/var/html/templates/uploadform.tpl new file mode 100644 index 000000000..7c87e6246 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/uploadform.tpl @@ -0,0 +1,7 @@ +{*Smarty template*} + +
+
+ {$uploadform} +
+
diff --git a/livesupport/modules/htmlUI/var/html/templates/userinfo.tpl b/livesupport/modules/htmlUI/var/html/templates/userinfo.tpl new file mode 100644 index 000000000..8e7256b76 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/templates/userinfo.tpl @@ -0,0 +1,11 @@ +{*Smarty template*} + +{if $user.userid} + Login: {$user.login} +
+ [{tra 0=logout}] + [{tra 0='sign over'}] +{else} + {tra 0=login} +{/if} + diff --git a/livesupport/modules/htmlUI/var/html/ui_browser.php b/livesupport/modules/htmlUI/var/html/ui_browser.php new file mode 100644 index 000000000..1b2ac660b --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/ui_browser.php @@ -0,0 +1,155 @@ +display('popup/_reload_parent.tpl'); + break; + + case "_close": + $Smarty->display('popup/_close.tpl'); + break; + + case "login": + $Smarty->assign('loginform', $uiBrowser->loginform($Smarty, $ui_fmask)); + $Smarty->display('popup/login.tpl'); + break; + + case "logout": + $Smarty->assign('logouttype', 'logout'); + $Smarty->display('popup/logout.tpl'); + break; + + case "signover_1": + $Smarty->assign('logouttype', 'signover'); + $Smarty->display('popup/logout.tpl'); + break; + + case "signover_2": + $Smarty->assign('loginform', $uiBrowser->loginform($Smarty, $ui_fmask)); + $Smarty->display('popup/login.tpl'); + break; + + } + } + die(); + +}; + +$Smarty->assign('statusbar', $uiBrowser->getStationInfo()); + +if ($uiBrowser->userid) { + $Smarty->assign('showMenuTop', TRUE); + switch ($_REQUEST['act']){ + default: + $Smarty->assign('structure', $uiBrowser->getStructure($uiBrowser->id)); + $Smarty->assign('showPath', TRUE); + + if ($_REQUEST['tree']=='Y') { + $Smarty->assign('showTree', TRUE); + } else { + $Smarty->assign('showObjects', TRUE); + } + $Smarty->assign('delOverride', $_REQUEST['delOverride']); + #$Smarty->assign('obj_types', array('Folder'=>'D', 'File'=>'F', 'Replica'=>'R')); + break; + + case "permissions": + $Smarty->assign('structure', $uiBrowser->getStructure($uiBrowser->id, $_REQUEST['act']=='getHomeDir' ? TRUE : FALSE)); + $Smarty->assign('showPath', TRUE); + + $Smarty->assign('perms', $uiBrowser->getPermissions($uiBrowser->id)); + $Smarty->assign('showPermissions', TRUE); + break; + + + case "newfile": + $Smarty->assign('structure', $uiBrowser->getStructure($uiBrowser->id, $_REQUEST['act']=='getHomeDir' ? TRUE : FALSE)); + $Smarty->assign('showPath', TRUE); + + $Smarty->assign('newfileform', $uiBrowser->getNewFileForm($uiBrowser->id, $ui_fmask['upload'])); + $Smarty->assign('showNewFileForm', TRUE); + break; + + + case "upload_1": + $Smarty->assign('structure', $uiBrowser->getStructure($uiBrowser->id, $_REQUEST['act']=='getHomeDir' ? TRUE : FALSE)); + $Smarty->assign('showPath', FALSE); + + $Smarty->assign('uploadform', $uiBrowser->getUploadFileForm($uiBrowser->id, $ui_fmask['upload_1'])); + $Smarty->assign('showUploadForm', TRUE); + break; + + case "upload_2": + $Smarty->assign('structure', $uiBrowser->getStructure($uiBrowser->id, $_REQUEST['act']=='getHomeDir' ? TRUE : FALSE)); + $Smarty->assign('showPath', FALSE); + + $Smarty->assign('mDataForm', $uiBrowser->getMetaDataForm($uiBrowser->id, $ui_fmask['mData'], FALSE, $uiBrowser->getInfo($id, 'array'))); + $Smarty->assign('showMetaDataForm', TRUE); + break; + + case "search": + if($_REQUEST['doSearch']) { + $Smarty->assign('searchres', $uiBrowser->getSearchRes($uiBrwoser->id, $_REQUEST)); + $Smarty->assign('showSearchRes', TRUE); + } + + + $Smarty->assign('searchform', $uiBrowser->getSearchForm($uiBrowser->id, $_REQUEST, $ui_fmask)); + $Smarty->assign('showSearchForm', TRUE); + + break; + + case "subjects": + case "addUser": + case "addGroup": + $Smarty->assign('subjects', $uiBrowser->getSubjects()); + switch($_REQUEST['act']) { + case "addUser": $Smarty->assign('addSubjectForm', $uiBrowser->getAddSubjectForm($ui_fmask['addUser'])); break; + case "addGroup": $Smarty->assign('addSubjectForm', $uiBrowser->getAddSubjectForm($ui_fmask['addGroup'])); break; + } + $Smarty->assign('showSubjects', TRUE); + break; + + case "passwd": + $Smarty->assign('changePassForm', $uiBrowser->getChangePasswdForm($_REQUEST['uid'], $ui_fmask['chgPasswd'])); + $Smarty->assign('showSubjects', TRUE); + break; + + case "groups": + $Smarty->assign('groups', $uiBrowser->getGroups($uiBrowser->id)); + $Smarty->assign('addSubj2GroupForm', $uiBrowser->getSubj2GroupForm($uiBrowser->id)); + $Smarty->assign('showSubjects', TRUE); + break; + + case "getFile": + $Smarty->assign('fData', $uiBrowser->getFile($uiBrowser->id)); + $Smarty->assign('showFile', TRUE); + break; + + case "getMdata": + $Smarty->assign('fMetaData', $uiBrowser->getMdata($uiBrowser->id)); + $Smarty->assign('showFile', TRUE); + break; + + case "editMetaDataValues": + $Smarty->assign('mDataForm', $uiBrowser->getMetaDataForm($uiBrowser->id, $ui_fmask['mData'], TRUE)); + $Smarty->assign('showMetaDataForm', TRUE); + break; + + case "getInfo": + $Smarty->assign('fInfo', $uiBrowser->getInfo($uiBrowser->id)); + $Smarty->assign('showFile', TRUE); + break; + + case "systemPrefs": + $Smarty->assign('dynform', $uiBrowser->systemPrefs($ui_fmask['systemPrefs'])); + $Smarty->assign('showSystemPrefs', TRUE); + break; + } +} + +$Smarty->display('main.tpl'); +?> diff --git a/livesupport/modules/htmlUI/var/html/ui_handler.php b/livesupport/modules/htmlUI/var/html/ui_handler.php new file mode 100644 index 000000000..9df9896b1 --- /dev/null +++ b/livesupport/modules/htmlUI/var/html/ui_handler.php @@ -0,0 +1,97 @@ +login($_REQUEST, $ui_fmask["loginform"]); + break; + + case "logout": + $uiHandler->logout(); + break; + + case "signover": + $uiHandler->logout(TRUE); + break; + + case "upload": ## media- and metadata file together + $uiHandler->upload(array_merge($_REQUEST, $_FILES), $uiHandler->id, $ui_fmask["upload"]); + break; + + case "upload_1": ## first upload + $uiHandler->upload_1(array_merge($_REQUEST, $_FILES), $uiHandler->id, $ui_fmask["upload_1"]); + break; + + case "upload_2": ## then edit metadata + + break; + + case "newFolder": + $uiHandler->newFolder($_REQUEST["newname"], $uiHandler->id); + break; + + case "rename": + $uiHandler->rename($_REQUEST["newname"], $uiHandler->id); + break; + + case "move": + $uiHandler->move($_REQUEST["newPath"], $uiHandler->id); + break; + + case "copy": + $uiHandler->copy($_REQUEST["newPath"], $uiHandler->id); + break; + + case "delete": + $uiHandler->delete($uiHandler->id, $_REQUEST["delOverride"]); + break; + + case "addUser": + $uiHandler->addSubj($_REQUEST, $ui_fmask["addUser"]); + break; + + case "addGroup": + $uiHandler->addSubj($_REQUEST, $ui_fmask["addGroup"]); + break; + + case "removeSubj": + $uiHandler->removeSubj($_REQUEST["login"]); + break; + + case "changePasswd": + $uiHandler->passwd($_REQUEST["uid"], $_REQUEST["oldpass"], $_REQUEST["pass"], $_REQUEST["pass2"]); + break; + + case "addPerm": + $uiHandler->addPerm($_REQUEST["subj"], $_REQUEST["permAction"], $uiHandler->id, $_REQUEST["allowDeny"]); + break; + + case "removePerm": + $uiHandler->removePerm($_REQUEST["permid"], $_REQUEST["oid"]); + break; + + case "addSubj2Group": + $uiHandler->addSubj2Group($_REQUEST["login"], $_REQUEST["gname"], $_REQUEST["reid"]); + break; + + case "removeSubjFromGr": + $uiHandler->removeSubjFromGr($_REQUEST["login"], $_REQUEST["gname"], $_REQUEST["reid"]); + break; + + case "systemPrefs": + $uiHandler->storeSystemPrefs(array_merge($_REQUEST, $_FILES), $ui_fmask["systemPrefs"]); + break; + + case "editMetaDataValues": + $uiHandler->storeMetaData($_REQUEST, $ui_fmask["mData"]); + break; + + default: + $_SESSION["alertMsg"] = $uiHandler->tra("Unknown method: ").$_REQUEST["act"]; + header("Location: ".UI_BROWSER); + die(); +} +if ($uiHandler->alertMsg) $_SESSION['alertMsg'] = $uiHandler->alertMsg; +header('Location: '.$uiHandler->redirUrl); +?> diff --git a/livesupport/modules/htmlUI/var/index.php b/livesupport/modules/htmlUI/var/index.php new file mode 100644 index 000000000..0715bf676 --- /dev/null +++ b/livesupport/modules/htmlUI/var/index.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/livesupport/modules/htmlUI/var/rules.html b/livesupport/modules/htmlUI/var/rules.html new file mode 100644 index 000000000..884a685b6 --- /dev/null +++ b/livesupport/modules/htmlUI/var/rules.html @@ -0,0 +1,93 @@ + + + + + +
+

 

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Rule NameArgumentRule Description
requiredSome input is required in the field.
maxlength$lengthThe input can be at most $length characters.
minlength$lengthThe input must be at least $length + characters.
rangelength$min,$maxThe input must be between $min and $max characters + (inclusive).
regex$rxThe input must match the regular expression + $rx.
emailThe input must be a likely syntactically valid e-mail + address.*
emailorblankThe input must be blank or satisfy the email rule. +
lettersonlyThe input must contain only alphabetic + characters.
alphanumericThe input must contain only letters and numbers. +
numericThe input must contain a valid positive or negative + integer or decimal number.
nopunctuationThe input must not contain any of these characters: ( ) . + / * ^ ? # ! @ $ % + = , " ' > < ~ [ ] { }.
nonzeroThe input must not begin with zero.
uploadedfileThe element must contain a successfully uploaded + file.
maxfilesize$sizeThe uploaded file must be no more than $size + bytes.
mimetype$mimeThe uploaded file must have a MIME type of $mime. If + $mime is an array of MIME types, the uploaded file must have a MIME type + equal to one of the elements in $mime.
filename$file_rxThe uploaded file must have a filename that matches the + regular expression +$file_rx.

diff --git a/livesupport/modules/htmlUI/var/ui_base.inc.php b/livesupport/modules/htmlUI/var/ui_base.inc.php new file mode 100644 index 000000000..845cc7bf2 --- /dev/null +++ b/livesupport/modules/htmlUI/var/ui_base.inc.php @@ -0,0 +1,186 @@ +gm:\n".$err->getMessage()."\ndi:\n".$err->getDebugInfo()."\nui:\n".$err->getUserInfo()."\n"; + echo "
BackTrace:\n"; + print_r($err->backtrace); + echo "\n"; + exit; +} + +/** + * uiBase class + * + * LiveSupport HTML User Interface module + * + */ +class uiBase +{ + // --- basic funtionality --- + /** + * tra + * + * Translate the given string using localisation files. + * + * @param input string, string to translate + * @return string, translated string + */ + function tra($input) + { + // just a dummy function yet + $nr=func_num_args(); + if ($nr>1) + for ($i=1; $i<$nr; $i++){ + $name = '$'.$i; + $val = func_get_arg($i); + $input = str_replace($name, $val, $input); + } + return $input; + } + + + /** + * _parseArr2Form + * + * Add elements/rules/groups to an given HTML_QuickForm object + * + * @param form object, reference to HTML_QuickForm object + * @param mask array, reference to array defining to form elements + * @param side string, side where the validation should beeing + */ + function _parseArr2Form(&$form, &$mask, $side='client') + { + foreach($mask as $k=>$v) { + ## add elements ######################## + if ($v['type']=='radio') { + foreach($v['options'] as $rk=>$rv) { + $radio[] =& $form->createElement($v['type'], NULL, NULL, $rv, $rk, $v['attributes']); + } + $form->addGroup($radio, $v['element'], $this->tra($v['label'])); + unset($radio); + + } elseif ($v['type']=='select') { + $elem[$v['element']] =& $form->createElement($v['type'], $v['element'], $this->tra($v['label']), $v['options'], $v['attributes']); + $elem[$v['element']]->setMultiple($v['multiple']); + if (isset($v['selected'])) $elem[$v['element']]->setSelected($v['selected']); + if (!$v['groupit']) $form->addElement($elem[$v['element']]); + + } elseif ($v['type']=='date') { + $elem[$v['element']] =& $form->createElement($v['type'], $v['element'], $this->tra($v['label']), $v['options'], $v['attributes']); + if (!$v['groupit']) $form->addElement($elem[$v['element']]); + + } elseif ($v['type']=='checkbox' || $v['type']=='static') { + $elem[$v['element']] =& $form->createElement($v['type'], $v['element'], $this->tra($v['label']), $v['text'], $v['attributes']); + if (!$v['groupit']) $form->addElement($elem[$v['element']]); + + } elseif (isset($v['type'])) { + $elem[$v['element']] =& $form->createElement($v['type'], $v['element'], $this->tra($v['label']), + ($v[type]=='text' || $v['type']=='file' || $v['type']=='password') ? array_merge($v['attributes'], array('size'=>UI_INPUT_STANDARD_SIZE, 'maxlength'=>UI_INPUT_STANDARD_MAXLENGTH)) : + ($v['type']=='textarea' ? array_merge($v['attributes'], array('rows'=>UI_TEXTAREA_STANDART_ROWS, 'cols'=>UI_TEXTAREA_STANDART_COLS)) : $v['attributes']) + ); + if (!$v['groupit']) $form->addElement($elem[$v['element']]); + } + ## add required rule ################### + if ($v['required']) { + $form->addRule($v['element'], isset($v['requiredmsg'])?$this->tra($v['requiredmsg']):$this->tra('Missing value for $1', $this->tra($v['label'])), 'required', NULL, $side); + } + ## add constant value ################## + if (isset($v['constant'])) { + $form->setConstants(array($v['element']=>$v['constant'])); + } + ## add default value ################### + if (isset($v['default'])) { + $form->setDefaults(array($v['element']=>$v['default'])); + } + ## add other rules ##################### + if ($v['rule']) { + $form->addRule($v['element'], isset($v['rulemsg']) ? $this->tra($v['rulemsg']) : $this->tra('$1 must be $2', $this->tra($v['element']), $this->tra($v['rule'])), $v['rule'] ,$v['format'], $side); + } + ## add group ########################### + if (is_array($v['group'])) { + foreach($v['group'] as $val) { + $groupthose[] =& $elem[$val]; + } + $form->addGroup($groupthose, $v['name'], $this->tra($v['label']), $v['seperator'], $v['appendName']); + unset($groupthose); + } + ## check error on type file ########## + if ($v['type']=='file') { + if ($_POST[$v['element']]['error']) { + $form->setElementError($v['element'], isset($v['requiredmsg']) ? $this->tra($v['requiredmsg']) : $this->tra('Missing value for $1', $this->tra($v['label']))); + } + } + } + + reset($mask); + + $form->validate(); + } + + + /** + * _dateArr2Str + * + * Converts date-array from form into string + * + * @param input array, reference to array of form-elements + */ + function _dateArr2Str(&$input) + { + foreach ($input as $k=>$v){ + if (is_array($v) && isset($v['d']) && (isset($v['M']) || isset($v['m'])) && (isset($v['Y']) || isset($v['y']))){ + $input[$k] = $v['Y'].$v['y'].'-'.(strlen($v['M'].$v['m'])==2 ? $v['M'].$v['m'] : '0'.$v['M'].$v['m']).'-'.(strlen($v['d'])==2 ? $v['d'] : '0'.$v['d']); + } + } + } + + + /** + * getInfo + * + * Call getid3 library to analyze media file and show some results + * + * @param $id int local ID of file + * @param $format string + */ + function getInfo($id, $format) + { + $ia = $this->gb->analyzeFile($id, $this->sessid); + + if ($format=='array') { + return array( + 'Format.Extent' => $ia['playtime_seconds'], + 'Format.Medium.Bitrate' => $ia['audio']['bitrate'], + 'Format.Medium.Channels' => $ia['audio']['channelmode'], + 'Format.Medium.Samplerate' => $ia['audio']['sample_rate'], + 'Format.Medium.Encoder' => $ia['audio']['codec'] ? $ia['audio']['codec'] : $ia['audio']['encoder'], + ); + } elseif ($format=='text') { + return "fileformat: {$ia['fileformat']}
+ channels: {$ia['audio']['channels']}
+ sample_rate: {$ia['audio']['sample_rate']}
+ bits_per_sample: {$ia['audio']['bits_per_sample']}
+ channelmode: {$ia['audio']['channelmode']}
+ title: {$ia['id3v1']['title']}
+ artist: {$ia['id3v1']['artist']}
+ comment: {$ia['id3v1']['comment']}"; + } elseif ($format=='xml') { + return + ' + + + taken from test xml + 00:30:00.000000 + + '; + + } + } +} +?> diff --git a/livesupport/modules/htmlUI/var/ui_browser.class.php b/livesupport/modules/htmlUI/var/ui_browser.class.php new file mode 100644 index 000000000..8070004f6 --- /dev/null +++ b/livesupport/modules/htmlUI/var/ui_browser.class.php @@ -0,0 +1,557 @@ +getMessage()); + } + $dbc->setFetchMode(DB_FETCHMODE_ASSOC); + $this->gb =& new GreenBox(&$dbc, $config); + $this->sessid = $_REQUEST[$config['authCookieName']]; + $this->userid = $this->gb->getSessUserId($this->sessid); + $this->login = $this->gb->getSessLogin($this->sessid); + $this->id = $_REQUEST['id'] ? $_REQUEST['id'] : $this->gb->getObjId($this->login, $this->gb->storId); + $this->InputTextStandardAttrib = array('size' =>UI_INPUT_STANDARD_SIZE, + 'maxlength'=>UI_INPUT_STANDARD_MAXLENGTH); + + + + } + + // --- error handling --- + /** + * alertMsg + * + * takes error message from session var + * + * @return string + */ + + function alertMsg() + { + if ($_SESSION['alertMsg']) { + $this->alertMsg = $_SESSION['alertMsg']; + unset($_SESSION['alertMsg']); + return $this->alertMsg; + } + return false; + } + + + function getStationInfo() + { + $a['frequency'] = $this->gb->loadGroupPref($this->sessid, 'StationPrefs', 'frequency'); + $a['stationName'] = $this->gb->loadGroupPref($this->sessid, 'StationPrefs', 'stationName'); + $a['stationLogoPath'] = $this->gb->loadGroupPref($this->sessid, 'StationPrefs', 'stationLogoPath'); + + return $a; + } + + // --- template feed --- + /** + * loginform + * + * create a login-form + * + * @param string $faillogin login name of failed login process + * @return string (html) + */ + function loginform(&$Smarty, &$mask) + { + $form = new HTML_QuickForm('loginbox', UI_STANDARD_FORM_METHOD, UI_HANDLER); + $form->setRequiredNote(file_get_contents(UI_QFORM_REQUIREDNOTE)); + $this->_parseArr2Form($form, $mask['loginform']); + $this->_parseArr2Form($form, $mask['languages']); + + ## using Static Smarty Renderer + $renderer =& new HTML_QuickForm_Renderer_ArraySmarty($Smarty, true); + $renderer->setRequiredTemplate(file_get_contents(UI_QFORM_REQUIRED)); + #$renderer->setErrorTemplate(file_get_contents(UI_QFORM_ERROR)); + + $form->accept($renderer); + + return $renderer->toArray(); + } + + + + + /** + * getUserInfo + * + * get info about logged in user + * + * @return array uname=>user Name, uid=>user ID + */ + function getUserInfo() + { + return array('uname'=>$this->gb->getSessLogin($this->sessid), + 'uid' =>$this->gb->getSessUserId($this->sessid)); + } + + /** + * getStructure + * + * get directory-structure + * + * @param int local ID of start-directory + * @param boolean $homedir TRUE: get homedir of current user + + * @eturn array tree of directory with subs + */ + function getStructure($id) + { + $data=array_merge($data, array( + 'pathdata' => $this->gb->getPath($id, $this->sessid), + 'listdata' => ($this->gb->getObjType($id)=='Folder'? + $this->gb->listFolder($id, $this->sessid):array() + ), + 'tree' => ($_REQUEST['tree']=='Y'), + 'showPath' => true, + 'showTree' => true, + )); + if($_REQUEST['tree']=='Y'){ + $data['treedata'] = $this->gb->getSubTree($id, $this->sessid); + } + + if(PEAR::isError($data['listdata'])){ + $data['msg'] = $data['listdata']->getMessage(); + $data['listdata'] = array(); + } + + return $data; + } + + + /** + * getNewFileForm + * + * create a form for file-upload + * + * @param int local $id of directory to store file in + * + * @eturn string (html) + */ + function getNewFileForm($id, $mask) + { + $form = new HTML_QuickForm('newfile', UI_STANDARD_FORM_METHOD, UI_HANDLER); + $form->setMaxFileSize($this->gb->loadGroupPref($this->sessid, 'StationPrefs', 'maxfilesize')); + $form->setConstants(array('id' => $id)); + + $this->_parseArr2Form($form, $mask); + + return $form->toHTML(); + } + + + /** + * getUploadFileForm + * + * create a form for file-upload + * + * @param int local $id of directory to store file in + * + * @eturn string (html) + */ + function getUploadFileForm($id, $mask) + { + $form = new HTML_QuickForm('upload', UI_STANDARD_FORM_METHOD, UI_HANDLER); + $form->setMaxFileSize($this->gb->loadGroupPref($this->sessid, 'StationPrefs', 'maxfilesize')); + $form->setConstants(array('id' => $id)); + + $this->_parseArr2Form($form, $mask); + + return $form->toHTML(); + } + + + /** + * getSubjects + * + * get all GreenBox subjects (users/groups) + * + * @return array subj=>unique id of subject, loggedAs=>corresponding login name + */ + function getSubjects() + { + return array('subj' => $this->gb->getSubjectsWCnt(), + 'loggedAs' => $this->login + ); + } + + + /** + * addSubjectForm + * + * create a form to add GreenBox subjects (users/groups) + * + * @return string (html) + */ + function getAddSubjectForm($mask) + { + $form = new HTML_QuickForm('addSubject', UI_STANDARD_FORM_METHOD, UI_HANDLER); + $this->_parseArr2Form($form, $mask); + return $form->toHTML(); + } + + /** + * getChangePasswdForm + * + * create a form to change user-passwords in GreenBox + * + * @return string (html) + */ + function getChangePasswdForm($uid, &$mask) + { + $form = new HTML_QuickForm('changePasswd', UI_STANDARD_FORM_METHOD, UI_HANDLER); + $form->setConstants(array('act'=>'changePasswd', + 'uid'=>$uid)); + $this->_parseArr2Form($form, $mask); + return $form->toHTML(); + } + + /** + * getGroups + * + * get a list of groups where user is member of + * + * @parm $id int local user ID + * @return array + */ + function getGroups($id) + { + return array( + 'rows' => $this->gb->listGroup($id), + 'id' => $id, + 'loggedAs' => $this->login, + 'gname' => $this->gb->getSubjName($id), + 'subj' => $this->gb->getSubjects() + ); + } + + + /** + * getSubj2GroupForm + * + * creates a form to assign groups to a user + * + * @param $id int local user ID + * + * @return string (html) + */ + function getSubj2GroupForm($id) + { + $g = $this->getGroups($id); + foreach($g['subj'] as $s) { + $this->logins[($s['login'])]=$s['login']; + } + + $form = new HTML_QuickForm('addSubj2Group', UI_STANDARD_FORM_METHOD, UI_HANDLER); + $form->setConstants(array('act'=>'addSubj2Group', + 'reid'=>$g['id'], + 'gname'=>$g['gname'])); + $form->addElement('hidden', 'act'); + $form->addElement('hidden', 'reid'); + $form->addElement('hidden', 'gname'); + $s =& $form->createElement('select', 'login', 'Add Group: '); + $s->loadArray($this->logins, NULL); + $form->addElement($s); + $form->addElement('submit', NULL, $this->tra('Do')); + + return $form->toHTML(); + } + + /** + * getPermissions + * + * get permissions for local object ID + * + * @param $id int local ID (file/folder) + * + * @return array + */ + function getPermissions($id) + { + return array('pathdata' => $this->gb->getPath($id), + 'perms' => $this->gb->getObjPerms($id), + 'actions' => $this->gb->getAllowedActions($this->gb->getObjType($id)), + 'subjects' => $this->gb->getSubjects(), + 'id' => $id, + 'loggedAs' => $this->login + ); + } + + + /** + * getSearchForm + * + * create a form for searching in StorageServer + * + * @param int local ID of start-directory + * + * @return string (html) + */ + function getSearchForm($id, &$formdata, &$mask) + { + $rowsBegin = ($formdata['counter'] ? $formdata['counter']-1 : UI_SEARCH_MIN_ROWS); + $form = new HTML_QuickForm('search', UI_STANDARD_FORM_METHOD, UI_BROWSER); + $form->setConstants(array('id'=>$id, 'counter'=>$rowsBegin+1)); + + foreach ($mask['mData']['tabs']['group']['group'] as $k=>$v) { + foreach ($mask['mData']['pages'][$v] as $val){ + $options[$val['element']] = $val['element']; + }; + }; + + for($n=1; $n<=UI_SEARCH_MAX_ROWS; $n++) { + $advRow = array( + array( + 'element' => 's1', + 'type' => 'static', + 'text' => "
" + ), + $n>$rowsBegin ? array( + 'element' => 's1_style', + 'type' => 'static', + 'text' => "" + ) : NULL, + array( + 'element' => 'searchBy['.$n.']', + 'type' => 'select', + 'label' => 'Search by', + 'groupit' => TRUE, + 'options' => $options, + ), + array( + 'element' => 'relation['.$n.']', + 'type' => 'select', + 'groupit' => TRUE, + 'options' => $mask['searchform.relations'], + 'selected' => '=', + ), + array( + 'element' => 'criteria['.$n.']', + 'type' => 'text', + 'groupit' => TRUE + ), + array( + 'group' => array('searchBy['.$n.']', 'relation['.$n.']', 'criteria['.$n.']'), + 'name' => NULL, + 'label' => NULL, + 'seperator' => '  ', + 'appendName'=> NULL + ), + $n>$rowsBegin ? array( + 'element' => 's2', + 'type' => 'static', + 'text' => "
" + ) : NULL, + ); + $this->_parseArr2Form($form, $advRow); + } + + + + $this->_parseArr2Form($form, $mask['searchform']); + $form->validate(); + + $renderer =& new HTML_QuickForm_Renderer_Array(true, true); + $form->accept($renderer); + $output['dynform'] = $renderer->toArray(); + #print_r($output); + return $output; + } + + + /** + * getSearchRes + * + * get Search Result + * + * @param $id int local ID (file/folder) to search in + * @param $serach string + * @return array + */ + function getSearchRes($id, &$formdata) + { + foreach ($formdata['criteria'] as $key=>$val) { + if (strlen($val)) { + $critArr[] = array('cat' => $formdata['searchBy'][$key], + 'op' => $formdata['relation'][$key], + 'val' => $val + ); + } + } + $searchCriteria = array('filetype' => 'audioclip', + 'operator' => 'or', + 'conditions'=> $critArr + ); + + $results = $this->gb->localSearch($searchCriteria, $this->sessid); + foreach ($results['results'] as $rec) { + $res[] = array('gunid' => $rec, + 'par_id' => $this->gb->_idFromGunid($rec)); + } + + return array('search' => $res, + 'id' => $id + ); + + } + + /** + * getFile + * + * Call access method and show access path. + * Example only - not really useable. + * TODO: resource should be released by release method call + * + * @param id int, local id of accessed file + */ + function getFile($id) + { + $r = $this->gb->access($id, $this->sessid); + if(PEAR::isError($r)) $_SESSION['alertMsg'] = $r->getMessage(); + else print_r($r); + } + + /** + * getMdata + * + * Show file's metadata as XML + * + * @param id int, local id of stored file + * @return array + */ + function getMdata($id) + { + return($this->gb->getMdata($id, $this->sessid)); + } + + + /** + * getMdataValue + * + * Get Files Metadata Record + * + * @param id int, local id of stored file + * @param cetagory string, metadata element name + * @return array + */ + function _getMdataValue($id, $category) + { + return($this->gb->getMdataValue($id, $category, $this->sessid)); + } + + + /** + * getMetaDataForm + * + * create a form to edit Metadata + * + * @param id int + * @return string (html) + */ + function getMetadataForm($id, &$mask, $get=FALSE, $data=NULL) + { + $form = new HTML_QuickForm('tabs', UI_STANDARD_FORM_METHOD, UI_BROWSER); + $this->_parseArr2Form($form, $mask['tabs']); + $output['tabs'] = $form->toHTML(); + $form = new HTML_QuickForm('langswitch', UI_STANDARD_FORM_METHOD, UI_BROWSER); + $this->_parseArr2Form($form, $mask['langswitch']); + $output['langswitch'] = $form->toHTML(); + /* + ## multiple forms + $parts = array ('Main', 'Music_Basic', 'Music_Advanced', 'Talk_Basic', 'Talk_Advanced'); + foreach ($parts as $key) { + unset ($form); + $form = new HTML_QuickForm($key, UI_STANDARD_FORM_METHOD, UI_BROWSER); + $this->_parseArr2Form($form, $mask['pages'][$key]); + $this->_parseArr2Form($form, $mask['basics']); + $output['pages'][$key] = $form->toHTML(); + } */ + + ## single form + $form = new HTML_QuickForm('metadata', UI_STANDARD_FORM_METHOD, UI_HANDLER); + $this->_parseArr2Form($form, $mask['basics']); + $form->setConstants( array('id' => $id, + #!!!!!'langid' => array_pop($this->gb->getMDataValue($id, 'langid', $this->sessid)) + 'langid' => 'en' + ) + ); + + ## convert element names to be unique over different forms-parts, add javascript to spread values over parts, add existing values from database + foreach ($mask['tabs']['group']['group'] as $key) { + foreach ($mask['pages'][$key] as $k=>$v) { + $mask['pages'][$key][$k]['element'] = $key.'-'.$v['element']; + $mask['pages'][$key][$k]['attributes'] = array ('onChange' => "spread(this, '".$v['element']."')"); + + ## recive data from GreenBox + if ($get) { + $mask['pages'][$key][$k]['default'] = array_pop($this->gb->getMDataValue($id, strtr($v['element'], '_', '.'), $this->sessid)); + } + + ## get data from parameter + if (is_array($data)) { + $mask['pages'][$key][$k]['default'] = $data[strtr($v['element'], '_', '.')]; + } + } + #$form->addElement('html', "
"); + $form->addElement('static', NULL, NULL, "
"); + $this->_parseArr2Form($form, $mask['pages'][$key]); + $this->_parseArr2Form($form, $mask['buttons']); + #$form->addElement('html', "
"); + $form->addElement('static', NULL, NULL, "
"); + } + /* + $renderer = new HTML_QuickForm_Renderer_Default; + $renderer->setFormTemplate("\n\n
\n{content}\n
\n"); + #$renderer->setElementTemplate("\n\t
*{label}{error}
\t
{element}
\n\t"); + $renderer->setElementTemplate("\n\t
*{label}{error}
\t
{element}
\n\t"); + $form->accept($renderer); + $output['pages'][] = $renderer->toHTML(); + */ + + ## using Dynamic Smarty Renderer + $renderer =& new HTML_QuickForm_Renderer_Array(true, true); + $form->accept($renderer); + $output['pages'][] = $renderer->toArray(); + #print_r($output); + + return $output; + } + + + + function systemPrefs(&$mask) + { + $form = new HTML_QuickForm('systemPrefs', UI_STANDARD_FORM_METHOD, UI_HANDLER); + + foreach($mask as $key=>$val) { + $p = $this->gb->loadGroupPref($this->sessid, 'StationPrefs', $val['element']); + if (is_string($p)) $mask[$key]['default'] = $p; + }; + + $this->_parseArr2Form($form, $mask); + + ## using Dynamic Smarty Renderer + $renderer =& new HTML_QuickForm_Renderer_Array(true, true); + $form->accept($renderer); + + return $renderer->toArray(); + } +} +?> \ No newline at end of file diff --git a/livesupport/modules/htmlUI/var/ui_browser_init.php b/livesupport/modules/htmlUI/var/ui_browser_init.php new file mode 100644 index 000000000..80a732499 --- /dev/null +++ b/livesupport/modules/htmlUI/var/ui_browser_init.php @@ -0,0 +1,44 @@ +assign('alertMsg', $uiBrowser->alertMsg()); +$Smarty->assign('GLOBALS', array_merge($GLOBALS, array('id' => &$uiBrowser->id))); ## ??? really all GLOBALS ??? ## +$Smarty->assign('user', array('sessid' => &$uiBrowser->sessid, + 'userid' => &$uiBrowser->userid, + 'login' => &$uiBrowser->login + ) + ); +## retransfer incomplete formdata from SESSION to POST-data +if(is_array($_SESSION['retransferFormData'])){ + foreach($_SESSION['retransferFormData'] as $k=>$v){ + $_POST[$k] = $v; + } + unset($_SESSION['retransferFormData']); +} +?> diff --git a/livesupport/modules/htmlUI/var/ui_fmask.inc.php b/livesupport/modules/htmlUI/var/ui_fmask.inc.php new file mode 100644 index 000000000..201667a42 --- /dev/null +++ b/livesupport/modules/htmlUI/var/ui_fmask.inc.php @@ -0,0 +1,744 @@ + array( + array( + 'element' => 'act', + 'type' => 'hidden', + 'constant' => 'systemPrefs' + ), + array( + 'element' => 'basics', + 'type' => 'header', + 'label' => 'Basic Settings', + ), + array( + 'element' => 'maxfilesize', + 'type' => 'text', + 'label' => 'Maximum File Size for Upload', + 'required' => TRUE + ), + array( + 'rule' => 'numeric', + 'element' => 'maxfilesize', + ), + array( + 'rule' => 'nopunctuation', + 'element' => 'maxfilesize', + ), + array( + 'element' => 'frequency', + 'type' => 'text', + 'label' => 'Frequency', + 'required' => TRUE + ), + array( + 'element' => 'stationName', + 'type' => 'text', + 'label' => 'Staion Name', + 'required' => TRUE + ), + array( + 'element' => 'stationLogoPath', + 'type' => 'text', + 'label' => 'Station Logo path' + ), + array( + 'element' => 'stationURL', + 'type' => 'text', + 'label' => 'Station URL', + 'default' => 'http://' + ), + array( + 'rule' => 'regex', + 'element' => 'stationURL', + 'format' => '/^[0-9]{5}$/', + 'rulemsg' => 'URL seems not to be valid' + ), + array( + 'element' => 'upload', + 'type' => 'header', + 'label' => 'Upload' + ), + array( + 'element' => 'stationlogo', + 'type' => 'file', + 'label' => 'Station Logo' + ), + array( + 'element' =>'Submit', + 'type' =>'submit', + 'label' =>'Submit' + ) + ), + + /* =========================================================== Matadata-Mask */ + 'mData' => array( + 'basics' => array( + array( + 'element' => 'act', + 'type' => 'hidden', + 'constant'=> 'editMetaDataValues' + ), + array( + 'element' => 'id', + 'type' => 'hidden' + ), + array( + 'element' => 'langid', + 'type' => 'hidden' + ), + ), + 'buttons' => array ( + array( + 'element' =>'reset', + 'type' =>'reset', + 'label' =>'Reset', + 'groupit' => TRUE, + ), + array( + 'element' =>'button', + 'type' =>'button', + 'label' =>'Submit', + 'groupit' => TRUE, + 'attributes'=> array( + 'onClick' => 'return switchMDataLang();' + ), + ), + array( + 'group' => array('reset', 'button'), + ) + ), + 'tabs' => array( + array( + 'element' => 'Main', + 'type' => 'button', + 'label' => 'Main', + 'groupit' => TRUE, + 'attributes' => array('onClick' => 'showMain()') + ), + array( + 'element' => 'Music_Basic', + 'type' => 'button', + 'label' => 'Music_Basic', + 'groupit' => TRUE, + 'attributes' => array('onClick' => 'showMusic_Basic()') + ), + array( + 'element' => 'Music_Advanced', + 'type' => 'button', + 'label' => 'Music_Advanced', + 'groupit' => TRUE, + 'attributes' => array('onClick' => 'showMusic_Advanced()') + ), + array( + 'element' => 'Talk_Basic', + 'type' => 'button', + 'label' => 'Talk_Basic', + 'groupit' => TRUE, + 'attributes' => array('onClick' => 'showTalk_Basic()') + ), + array( + 'element' => 'Talk_Advanced', + 'type' => 'button', + 'label' => 'Talk_Advanced', + 'groupit' => TRUE, + 'attributes' => array('onClick' => 'showTalk_Advanced()') + ), + 'group' => array( + 'group' => array('Main', 'Music_Basic', 'Music_Advanced', 'Talk_Basic', 'Talk_Advanced'), + ) + + ), + 'langswitch' => array( + array( + 'element' => 'langid', + 'type' => 'select', + 'label' => 'Language', + 'options' => array( + 'en' => 'English', + 'cz' => 'Czech', + 'de' => 'German', + 'hu' => 'Hungarian', + ), + 'attributes'=> array('onChange' => 'return switchMDataLang()') + ) + ), + 'pages' => array( + 'Main' => array( + array( + 'element' => 'Title', + 'type' => 'text', + 'label' => 'Title', + 'required'=> TRUE, + ), + array( + 'element' => 'Creator', + 'type' => 'text', + 'label' => 'Creator', + 'required'=> TRUE, + ), + array( + 'element' => 'Type_Genre', + 'type' => 'text', + 'label' => 'Type_Genre', + 'required'=> TRUE, + ), + array( + 'element' => 'Format', + 'type' => 'select', + 'label' => 'Format', + 'required'=> TRUE, + 'options' => array( + 'File' => 'File', + 'live stream' => 'Live Stream', + 'networked file'=> 'Networked File', + 'audio/mpeg' => 'audio/mpeg' + ) + ), + array( + 'element' => 'Format_Extent', + 'type' => 'text', + 'label' => 'Format_Extent', + 'required'=> TRUE, + ), + ), + 'Music_Basic' => array( + array( + 'element' => 'Title', + 'type' => 'text', + 'label' => 'Title', + ), + array( + 'element' => 'Creator', + 'type' => 'text', + 'label' => 'Creator', + ), + array( + 'element' => 'Source_Album', + 'type' => 'text', + 'label' => 'Source_Album', + ), + array( + 'element' => 'Source_Year', + 'type' => 'date', + 'label' => 'Source_Year', + 'options' => array( + 'language' => 'en', + 'format' => 'dMY', + 'addEmptyOption'=> TRUE, + 'minYear' => 1900 + ) + ), + array( + 'element' => 'Type_Genre', + 'type' => 'text', + 'label' => 'Type_Genre', + ), + array( + 'element' => 'Description', + 'type' => 'textarea', + 'label' => 'Description', + ), + array( + 'element' => 'Format', + 'type' => 'select', + 'label' => 'Format', + 'options' => array( + 'File' => 'File', + 'live stream' => 'Live Stream', + 'networked file'=> 'Networked File', + 'audio/mpeg' => 'audio/mpeg' + ) + ), + array( + 'element' => 'Type_BPM', + 'type' => 'text', + 'label' => 'Type_BPM', + 'rule' => 'numeric', + ), + array( + 'element' => 'Description_Rating', + 'type' => 'text', + 'label' => 'Description_Rating', + 'rule' => 'numeric', + ), + array( + 'element' => 'Format_Extent', + 'type' => 'text', + 'label' => 'Format_Extent', + ), + ), + 'Music_Advanced'=> array( + array( + 'element' => 'Creator_Role_Encoder', + 'type' => 'text', + 'label' => 'Creator_Role_Encoder', + ), + array( + 'element' => 'Source_Album_TrackNumber', + 'type' => '', + 'label' => 'Source_Album_TrackNumber', + 'rule' => 'numeric', + ), + array( + 'element' => 'Source_Album_DiscNumber', + 'type' => 'text', + 'label' => 'Source_Album_DiscNumber', + 'rule' => 'numeric', + ), + array( + 'element' => 'Description_Mood', + 'type' => 'text', + 'label' => 'Description_Mood', + ), + array( + 'element' => 'Publisher', + 'type' => 'text', + 'label' => 'Publisher', + ), + array( + 'element' => 'Creator_Role_Composer', + 'type' => 'text', + 'label' => 'Creator_Role_Composer', + ), + array( + 'element' => 'Format_Medium_Bitrate', + 'type' => 'text', + 'label' => 'Format_Medium_Bitrate', + 'rule' => 'numeric' + ), + array( + 'element' => 'Format_Medium_Channels', + 'type' => 'select', + 'label' => 'Format_Medium_Channels', + 'options' => array( + 'mono' => 'Mono', + 'stereo' => 'Stereo', + '5.1' => '5.1' + ) + ), + array( + 'element' => 'Format_Medium_Samplerate', + 'type' => 'text', + 'label' => 'Format_Medium_Samplerate', + 'rule' => 'numeric' + ), + array( + 'element' => 'Format_Medium_Encoder', + 'type' => 'text', + 'label' => 'Format_Medium_Encoder', + ), + array( + 'element' => 'Format_CRC', + 'type' => 'text', + 'label' => 'Format_CRC', + 'rule' => 'numeric' + ), + array( + 'element' => 'Description_Lyrics', + 'type' => 'textarea', + 'label' => 'Description_Lyrics', + ), + array( + 'element' => 'Creator_Role_Orchestra', + 'type' => 'text', + 'label' => 'Creator_Role_Orchestra', + ), + array( + 'element' => 'Creator_Role_Conductor', + 'type' => 'text', + 'label' => 'Creator_Role_Conductor', + ), + array( + 'element' => 'Creator_Role_Lyricist', + 'type' => 'text', + 'label' => 'Creator_Role_Lyricist', + ), + array( + 'element' => 'Creator_Role_OriginalLyricist', + 'type' => 'text', + 'label' => 'Creator_Role_OriginalLyricist', + ), + array( + 'element' => 'Creator_Role_RadioStationName', + 'type' => 'text', + 'label' => 'Creator_Role_RadioStationName', + ), + array( + 'element' => 'Description_AudioFileInfoURL', + 'type' => 'text', + 'label' => 'Description_AudioFileInfoURL', + ), + array( + 'element' => 'Description_ArtistURL', + 'type' => 'text', + 'label' => 'Description_ArtistURL', + ), + array( + 'element' => 'Description_AudioSourceURL', + 'type' => 'text', + 'label' => 'Description_AudioSourceURL', + ), + array( + 'element' => 'Description_RadioStationURL', + 'type' => 'text', + 'label' => 'Description_RadioStationURL', + ), + array( + 'element' => 'Description_BuyCDURL', + 'type' => 'text', + 'label' => 'Description_BuyCDURL', + ), + array( + 'element' => 'Identifier_ISRCNumber', + 'type' => 'text', + 'label' => 'Identifier_ISRCNumber', + 'rule' => 'numeric' + ), + array( + 'element' => 'Identifier_CatalogNumber', + 'type' => 'text', + 'label' => 'Identifier_CatalogNumber', + 'rule' => 'numeric' + ), + array( + 'element' => 'Creator_Role_OriginalArtist', + 'type' => 'text', + 'label' => 'Creator_Role_OriginalArtist', + ), + array( + 'element' => 'Rights_Copyright', + 'type' => 'text', + 'label' => 'Rights_Copyright', + ), + ), + 'Talk_Basic' => array( + array( + 'element' => 'Title', + 'type' => 'text', + 'label' => 'Title', + ), + array( + 'element' => 'Coverage', + 'type' => 'text', + 'label' => 'Coverage', + ), + array( + 'element' => 'Description', + 'type' => 'textarea', + 'label' => 'Description', + ), + array( + 'element' => 'Creator', + 'type' => 'text', + 'label' => 'Creator', + ), + array( + 'element' => 'Subject', + 'type' => 'text', + 'label' => 'Subject', + ), + array( + 'element' => 'Type_Genre', + 'type' => 'text', + 'label' => 'Type_Genre', + ), + array( + 'element' => 'Format', + 'type' => 'select', + 'label' => 'Format', + 'options' => array( + 'File' => 'File', + 'live stream' => 'Live Stream', + 'networked file'=> 'Networked File', + 'audio/mpeg' => 'audio/mpeg' + ) + ), + ), + 'Talk_Advanced' => array( + array( + 'element' => 'Contributor', + 'type' => 'text', + 'label' => 'Contributor', + ), + array( + 'element' => 'Language', + 'type' => 'text', + 'label' => 'Language', + ), + array( + 'element' => 'Rights', + 'type' => 'text', + 'label' => 'Rights', + ), + ) + ) + ), + + 'chgPasswd' => array( + array( + 'element' => 'act', + 'type' => 'hidden', + ), + array( + 'element' => 'uid', + 'type' => 'hidden', + ), + array( + 'element' => 'oldpass', + 'type' => 'password', + 'label' => 'Old Password', + 'required' => TRUE, + ), + array( + 'element' => 'pass', + 'type' => 'password', + 'label' => 'New Password', + 'required' => TRUE, + ), + array( + 'element' => 'pass2', + 'type' => 'password', + 'label' => 'Retype Password', + 'required' => TRUE, + ), + array( + 'rule' => 'compare', + 'element' => array('pass','pass2'), + 'rulemsg' => 'The Passwords do not match' + ), + array( + 'element' =>'Submit', + 'type' =>'submit', + 'label' =>'Submit' + ) + + ), + + 'addUser' => array( + array( + 'element' => 'act', + 'type' => 'hidden', + 'constant' => 'addUser' + ), + array( + 'element' => 'login', + 'type' => 'text', + 'label' => 'Username', + 'required' => TRUE + ), + array( + 'element' =>'pass', + 'type' =>'password', + 'label' =>'Users Password', + 'required' =>TRUE + ), + array( + 'element' =>'pass2', + 'type' =>'password', + 'label' =>'Repeat Password', + 'required' =>TRUE + ), + array( + 'rule' =>'compare', + 'element' =>array('pass','pass2'), + 'rulemsg' =>'The Passwords do not match' + ), + array( + 'element' =>'Submit', + 'type' =>'submit', + 'label' =>'Submit' + ) + ), + + 'addGroup' => array( + array( + 'element' => 'act', + 'type' => 'hidden', + 'constant' => 'addGroup' + ), + array( + 'element' => 'login', + 'type' => 'text', + 'label' => 'Group Name', + 'required' => TRUE + ), + array( + 'element' =>'Submit', + 'type' =>'submit', + 'label' =>'Submit' + ) + ), + + 'loginform' => array( + array( + 'element' => 'act', + 'type' => 'hidden', + 'constant' => 'login' + ), + array( + 'element' => 'login', + 'type' => 'text', + 'label' => 'Username', + 'required' => TRUE + ), + array( + 'element' => 'pass', + 'type' => 'password', + 'label' => 'Password', + 'required' => TRUE + ), + array( + 'element' => 'Submit', + 'type' => 'submit', + 'label' => 'Submit' + ), + array( + 'element' => 'cancel', + 'type' => 'button', + 'label' => 'Cancel', + 'attributes'=> array('onClick' => 'window.close()') + ) + ), + + 'upload' => array( + array( + 'element' => 'act', + 'type' => 'hidden', + 'constant' => 'upload' + ), + array( + 'element' => 'id', + 'type' => 'hidden' + ), + array( + 'element' => 'mediafile', + 'type' => 'file', + 'label' => 'Mediafile', + 'required' => TRUE, + 'requiredmsg'=> 'please select Media file' + ), + array( + 'element' => 'new_filename', + 'type' => 'text', + 'label' => 'New Filename' + ), + array( + 'element' => 'mdatafile', + 'type' => 'file', + 'label' => 'Metadata', + 'required' => TRUE, + 'requiredmsg'=> 'please select Metadata file' + ), + array( + 'element' => 'Submit', + 'type' => 'submit', + 'label' => 'Submit' + ) + ), + + 'upload_1' => array( + array( + 'element' => 'act', + 'type' => 'hidden', + 'constant' => 'upload_1' + ), + array( + 'element' => 'id', + 'type' => 'hidden' + ), + array( + 'element' => 'mediafile', + 'type' => 'file', + 'label' => 'Mediafile', + 'required' => TRUE, + 'requiredmsg'=> 'please select Media file' + ), + array( + 'element' => 'new_filename', + 'type' => 'text', + 'label' => 'New Filename' + ), + array( + 'element' => 'Submit', + 'type' => 'submit', + 'label' => 'Submit' + ) + ), + + 'searchform' => array( + array( + 'element' => 'act', + 'type' => 'hidden', + 'constant' => 'search' + ), + array( + 'element' => 'id', + 'type' => 'hidden' + ), + array( + 'element' => 'counter', + 'type' => 'hidden' + ), + array( + 'element' => 'addRow', + 'type' => 'button', + 'label' => 'One more Row', + 'attributes' => array('onClick' => 'showSearchRow()'), + 'groupit' => TRUE, + ), + array( + 'element' => 'JS', + 'type' => 'static', + 'text' => "", + ), + array( + 'element' => 'doSearch', + 'type' => 'submit', + 'label' => 'Submit', + 'groupit' => TRUE, + ), + array('group' => array('addRow', 'doSearch') + ), + ), + 'searchform.relations' => + array( + 'full' => 'full', + 'partial' => 'partial', + 'prefix' => 'prefix', + '=' => '=' , + '<' => '<', + '<=' => '<=', + '>' => '>', + '>=' => '>=' + ), + 'languages' => array( + array( + 'element' => 'langid', + 'type' => 'select', + 'label' => 'Language', + 'options' => array( + 'en' => 'English', + 'cz' => 'Czech', + 'de' => 'German', + 'hu' => 'Hungarian', + ) + ) + ) +); diff --git a/livesupport/modules/htmlUI/var/ui_handler.class.php b/livesupport/modules/htmlUI/var/ui_handler.class.php new file mode 100644 index 000000000..aa3809567 --- /dev/null +++ b/livesupport/modules/htmlUI/var/ui_handler.class.php @@ -0,0 +1,517 @@ +setFetchMode(DB_FETCHMODE_ASSOC); + $this->gb =& new GreenBox(&$dbc, $config); + $this->id = (!$_REQUEST['id'] ? $this->gb->storId : $_REQUEST['id']); + $this->sessid = $_REQUEST[$config['authCookieName']]; + $this->userid = $this->gb->getSessUserId($this->sessid); + $this->login = $this->gb->getSessLogin ($this->sessid); + $this->config = $config; + } + + // --- authentication --- + /** + * login + * + * Login to the storageServer. + * It set sessid to the cookie with name defined in ../conf.php + * + * @param login string, username + * @param pass string, password + */ + function login(&$formdata, &$mask) + { + if ($this->_validateForm($formdata, $mask)) { + $sessid = $this->gb->login($formdata['login'], $formdata['pass']); + if($sessid && !PEAR::isError($sessid)){ + setcookie($this->config['authCookieName'], $sessid); + + $fid = $this->gb->getObjId($formdata['login'], $this->gb->storId); + if(!PEAR::isError($fid)) $this->redirUrl = UI_BROWSER.'?popup[]=_reload_parent&popup[]=_close'; + }else{ + $this->alertMsg = 'Login failed.'; + $_SESSION['retransferFormData']['login']=$formdata['login']; + $this->redirUrl = UI_BROWSER.'?popup[]=login'; + } + } + + } + + /** + * logout + * + * Logut from storageServer, takes sessid from cookie + * + * @param $trigger_login boolean, trigger login popup after logout + * + */ + function logout($trigger_login = FALSE) + { + $this->gb->logout($this->sessid); + setcookie($this->config['authCookieName'], ''); + + if ($trigger_login) + $this->redirUrl = UI_BROWSER.'?popup[]=_reload_parent&popup[]=login'; + else $this->redirUrl = UI_BROWSER.'?popup[]=_reload_parent&popup[]=_close'; + } + + // --- files --- + /** + * upload + * + * Provides file upload and store it to the storage + * + * @param filename string, name for the uploaded file + * @param mediafile file uploded by HTTP, raw binary media file + * @param mdatafile file uploded by HTTP, metadata XML file + * @param id int, destination folder id + */ + function upload(&$formdata, $id, &$mask) + { + if ($this->_validateForm($formdata, $mask)) { + $tmpgunid = md5( + microtime().$_SERVER['SERVER_ADDR'].rand()."org.mdlf.livesupport" + ); + $ntmp = $this->gb->bufferDir.'/'.$tmpgunid; + # $ntmp = tempnam(""{$gb->bufferDir}", 'gbTmp_'); + $mdtmp = ""; + move_uploaded_file($formdata['mediafile']['tmp_name'], $ntmp); + chmod($ntmp, 0664); + if($formdata['mdatafile']['tmp_name']){ + $mdtmp = "$ntmp.xml"; + if(move_uploaded_file($formdata['mdatafile']['tmp_name'], $mdtmp)){ + chmod($mdtmp, 0664); + } + } + $r = $this->gb->putFile($id, $formdata['new_filename'] ? $formdata['new_filename'] : $formdata['mediafile']['name'], $ntmp, $mdtmp, $this->sessid); + if(PEAR::isError($r)) $this->alertMsg = $r->getMessage(); + else{ + # $gb->updateMetadataDB($gb->_pathFromId($r), $mdata, $sessid); + @unlink($ntmp); + @unlink($mdtmp); + } + $this->redirUrl = UI_BROWSER."?id=".$id; + } else { + $this->redirUrl = UI_BROWSER."?act=newfile&id=".$id; + } + } + + + /** + * upload_1 + * + * Provides file upload and store it to the storage + * + * @param formdata array, submitted text and file + * @param id int, destination folder id + */ + function upload_1(&$formdata, $id, &$mask) + { + if ($this->_validateForm($formdata, $mask)) { + $tmpgunid = md5( + microtime().$_SERVER['SERVER_ADDR'].rand()."org.mdlf.livesupport" + ); + $ntmp = $this->gb->bufferDir.'/'.$tmpgunid; + # $ntmp = tempnam(""{$gb->bufferDir}", 'gbTmp_'); + $mdtmp = ""; + move_uploaded_file($formdata['mediafile']['tmp_name'], $ntmp); + chmod($ntmp, 0664); + + $r = $this->gb->putFile($id, $formdata['new_filename'] ? $formdata['new_filename'] : $formdata['mediafile']['name'], $ntmp, NULL, $this->sessid); + if(PEAR::isError($r)) $this->alertMsg = $r->getMessage(); + else{ + # $gb->updateMetadataDB($gb->_pathFromId($r), $mdata, $sessid); + @unlink($ntmp); + @unlink($mdtmp); + } + + ## extract some metadata with getID3 + $this->gb->replaceMetadata($r, $this->getInfo($r, 'xml'), $mdataLoc = 'string', $this->sessid); + + + $this->redirUrl = UI_BROWSER."?act=editMetaDataValues&id=$r"; + } else { + $this->redirUrl = UI_BROWSER."?act=upload_1&id=$id"; + } + } + + /** + * newFolder + * + * Create new folder in the storage + * + * @param newname string, name for the new folder + * @param id int, destination folder id + */ + function newFolder($newname, $id) + { + $r = $this->gb->createFolder($id, $newname, $this->sessid); + if(PEAR::isError($r)) $this->alertMsg = $r->getMessage(); + $this->redirUrl = UI_BROWSER.'?id='.$id; + } + + /** + * rename + * + * Change the name of file or folder + * + * @param newname string, new name for the file or folder + * @param id int, destination folder id + */ + function rename($newname, $id) + { + $parid = $this->gb->getparent($this->id); + $r = $this->gb->renameFile($id, $newname, $this->sessid); + if(PEAR::isError($r)) $this->alertMsg = $r->getMessage(); + $this->redirUrl = UI_BROWSER."?id=$parid"; + } + + /** + * move + * + * Move file to another folder + * TODO: format of destinantion path should be properly defined + * + * @param newPath string, destination relative path + * @param id int, destination folder id + */ + function move($newPath, $id) + { + $newPath = urlencode($newPath); + $did = $this->gb->getObjIdFromRelPath($id, $newPath); + $parid = $this->gb->getparent($id); + $r = $this->gb->moveFile($id, $did, $this->sessid); + if(PEAR::isError($r)){ + $this->alertMsg = $r->getMessage(); + $this->redirUrl = UI_BROWSER."?id=$parid"; + } + else $this->redirUrl = UI_BROWSER."?id=$did"; + } + + /** + * copy + * + * Copy file to another folder + * TODO: format of destinantion path should be properly defined + * + * @param newPath string, destination relative path + * @param id int, destination folder id + */ + function copy($newPath, $id) + { + $newPath = urldecode($newPath); + $did = $this->gb->getObjIdFromRelPath($id, $newPath); + $parid = $this->gb->getparent($id); + $r = $this->gb->copyFile($id, $did, $this->sessid); + if(PEAR::isError($r)){ + $this->alertMsg = $r->getMessage(); + $this->redirUrl = UI_BROWSER."?id=$parid"; + } + else $this->redirUrl = UI_BROWSER."?id=$did"; + } + + /** + * delete + * + * Delete of stored file + * + * @param id int, local id of deleted file or folder + * @param delOverride int, local id od folder which can deleted if not empty + */ + function delete($id, $delOverride=FALSE) + { + $parid = $this->gb->getparent($id); + + ## add emtyness-test here ### + if (!($delOverride==$id) && (count($this->gb->getObjType($id)=='Folder'? + $this->gb->listFolder($id, $this->sessid):NULL))) { + $this->alertMsg = $this->tra("Folder is not empty. You can override this protection by clicking DEL again"); + $this->redirUrl = UI_BROWSER."?id=$parid&delOverride=$id"; + return; + } + ############################# + + $r = $this->gb->deleteFile($id, $this->sessid); + if(PEAR::isError($r)) $this->alertMsg = $r->getMessage(); + $this->redirUrl = UI_BROWSER."?id=$parid"; + } + + + /** + * getFile + * + * Call access method and show access path. + * Example only - not really useable. + * TODO: resource should be released by release method call + * + * @param id int, local id of accessed file + */ + function getFile($id) + { + $r = $this->gb->access($id, $this->sessid); + if(PEAR::isError($r)) $this->alertMsg = $r->getMessage(); + else echo $r; + } + + /** + * getMdata + * + * Show file's metadata as XML + * + * @param id int, local id of stored file + */ + function getMdata($id) + { + header("Content-type: text/xml"); + $r = $this->gb->getMdata($id, $this->sessid); + print_r($r); + } + + // --- subjs ---- + /** + * addSubj + * + * Create new user or group (empty pass => create group) + * + * @param formdata array('login', 'pass') + */ + function addSubj(&$formdata, &$mask) + { + $this->redirUrl = UI_BROWSER.'?act='.$_REQUEST['act']; + + ## first validate the form data + if ($this->_validateForm($formdata, $mask)) { + if($this->gb->checkPerm($this->userid, 'subjects')){ + $res = $this->gb->addSubj($formdata['login'], ($formdata['pass']=='' ? NULL:$formdata['pass'] )); + $this->alertMsg = $this->tra('Subject "'.$formdata['login'].'" added.'); + } else { + $this->alertMsg = $this->tra('Access denied.'); + return; + } + } + if(PEAR::isError($res)) $this->alertMsg = $res->getMessage(); + } + + /** + * removeSubj + * + * Remove existing user or group + * + * @param login string, login name of removed user + */ + function removeSubj($login) + { + $this->redirUrl = UI_BROWSER.'?act=subjects'; + + if($this->gb->checkPerm($this->userid, 'subjects')){ + $res = $this->gb->removeSubj($login); + }else{ + $this->alertMsg='Access denied.'; + return; + } + if(PEAR::isError($res)) $this->alertMsg = $res->getMessage(); + } + + /** + * passwd + * + * Change password for specified user + * + * @param uid int, local user id + * @param oldpass string, old user password + * @param pass string, new password + * @param pass2 string, retype of new password + */ + function passwd($uid, $oldpass, $pass, $pass2) + { + $this->redirUrl = UI_BROWSER.'?act=subjects'; + $ulogin = $this->gb->getSubjName($uid); + + if($this->userid != $uid && + ! $this->gb->checkPerm($this->userid, 'subjects')){ + $this->alertMsg='Access denied..'; + return; + } + if(FALSE === $this->gb->authenticate($ulogin, $oldpass)){ + $this->alertMsg='Wrong old pasword.'; + return; + } + if($pass !== $pass2){ + $this->alertMsg = "Passwords do not match. ". + "($pass/$pass2)"; + $this->redirUrl = UI_BROWSER.'?act=subjects'; + return; + } + $this->gb->passwd($ulogin, $oldpass, $pass); + } + + // --- perms --- + /** + * addPerm + * + * Add new permission record + * + * @param subj int, local user/group id + * @param permAction string, type of action from set predefined in conf.php + * @param id int, local id of file/object + * @param allowDeny char, A or D + */ + function addPerm($subj, $permAction, $id, $allowDeny) + { + if($this->gb->checkPerm($this->userid, 'editPerms', $id)){ + $this->gb->addPerm($subj, $permAction, + $id, $allowDeny); + }else{ + $this->alertMsg='Access denied.'; + } + $this->redirUrl = UI_BROWSER.'?id='.$id.'&act=permissions'; + } + + /** + * removePerm + * + * Remove permission record + * + * @param permid int, local id of permission record + * @param oid int, local id of object to handle + */ + function removePerm($permid, $oid) + { + if($this->gb->checkPerm($this->userid, 'editPerms', $oid)) + $this->gb->removePerm($permid); + else $this->alertMsg='Access denied.'; + $this->redirUrl = UI_BROWSER.'?act=permissions&id='.$oid; + } + + + /** + * addSubj2Group + * + * Add {login} and direct/indirect members to {gname} and to groups, + * where {gname} is [in]direct member + * + * @param login string + * @param gname string + * @param reid string, local id of managed group, just needed for redirect + */ + function addSubj2Group($login, $gname, $reid) + { + if($this->gb->checkPerm($this->userid, 'subjects')){ + $res = $this->gb->addSubj2Gr($login, $gname); + }else{ + $this->alertMsg='Access denied.'; + return; + } + if(PEAR::isError($res)) $this->alertMsg = $res->getMessage(); + + $this->redirUrl = UI_BROWSER.'?act=groups&id='.$reid; + } + + /** + * Remove subject from group + * + * @param login string + * @param gname string + * @param reid string, local id of managed group, just needed for redirect + */ + function removeSubjFromGr($login, $gname, $reid) + { + if($this->gb->checkPerm($this->userid, 'subjects')){ + $res = $this->gb->removeSubjFromGr($login, $gname); + }else{ + $this->alertMsg='Access denied.'; + return; + } + if(PEAR::isError($res)) $this->alertMsg = $res->getMessage(); + + $this->redirUrl = UI_BROWSER.'?act=groups&id='.$reid; + } + + + function storeMetaData(&$formdata, &$mask) + { + $this->redirUrl = UI_BROWSER.'?act=editMetaDataValues&id='.$formdata['id']; + foreach ($mask['tabs']['group']['group'] as $key) { + foreach ($mask['pages'][$key] as $k=>$v) { + $formdata[$key.'-'.$v['element']] ? $mData[strtr($v['element'], '_', '.')] = $formdata[$key.'-'.$v['element']] : NULL; + } + } + + $this->_dateArr2Str(&$mData); + + foreach ($mData as $key=>$val) { + #$this->gb->setMDataValue($formdata['id'], $key, $val, $this->sessid) + } + + $this->alertMsg = $this->tra('Metadata saved'); + } + + + function _validateForm(&$formdata, &$mask) + { + $form = new HTML_QuickForm('validation', UI_STANDARD_FORM_METHOD, UI_HANDLER); + $this->_parseArr2Form($form, $mask, 'server'); + if (!$form->validate()) { + $_SESSION['retransferFormData'] = $formdata; + return FALSE; + } + ## test for uploadet files bacause HTMLQuickForm::validate() ignores them #### + foreach($mask as $k) { + if ($k['type']=='file' && $k['required']==TRUE) { + if ($formdata[$k['element']]['error']) { + $_SESSION['retransferFormData'] = $formdata; + return FALSE; + } + } + } + reset($mask); + return TRUE; + } + + + function storeSystemPrefs(&$formdata, &$mask) + { + $this->redirUrl = UI_BROWSER.'?act=systemPrefs'; + + ## first validate the form data + if ($this->_validateForm($formdata, $mask)) { + + foreach($mask as $key=>$val) { + if ($this->_isTextInput ($val['type'], $mask)) $this->gb->saveGroupPref($this->sessid, 'StationPrefs', $val['element'], $formdata[$val['element']]); + if ($val['type'] == 'file' && $formdata[$val['element']]['name']) { + if (FALSE === @move_uploaded_file($formdata[$val['element']]['tmp_name'], $this->gb->loadGroupPref($this->sessid, 'StationPrefs', 'stationLogoPath'))) + $this->alertMsg = $this->tra('Error uploading Logo'); + return; + } + } + + $this->alertMsg = $this->tra('Settings saved'); + return; + } + $this->alertMsg = $this->tra('Error saving Settings'); + } + + + function _isTextInput($input) + { + $test = array('text' =>0, 'textarea' =>0, 'select'=>0, 'radio'=>0, 'checkbox'=>0); + if (array_key_exists($input, $test)) + return TRUE; + + return FALSE; + } + +} + +?> \ No newline at end of file diff --git a/livesupport/modules/htmlUI/var/ui_handler_init.php b/livesupport/modules/htmlUI/var/ui_handler_init.php new file mode 100644 index 000000000..2b8a4be61 --- /dev/null +++ b/livesupport/modules/htmlUI/var/ui_handler_init.php @@ -0,0 +1,21 @@ +